为什么下载管理器需要`WRITE_EXTERNAL_STORAGE`用于maxSdkVersion> 18

时间:2015-05-25 07:01:35

标签: android

我正在使用Download manager下载文件并将其保存到外部存储中,如下所示:

DownloadManager.Request req = new DownloadManager.Request(uri);
req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)
.setDestinationInExternalFilesDir(TextReaderActivity.this, null, "podcasts/" + Integer.toString(article.id) + PODCAST_EXTENSION);

我得到以下异常:

Exception: need WRITE_EXTERNAL_STORAGE permission to use DESTINATION_FILE_URI: uid 10052 does not have android.permission.WRITE_EXTERNAL_STORAGE.

我已经读过在写入外部目录时我不需要WRITE_EXTERNAL_STORAGE maxSdkVersion > 18的权限,为什么它不需要DownloadManager

更新:

  

在Android 4.4及更高版本中,规则略有不同:
   - 读取或写入以getExternalFilesDir()为根的目录树   和getExternalCacheDir(),你不需要权限
   - 要写入外部存储器上的任何其他位置,您需要WRITE_EXTERNAL_STORAGE
   - 要从外部存储的任何其他位置读取,您需要   WRITE_EXTERNAL_STORAGE(如果你已经有)或   READ_EXTERNAL_STORAGE(如果没有)

2 个答案:

答案 0 :(得分:6)

您引用的有关WRITE_EXTERNAL_STORAGE的规则适用于您的流程何时写入外部存储,然后仅适用于您的getExternalFilesDir()及相关目录。

在这种情况下,您不会写入外部存储。您要求DownloadManager写入外部存储。 DownloadManager - 或者更确切地说,DownloadManager与之对话的流程 - 要求您获得此权限,而且似乎不考虑API级别。

答案 1 :(得分:3)

DownloadManager.Request的文档清楚地提到您为任何setDestination方法设置的目标必须位于外部存储上且您的应用必须具有WRITE_EXTERNAL_STORAGE权限: