Вот как я продолжил следить за загрузкой файла в индикаторе выполнения после Download Manager. На самом деле, я заполняю индикатор выполнения, представленный в моем обзоре утилит, в соответствии с эволюцией менеджера загрузок из панели уведомлений. Я не хотел использовать AsyncTask, вот что он дал.
public void DownLoadFile(Context context , String fileName , String fileExtension, String DestinationDirectory, Uri uri ){
final DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(uri);
assert downloadManager != null;
final long downloadId = downloadManager.enqueue(request);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalFilesDir(context,DestinationDirectory, fileName + fileExtension);
new Thread(new Runnable() {
@Override
public void run() {
boolean downloading = true;
while (downloading) {
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(downloadId);
Cursor cursor = downloadManager.query(q);
cursor.moveToFirst();
int bytes_downloaded = cursor.getInt(cursor
.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
downloading = false;
}
final int dl_progress = (int) ((bytes_downloaded * 100l) / bytes_total);
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
progressBar.setProgress(dl_progress);
//tv.setText(pStatus + "%");
Log.d("DownLoding.." ," pourcent" +dl_progress );
}
});
//Log.d(Constants.MAIN_VIEW_ACTIVITY, statusMessage(cursor));
Log.d("Downloading.." , " compte " + dl_progress+"%") ;
cursor.close();
}
}
}).start();
downloadManager.enqueue(request);
}
private void Download(){
final StorageReference ref2 = storageReference.child("/Audio/").child("new_audio0.mp3");
ref2.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
DownLoadFile(context,"new_audio",".mp3",DIRECTORY_DOWNLOADS, uri);
Log.i("URL_LINK", uri.toString());
Toast.makeText(context, "En cours de télechargement..", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(context, "Le telechargement a échoué", Toast.LENGTH_SHORT).show();
}
});
}
Drawable Circle
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/secondaryProgress">
<shape
android:innerRadiusRatio="6"
android:shape="ring"
android:thicknessRatio="20.0"
android:useLevel="true">
<gradient
android:centerColor="#999999"
android:endColor="#999999"
android:startColor="#999999"
android:type="sweep" />
</shape>
</item>
<item android:id="@android:id/progress">
<rotate
android:fromDegrees="270"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="270">
<shape
android:innerRadiusRatio="6"
android:shape="ring"
android:thicknessRatio="20.0"
android:useLevel="true">
<rotate
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
<gradient
android:centerColor="#00FF00"
android:endColor="#00FF00"
android:startColor="#00FF00"
android:type="sweep" />
</shape>
</rotate>
</item>
</layer-list>
Progressbar xml
<ProgressBar
android:id="@+id/progressBa"
android:layout_width="20dp"
android:layout_height="20dp"
android:visibility="gone"
app:layout_constraintBaseline_toBaselineOf="@id/recordbtn"
android:layout_marginRight="9dp"
app:layout_constraintRight_toLeftOf="@+id/recordbtn"
tools:layout_editor_absoluteY="16dp" />
Затем вызовите метод Download () в onClick.
это не обязательно лучший ответ, но он работает хорошо и избавил меня от использования AsyncTask: D