- Я использую android.app.DownloadManager для загрузки файлов фрагментом.
- Я сохранил идентификатор загрузки, когда она начинается. и я запрашиваю состояние загрузки при вводе фрагмента, чтобы узнать, загружается ли файл.
Код во фрагменте выглядит следующим образом:
long downloadId = viewModel.getDownloadId(); // the id downloaded last time.
DownloadManager manager = (DownloadManager) getContext().getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
Cursor c = null;
int downloadStatus = -1;
try {
c = manager.query(query);
if (c != null && c.moveToFirst()) {
downloadStatus = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
}
} finally {
if (c != null) {
c.close();
}
}
switch (downloadStatus) {
case DownloadManager.STATUS_SUCCESSFUL:
//do something
break;
case DownloadManager.STATUS_RUNNING:
case DownloadManager.STATUS_PAUSED:
case DownloadManager.STATUS_PENDING:
// register ContentObserver to receive download progress, I query the status in `onChage` methord.
getContext().getContentResolver().registerContentObserver(
Uri.parse("content://downloads/my_downloads"), true, mDownLoadChangeObserver);
break;
default:
//show a button to download
}
//button click listener
button.setOnClickListener(v -> {
long id = manager.enqueue(request);
// save the download id
...
// register ContentObserver to receive download progress, I query the status in `onChage` methord.
getContext().getContentResolver().registerContentObserver(
Uri.parse("content://downloads/my_downloads"), true, mDownLoadChangeObserver);
});
Моя проблема:
Оставайтесь вфрагмент, он работает нормально. Состояние можно запрашивать до тех пор, пока загрузка не будет успешной;
Выйти из фрагмента, загрузка все еще работает нормально;
Но если я введу фрагмент, когда DownloadManager
все еще загружается, он отправляется для запроса статуса загрузки. Запрашиваемый статус правильный - DownloadManager.STATUS_RUNNING
. Но он сразу превращается в DownloadManager.STATUS_FAILED
с COLUMN_REASON 470.
Как это решить?