Как уведомить после завершения загрузки из менеджера загрузки Android

Я использую класс менеджера загрузки Android. Мне нужно написать «Загрузка завершена» после завершения всех загрузок. Я пробовал кое-что, и это работает. Но здесь он пишет после того, как файл за файлом завершен. Мне нужно написать только один раз (После того, как все будет завершено). Я тоже пробовал без курсора. Но мне не удалось добиться.

public class DownloadReceiver extends BroadcastReceiver {


Context context;
@Override
public void onReceive(Context context, Intent intent) {
    long receivedID = intent.getLongExtra(
             DownloadManager.EXTRA_DOWNLOAD_ID, -1L);
             DownloadManager mgr = (DownloadManager)
            context.getSystemService(Context.DOWNLOAD_SERVICE);

    DownloadManager.Query query = new DownloadManager.Query();
    query.setFilterById(receivedID);
    Cursor cur = mgr.query(query);
    int index = cur.getColumnIndex(DownloadManager.COLUMN_STATUS);
    if(cur.) {
        String  filePath = cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_TITLE));
        if(cur.getInt(index) == DownloadManager.STATUS_SUCCESSFUL){
            DatabaseHandler dh = new DatabaseHandler(context);
            dh.addDownloadComplete(new DownloadComplete("Download Complete"));
        }
    }
    cur.close();
}}

person venura    schedule 20.04.2017    source источник
comment
Что вы имеете в виду после завершения всех загрузок? У вас есть набор идентификаторов загрузок, которые вы хотите проверить, завершены ли они, или вы просто хотите проверить, завершена ли каждая загрузка в DownloadManager (независимо от того, исходит она из вашего приложения или нет)?   -  person Merhawi Fissehaye    schedule 20.04.2017
comment
Я загружаю файлы из списка. В приведенном выше примере он проверяет один за другим и пишет «Загрузка завершена» один за другим. Но что мне нужно, так это то, что после загрузки всех файлов мне нужно написать, что загрузка завершена один раз.   -  person venura    schedule 20.04.2017


Ответы (2)


Добавьте проверку перед уведомлением о завершении всех загрузок. как

query.setFilterByStatus(DownloadManager.STATUS_PAUSED |
      DownloadManager.STATUS_PENDING |
      DownloadManager.STATUS_RUNNING);
    Cursor cursor = downloadManager.query(query);
    if (cursor != null && cursor.getCount() > 0) {
      return;
    }else {
      query.setFilterById(receivedID);
      //proceed your...
    }
person Vijay Pal Vishwakarma    schedule 20.04.2017
comment
Проблема с этим решением заключается в том, что могут быть загрузки (приостановленные, ожидающие или запущенные), которые были запущены другими приложениями. Кроме того, он не проверяет, были ли загрузки НЕУДАЧНЫМИ. - person Merhawi Fissehaye; 20.04.2017
comment
Зарегистрируйте приемник ‹receiver android:name=.receiver.DownloadBroadcastReceiver android:exported=true› ‹intent-filter› ‹action android:name=android.intent.action.DOWNLOAD_COMPLETE/› ‹/intent-filter› ‹/receiver› эта работа отлично. для вашего подтверждения загрузите любые файлы другим приложением. - person Vijay Pal Vishwakarma; 20.04.2017

Вот что, я думаю, сработает. Определите функцию следующим образом:

public boolean areAllDownloadsComplete(int[] downloadIds) {

    DownloadManager mgr = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

    DownloadManager.Query query = new DownloadManager.Query();

    for(int i = 0; i < downloadIds.length; i++) {

        query.setFilterById(downloadIds[i]);

        Cursor cur = mgr.query(query);

        if(cur.moveToNext()) {

            if(cur.getInt(cur.getColumnIndex(DownloadManager.COLUMN_STATUS)) != DownloadManager.STATUS_SUCCESSFUL) {

                return false;
            }
        }
    }

    return true;
}

вызовите эту функцию внутри трансляции (при каждом уведомлении о завершении загрузки) следующим образом:

if(areAllDownloadsComplete(THE_DOWNLOAD_IDS)) {
    DatabaseHandler dh = new DatabaseHandler(context);
    dh.addDownloadComplete(new DownloadComplete("Download Complete"));
}

Вы можете передать идентификаторы загрузки своему намерению широковещательного приемника как

Bundle bundle = new Bundle();
bundle.putIntArray("download_ids", THE_DOWNLOAD_IDS);
intent.putExtra(bundle);
person Merhawi Fissehaye    schedule 20.04.2017