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.
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". EsteCursor
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