2012-02-08 8 views
11

Quiero descargar un archivo para tarjeta SD con la clase Android DownloadManager:¿Cómo usar Android DownloadManager?

Request request = new Request(Uri.parse(url)); 
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename); //set destination dir 
long downloadId = downloader.enqueue(request); 

pero siempre me sale estado de la descarga = 16 (STATUS_FAILED), y la razón = 1008 (ERROR_CANNOT_RESUME). Ya he incluido android.permission.WRITE_EXTERNAL_STORAGE en el manifiesto.

cuando me comentó el

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename); 

y utilizar la carpeta de descargas por defecto, está bien. Pero yo no sé de dónde se va el archivo, el localUri llego del resultado es algo así como:

content://downloads/my_downloads/95 

No sé cómo copiar el archivo a tarjeta SD.

Lo que quiero es descargar un archivo a SDCard. ¿Alguien podría ayudar? ¡Gracias!

Respuesta

13

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() me da /mnt/sdcard/downloads

y soy capaz de usar el archivo descargado en onReceive (ACTION_DOWNLOAD_COMPLETE)

long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); 
Query query = new Query(); 
query.setFilterById(downloadId); 
Cursor cur = dm.query(query); 

if (cur.moveToFirst()) { 
    int columnIndex = cur.getColumnIndex(DownloadManager.COLUMN_STATUS); 
    if (DownloadManager.STATUS_SUCCESSFUL == cur.getInt(columnIndex)) { 
     String uriString = cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 

     File mFile = new File(Uri.parse(uriString).getPath()); 
     .... 

    } else { 
     Toast.makeText(c, R.string.fail, Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

solo me dan "content: // downloads/my_downloads/539" con este código y sin ruta local. – Radon8472

+2

Dependiendo de la versión de Android, obtienes un archivo: // atrás (en android <4.2) o un contenido: // (en android 4.2 y superior). por lo que esta respuesta solo se aplica a Android 4.2 inferior y 4.2 y hasta el contenido tendría que resolverse con la respuesta a continuación en Mín. –

15

Puede recuperar la ruta del archivo de localUri así:

public static String getFilePathFromUri(Context c, Uri uri) { 
    String filePath = null; 
    if ("content".equals(uri.getScheme())) { 
     String[] filePathColumn = { MediaColumns.DATA }; 
     ContentResolver contentResolver = c.getContentResolver(); 

     Cursor cursor = contentResolver.query(uri, filePathColumn, null, 
       null, null); 

     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     filePath = cursor.getString(columnIndex); 
     cursor.close(); 
    } else if ("file".equals(uri.getScheme())) { 
     filePath = new File(uri.getPath()).getAbsolutePath(); 
    } 
    return filePath; 
} 
+0

Muchas gracias, trabajando perfectamente con DownloadManager – xDragonZ

+0

Esto funciona muy bien en 6.0.1 - ¡felicitaciones! – runfaj

Cuestiones relacionadas