2012-02-08 47 views
11

我想下載一個文件到SD卡與Android下載管理器類:如何使用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 

我不知道如何將文件複製到SD卡。

我想要的是下載文件到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 2015-09-24 13:12:36

+2

根據Android版本,您可以獲得一個file:// back(在android <4.2)或content://(在android 4.2及更高版本中)。所以這個答案只適用於android 4.2以下和4.2以上的內容,需要用Min下面的答案解決。 – 2015-10-17 07:52:42

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 2015-08-14 10:29:45

+0

這對6.0.1很好用 - 很榮幸! – runfaj 2016-02-18 07:01:11

相關問題