4

Есть способ добавить дополнительные объекты в намерение DownloadManager, зарегистрированное для действия DownloadManager.ACTION_DOWNLOAD_COMPLETE (например, получить булевское значение, установленное как дополнительное в намерении)?Комплект для BroadcastReceiver DownloadManager

Это, как я создаю запрос:

DownloadManager.Request req = new DownloadManager.Request(myuri); 
// set request parameters 
//req.set... 
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); 
downloadManager.enqueue(req); 
context.registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 

И в моем OnComplete приемник:

private BroadcastReceiver onComplete = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 
     queryRequestParameters(context, intent); 
    } 
}; 

private void queryRequestParameters(Context context, Intent intent) { 
    // get request bundle 
    Bundle extras = intent.getExtras(); 
    DownloadManager.Query q = new DownloadManager.Query(); 
    q.setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID)); 
    Cursor c = ((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)).query(q); 
    //get request parameters 
    if (c.moveToFirst()) { 
     int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); 
     if (status == DownloadManager.STATUS_SUCCESSFUL) { 
      // find path in column local filename 
      String path = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME)); 
     } 
    } 
} 

С intent.getExtras() я могу получить только параметры запроса. Я попытался отправить Broadcast на тот же приемник с разными действиями (один с ACTION_DOWNLOAD_COMPLETED, другой - обычным), но мне нужно отправить двойную трансляцию, чтобы она входила два раза в onReceive.

ответ

5

Там есть способ поставить статист в намерении DownloadManager зарегистрированных для actionDownloadManager.ACTION_DOWNLOAD_COMPLETE (например, получить логическое значение, установленное в качестве дополнительной в намерении)?

No. Используйте ID вы получите обратно from enqueue() хранить ваш желаемый boolean где постоянные (например, в файле), так что вы можете прочитать это значение назад, когда вы получите трансляцию.

Кроме того, что касается фрагмента кода, помните, что к моменту завершения загрузки ваш процесс может быть неспособен. Ваш BroadcastReceiver, зарегистрированный через registerReceiver(), поэтому никогда не может быть запущен.

+0

Я понял первую часть о моем вопросе, но не о втором. Что означает, что к моменту завершения загрузки мой процесс может отсутствовать? –

+1

@Fondesa: Загрузки требуют времени. Ваш процесс не будет жить вечно. Возможно, он не будет достаточно долго для завершения загрузки. Если вы хотите узнать о загрузках, которые завершены после завершения процесса, вам нужно будет сделать что-то еще, кроме того, что вы делаете с 'registerReceiver()'. – CommonsWare

+0

О, теперь я понимаю, спасибо! –

0

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

DownloadManager dm = (DownloadManager) getSystemService(BaseActivity.DOWNLOAD_SERVICE); 
    DownloadManager.Request request = new DownloadManager.Request(
      Uri.parse((Constants.ROOT_URL_1 + fileName))); 
    request.setAllowedNetworkTypes(
      DownloadManager.Request.NETWORK_WIFI 
        | DownloadManager.Request.NETWORK_MOBILE) 
      .setAllowedOverRoaming(false).setTitle(title) 
      .setDescription("This is what you need!!!") 
      .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) 
      .setDestinationInExternalPublicDir("/my_folder", title) 
      .allowScanningByMediaScanner(); 

Вы можете увидеть поле decription выше. Теперь я прочитаю это после завершения загрузки в методе onReceive BroadcastReceiver.

  DownloadManager.Query query = new DownloadManager.Query(); 
      query.setFilterById(downloadId); 
      Cursor c = ((DownloadManager) getSystemService(BaseActivity.DOWNLOAD_SERVICE)).query(query); 
      if (c.moveToFirst()) { 
       int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS); 
       if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) { 
        String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 
        String description = c.getString(c.getColumnIndex(DownloadManager.COLUMN_DESCRIPTION)); 
       } 
      } 
Смежные вопросы