studio manager example downloadmanager java android broadcastreceiver android-download-manager receiver

java - example - android studio download manager



Android DownloadManager obtener nombre de archivo (4)

En mi aplicación puedes descargar algunos archivos. Utilicé la clase Android DownloadManager para descargar. Una vez completada la descarga, debería mostrarme un mensaje de que el archivo se descargó. El problema es que podría haber 2,3 o 4 descargas al mismo tiempo. Mi código de BroadcastReceiver ve así:

receiver_complete = new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE) ){ Toast.makeText(MainActivity.this, MainActivity.this.getString(R.string.download_finished, "Here should be the name", Toast.LENGTH_SHORT).show(); } } };

¿Cómo puedo obtener el nombre de archivo actual de la descarga finalizada?

Muchas gracias.


Creo que lo que estás buscando es el DownloadManager.COLUMN_TITLE

Aquí hay un enlace a los Documentos de Android: http://developer.android.com/reference/android/app/DownloadManager.html#COLUMN_TITLE

Y aquí hay un tutorial que explicará más que solo obtener el título. Es para descargar una imagen desde una URL y luego mostrarla en una aplicación. Muy útil, creo, en general hablando.

http://wptrafficanalyzer.in/blog/downloading-an-image-from-an-http-url-using-downloadmanager-and-displaying-in-imageview-by-dynamically-registered-broadcastreceiver/


Creo que quieres poner algo como esto dentro de tu bloque if . Reemplace YOUR_DM con su instancia de DownloadManager.

Bundle extras = intent.getExtras(); DownloadManager.Query q = new DownloadManager.Query(); q.setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID)); Cursor c = YOUR_DM.query(q); if (c.moveToFirst()) { int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); if (status == DownloadManager.STATUS_SUCCESSFUL) { // process download title = c.getString(c.getColumnIndex(DownloadManager.COLUMN_TITLE)); // get other required data by changing the constant passed to getColumnIndex } }


Ian Shannon estaba totalmente en lo correcto con su respuesta, pero sugiero alguna mejora:

  • Recuerde cerrar el Cursor después de usarlo, evitando "Fugas en el cursor". Este Cursor consume una gran cantidad de recursos y debe liberarse lo antes posible.

  • Si pones un título para la descarga, como por ejemplo:

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setTitle("Some title");

    El valor dado por DownloadManager.COLUMN_TITLE será "Some title" lugar del nombre del archivo. Así que recomendaría esto en su lugar:

    String filePath = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME)); title = filePath.substring( filePath.lastIndexOf(''/'')+1, filePath.length() );

    COLUMN_LOCAL_FILENAME devuelve la ruta completa ( /storage/sdcard0/Android/data/.../filename.ext ), pero con este código, solo obtendremos el nombre del archivo.

Código final:

Bundle extras = intent.getExtras(); DownloadManager.Query q = new DownloadManager.Query(); q.setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID)); Cursor c = YOUR_DM.query(q); if (c.moveToFirst()) { int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); if (status == DownloadManager.STATUS_SUCCESSFUL) { String filePath = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME)); filename = filePath.substring( filePath.lastIndexOf(''/'')+1, filePath.length() ); } } c.close();

Editar: Reemplace YOUR_DM con su instancia de DownloadManager.


Intenta este código para obtener el nombre del archivo

DownloadManager.COLUMN_LOCAL_FILENAME

No estoy seguro de ello