2017-04-20 75 views
0

我正在使用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(); 
}} 
+0

所有下载完成后,你的意思是什么?你是否有一组下载ID要检查它们是否完整,或者你只是想检查DownloadManager中的每个下载(无论它是否来自你的应用)是否完成? –

+0

我正在从列表中下载文件。在上面的例子中,它逐个检查,然后写下载逐个完成。但我需要的是,下载完所有文件后,我需要写下载完成一次。 – venura

回答

1

在通知所有下载完成之前添加检查。像

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... 
    } 
+0

此解决方案的问题是可能存在由其他应用程序启动的下载(暂停,挂起或正在运行)。此外它不检查下载是否失败。 –

+0

注册接收机<接收机 机器人:名称= 机器人 “receiver.DownloadBroadcastReceiver。”:导出= “真”> <意图滤波器> <操作机器人:名称= “android.intent.action.DOWNLOAD_COMPLETE”/> 这工作正常。为您的确认下载其他应用程序的任何文件。 –

0

这是我认为会工作。定义一个函数如下:

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")); 
} 

您可以通过下载IDS到您的广播接收器的意图是

Bundle bundle = new Bundle(); 
bundle.putIntArray("download_ids", THE_DOWNLOAD_IDS); 
intent.putExtra(bundle);