Android – DownloadManager / BroadcastReceiver llamado varias veces
Estoy usando un DownloadManager para manejar una descarga en mi aplicación, me gustaría notificar al usuario cuando se haya completado la descarga.
Estoy usando el siguiente código que está funcionando bien
- No se puede comunicar Google Datastore con la aplicación Android en Android Studio
- Prácticas recomendadas para la programación asíncrona
- Android: EditText en el problema de ListView
- ¿Puedo obtener propiedades definidas en "gradle.properties" en JAVA STATEMENT?
- If-else trabajando, no cambie
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)); }
El problema es que el método onReceive también se llama para descargas anteriores.
Digamos que descarga a.mp3, b.mp3 y c.mp3, cuando a.mp3 se completa recibo a.mp3 completado, cuando b.mp3 se completa recibo a.mp3 se completa, entonces una nueva tostada b.mp3 esta completado…
¿Cómo podría evitar esto? gracias.
- ¿Es posible escanear el androide classpath para anotaciones?
- ¿Hay alguna biblioteca o algoritmo para convertir Shamsi (Jalali) a fecha gregoriana en Java?
- ¿Es posible en Android registrar algo reproducido por MediaPlayer?
- Observable.empty () hace que java.util.NoSuchElementException: Secuencia no contiene elementos
- Zoom automático en Google Maps en java? (Dependiendo de la resolución de pantalla de Android)
- Cómo crear una devolución de llamada (agregar como argumento dinámico, una función)?
- Android: rellena un spinner de strings.xml
- ¿Cómo puedo imprimir / registrar contenido de cuerpo entero de MultiPartEntity que está siendo utilizado por HTTPRequest?
Yo registra un BroadcastReceiver
cada vez que descarga un archivo. Eso significa que, la segunda vez que descargue un archivo, tendrá dos receptores registrados. Probablemente debería anular su registro mediante unregisterReceiver()
después de que el trabajo se realiza (probablemente en onReceive()
).
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));}
Usted debe utilizar esto para obtener su cadena de título para descargas individuales. Porque cada descarga tiene su propio id. Sé que la respuesta es demasiado tarde, pero puede ayudar a otros en el futuro …
- Cómo aumentar el período de exploración para dispositivos BLE en Android?
- ¿Por qué Filtros de Intención de Etiqueta?