2012-02-08 52 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

相关问题