6

Я использую DownloadManager для обработки загрузки в своем приложении, я хотел бы уведомить пользователя о завершении загрузки.Android - DownloadManager/BroadcastReceiver называется несколько раз

Я использую ниже код, который работает хорошо

public void downloaddownload(View v){ 
     View v2 = (View) v.getParent(); 
     TextView urlView = (TextView) v2.findViewById(R.id.url); 
     String urlString = (String) urlView.getText().toString(); 
     TextView artistView2 = (TextView) v2.findViewById(R.id.artist); 
     final String artistString = (String) artistView2.getText().toString(); 
     TextView titleView2 = (TextView) v2.findViewById(R.id.title); 
     final String titleString = (String) titleView2.getText().toString(); 

     DownloadManager.Request request = new DownloadManager.Request(Uri.parse(urlString)); 
     request.setDescription(titleString); 
     request.setTitle(artistString); 
     // in order for this if to run, you must use the android 3.2 to compile your app 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      request.allowScanningByMediaScanner(); 
      request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
     } 
     request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC + "/folder", titleString + " - " + artistString + ".mp3"); 

     Toast.makeText(mainContext, "Downloading " + titleString + " - " + artistString, Toast.LENGTH_SHORT).show(); 

     // get download service and enqueue file 
     DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
     manager.enqueue(request); 

     onComplete = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       // TODO Auto-generated method stub 
       Toast.makeText(mainContext, "Download \" " + titleString + " - " + artistString + "\" completed", Toast.LENGTH_LONG).show(); 
      } 
     }; 

     registerReceiver(onComplete, new IntentFilter(
        DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 


    } 

Проблема заключается в том, что OnReceive метод вызывается для предыдущих загрузок тоже.

Скажем, я загружаю a.mp3, b.mp3 и c.mp3, когда a.mp3 завершен. Я получаю a.mp3 завершен, когда b.mp3 завершен. Я получаю.m.mp3, завершен, затем новый тост b.mp3 завершен ...

Как я мог предотвратить это? Спасибо.

+0

Есть также проблемы с Download Manager. См. Также http://stackoverflow.com/questions/10852821/downloadmanager-sends-status-successful-for-failed-download –

+0

в вашем методе BroadcastReceiver onReceive вам нужно отменить регистрацию, как Activity.this.unregister (this) – Gugelhupf

ответ

9

Yo регистрирует BroadcastReceiver каждый раз, когда вы загружаете файл. Это означает, что во второй раз, когда вы загружаете файл, у вас будет зарегистрировано два приемника. Вероятно, вы должны отменить регистрацию, используя unregisterReceiver() после завершения работы (возможно, в onReceive()).

+0

У меня был такой же проблема тоже. Тпх – RedFlow

1
long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); 
Query query = new Query(); 
query.setFilterById(downloadId); 
Cursor cur = manager.query(query); 
    if (cur.moveToFirst()) { 
     int columnIndex = cur.getColumnIndex(DownloadManager.COLUMN_STATUS); 
     if (DownloadManager.STATUS_SUCCESSFUL == cur.getInt(columnIndex)) { 
      titleString=cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_TITLE));} 

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