为什么在maxSdkVersion > 18的情况下,下载管理器需要`WRITE_EXTERNAL_STORAGE`权限?

5
我将使用下载管理器来下载文件并将其保存到外部存储器,方法如下:

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.

我读到过当写入外部目录时 maxSdkVersion > 18 不需要请求 WRITE_EXTERNAL_STORAGE 权限,那么为什么在使用 DownloadManager 时还需要呢?
更新: 在 Android 4.4 及以上版本中,规则有些不同: - 对于以 getExternalFilesDir() 和 getExternalCacheDir() 为根的目录树,您不需要权限即可读取或写入 - 要写入外部存储的任何其他位置,您需要 WRITE_EXTERNAL_STORAGE 权限 - 要从外部存储的任何其他位置读取,您需要已有 WRITE_EXTERNAL_STORAGE 权限,或者需要 READ_EXTERNAL_STORAGE 权限。

3
你是从哪里看到的?(在问题中包含那个来源) - Akshit Rewari
包括来自“CommonsWare”书的引用。请只返回翻译后的文本。 - Max Koretskyi
2个回答

7
您引用的关于WRITE_EXTERNAL_STORAGE的规则只适用于您的进程写入外部存储,并且仅适用于您的getExternalFilesDir()和相关目录。
在这种情况下,您并没有写入外部存储。您正在请求DownloadManager写入外部存储。 DownloadManager - 或者更准确地说,DownloadManager所访问的进程要求您拥有此权限,而且似乎不考虑API级别。

我明白了,谢谢!您可以考虑将这一部分添加到您的书中,因为这是我找到“DownloadManager”实现的地方。另外,顺便提一下,您有时会提到一些Web开发实践,您也有Web开发背景吗? - Max Koretskyi
@Maximus:“你可以考虑将这一部分添加到你的书中,因为这是我找到DownloadManager实现的地方。” -- 好的。“你在Web开发方面有背景吗?”-- 有一些,不过那真的不是主题。 - CommonsWare

3

DownloadManager.Request的文档明确提到,您为任何setDestination方法设置的目标必须在外部存储上,并且您的应用程序必须具有WRITE_EXTERNAL_STORAGE权限:


谢谢,我已经更新了我的问题并添加了相关引用。这是否意味着DownloadManager写入的位置不同于getExternalFilesDir()getExternalCacheDir()返回的位置? - Max Koretskyi
是的,你可以使用setDestinationInExternalFilesDir来设置位置。 - Kartheek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接