使用DownloadManager将文件下载到真正的SD卡,而不是模拟存储

时间:2014-01-14 15:09:21

标签: java android eclipse

我有一个星系S4,我的问题是我无法使用DownloadManager将文件下载到SD卡,在模拟存储上它工作得很好,对于真正的SD卡它给了我这个错误:

java.lang.SecurityException: Destination must be on external storage: file:///mnt/extSdCard/Android/data/net.myApp/files/exercises/exec.mp4

这是我的代码:

DownloadManager dwlManager=(DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);

DownloadManager.Request dwlmRequest=new DownloadManager.Request(Uri.parse("http://cdn..."));
File destination = new File("/mnt/extSdCard/Android/data/net.myApp/files/exercises/exec.mp4");              

dwlmRequest.setDestinationUri(Uri.fromFile(destination));
dwlManager.enqueue(dwlmRequest); //<--- Here comes the error.

如果我将目的地设置为:

File destination = new File(getExternalFilesDir(null), "exec.mp4");

代码工作得很好,因为目标来到模拟存储。 我也可以创建文件到SD卡,如:

File f = new File("/mnt/extSdCard/Android/data/net.myApp/files/exercises/exec.mp4");
f.createNewFile();

它有效,但我无法使用该路径下载管理器。

请帮忙。 我需要能够将文件下载到该路径。

3 个答案:

答案 0 :(得分:3)

不支持此功能。无法保证DownloadManager有权写入任意路径,即使您认为它们是指SD卡。此外,使用/mnt/extSdCard/的您自己的代码可能适用于您的设备,但无法在所有设备上运行,其中许多设备甚至都没有这样的目录。

答案 1 :(得分:2)

在这个问题上花了一些时间后,我发现了一个更优化的解决方案,然后在下载后将文件复制到任意位置。 主要问题是我设置SD卡的路径不正确。

它是:/ mnt / extSdCard / Android / data ...

但是在三星Galaxy S4上应该是:/ storage / extSdCard / Android / data ......

默认下载管理器似乎可以正常使用此路径作为下载目标。 在以下链接中,我找到了一个非常好的代码,用于检测不同设备的SD卡路径:http://www.javacodegeeks.com/2012/10/android-finding-sd-card-path.html

看起来很讨厌,但对我来说,它似乎是最理想的解决方案。

答案 2 :(得分:1)

根据这个: java.lang.SecurityException: Destination must be on external storage

DownloadManager无法在任意位置写入文件。但您可以使用“Enviroment”常量将文件下载到外部存储器,下载完成后,将文件复制到所需位置,最后使用标准文件API删除原始文件。