Android DownloadManager не работает с причиной 470 - PullRequest
1 голос
/ 11 декабря 2019
  • Я использую 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.

Как это решить?

...