2012-02-08 2 views
11

Я хочу, чтобы загрузить файл в SDCard с классом Android DownloadManager:Как использовать Android DownloadManager?

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

Но я всегда получаю статус загрузки = 16 (STATUS_FAILED), и причина = 1008 (ERROR_CANNOT_RESUME). Я уже включил android.permission.WRITE_EXTERNAL_STORAGE в манифест.

Когда я закомментировал

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename); 

и использовать папку загрузки по умолчанию, это нормально. Но я не знаю, где файл идет, localUri я получаю от результата что-то вроде:

content://downloads/my_downloads/95 

Я не знаю, как скопировать файл в SDCard.

Что я хочу скачать файл SDCard. Может ли кто-нибудь помочь? Благодаря!

ответ

13

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() дает мне /mnt/sdcard/downloads

И я могу использовать загруженный файл в 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

я получаю только «content: // downloads/my_downloads/539» с этим кодом и без локального пути. – Radon8472

+2

В зависимости от версии Android вы либо получаете файл: // back (on android <4.2), либо контент: // (на Android 4.0 и выше). поэтому этот ответ применим только к Android 4.2 и 4.2, и контент должен быть разрешен с ответом ниже на Min. –

15

Вы можете получить путь к файлу из localUri так:

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

Огромное вам спасибо, отлично работаю с DownloadManager – xDragonZ

+0

Это отлично работает на 6.0.1 - kudos! – runfaj

Смежные вопросы