Можно ли отменить/остановить загрузку, начатую с помощью DownloadManager? - программирование
Подтвердить что ты не робот

Можно ли отменить/остановить загрузку, начатую с помощью DownloadManager?

Я использую DownloadManager для загрузки кучи файлов в моем приложении. Я не могу понять, как отменить загрузки, которые были установлены в файле downloadManager.

Есть две возможности: а. Пользователь может вручную отменить его, нажав на панели уведомлений. б. Отмените и удалите загрузку с помощью кода.

У меня установлен следующий приемник.

<receiver 
        android:name=".DownloadStatusReceiver"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
            <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED" />
     </intent-filter>
 </receiver> 

И в приемнике

if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) {

    Constants.showLog(TAG, "Notification clicked");
    long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
    DownloadManager dm =(DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);             
    dm.remove(downloadId);

}

Любые идеи?

4b9b3361

Ответ 1

Вы можете отменить скачивание через DownloadManager, вызвав его метод remove(long...). Для этого вам нужен идентификатор загрузки. По моему опыту в основном есть два надежных способа, как их получить:

  • Помните возвращаемое значение метода enqueue(DownloadManager.Request).
  • Запросить DownloadManager для загрузки через метод query(DownloadManager.Query). Затем извлеките идентификаторы из возвращаемого Cursor, они хранятся в столбце с именем DownloadManager.COLUMN_ID.

широковещательный приемник

Из моего опыта, нет надежного получения идентификатора загрузки через BroadcastReceiver для действия android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED (хотя широковещательная передача всегда отправляется).

  • Получение идентификаторов загрузки из дополнительных DownloadManager. EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS не работает должным образом. На некоторых устройствах он всегда возвращает null. Если он возвращает что-то на некоторых устройствах, сначала начинается идентификатор загрузки. И если первая загрузка завершена/отменена, она возвращает null для уведомления о оставшихся загрузках.
  • Получение значения из дополнительного DownloadManager.EXTRA_DOWNLOAD_ID не работает для этого действия.

Получение идентификатора в трансляции для действия android.intent.action.DOWNLOAD_COMPLETE кажется надежным. Вы должны получить его из дополнительного DownloadManager.EXTRA_DOWNLOAD_ID. Обратите внимание, что широковещательная передача отправляется не только для завершенной загрузки, но также отправляется при отмене вызова загрузки remove().

Примечание: Загрузки иногда группируются в одном уведомлении, иногда создают несколько уведомлений. Я не смог определить условия, когда уведомления делают и не группируются. Похоже, что это зависит от многих факторов, таких как версия ОС, устройство, название загрузки,... и вообще кажется довольно непредсказуемым.

Примечание: Я тестировал, можно ли отменить загрузку другого приложения, и это не так. Несмотря на то, что идентификаторы являются идентификаторами базы данных, которые уникальны во всех приложениях. Вызов remove() не отменяет загрузку другого приложения.