如何使用Android DownloadManager?

Dag*_*ang 13 android download

我想用Android DownloadManager类将文件下载到SDCard:

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

但我总是得到下载状态= 16(STATUS_FAILED),并且原因= 1008(ERROR_CANNOT_RESUME).我已经在清单中包含了android.permission.WRITE_EXTERNAL_STORAGE.

当我评论出来时

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename); 
Run Code Online (Sandbox Code Playgroud)

并使用默认的下载文件夹,没关系.但我不知道文件在哪里,我从结果得到的localUri是这样的:

content://downloads/my_downloads/95
Run Code Online (Sandbox Code Playgroud)

我不知道如何将文件复制到SDCard.

我想要的是将文件下载到SDCard.有人可以帮忙吗?谢谢!

小智 17

您可以从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;
}
Run Code Online (Sandbox Code Playgroud)


小智 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 根据Android版本,您可以获得一个文件:// back(在android <4.2上)或content://(在android 4.2及更高版本上).所以这个答案只适用于android低4.2和4.2及以上的内容需要通过Min的答案解决. (2认同)