6

Ich verwende einen DownloadManager, um einen Download in meiner Anwendung zu verarbeiten, ich möchte den Benutzer benachrichtigen, wenn der Download abgeschlossen ist.Android - DownloadManager/BroadcastReceiver mehrmals aufgerufen

ich den Folowing Code verwenden, die gut

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


    } 

Das Problem arbeitet, ist, dass die OnReceive Methode zur bisherigen Downloads auch genannt wird. Nehmen wir an, ich lade a.mp3, b.mp3 und c.mp3 herunter, wenn a.mp3 fertig ist. Ich bekomme a.mp3 fertig, wenn b.mp3 fertig ist. Ich bekomme, dass a.mp3 fertig ist, dann ein neues Toast b.mp3 ist fertig ...

Wie kann ich das verhindern? Danke.

+0

Es gibt auch Probleme mit Download Manager. Siehe auch http://stackoverflow.com/questions/10852821/downloadmanager-sends-status-successful-for-failed-download –

+0

in Ihrem BroadcastReceiver onReceive Methode müssen Sie eine Registrierung wie Activity.this.unregister (this) – Gugelhupf

Antwort

9

Sie registrieren ein BroadcastReceiver jedes Mal, wenn Sie eine Datei herunterladen. Das bedeutet, dass Sie beim zweiten Herunterladen einer Datei zwei Empfänger registriert haben. Sie sollten sie wahrscheinlich abmelden, indem Sie unregisterReceiver() nach der Arbeit verwenden (wahrscheinlich in onReceive()).

+0

Ich hatte die gleiche Problem auch. Tnx – 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));} 

sollten Sie dies verwenden, um Ihre Titelfolge für einzelne Downloads zu erhalten. weil jeder Download eine eigene ID hat. Ich weiß Antwort ist zu spät aber es kann für andere in der Zukunft helfen ...

Verwandte Themen