为啥在 Android Q 及更高版本上不需要 WRITE_EXTERNAL_STORAGE

Posted

技术标签:

【中文标题】为啥在 Android Q 及更高版本上不需要 WRITE_EXTERNAL_STORAGE【英文标题】:Why doesn't require WRITE_EXTERNAL_STORAGE on Android Q and higher为什么在 Android Q 及更高版本上不需要 WRITE_EXTERNAL_STORAGE 【发布时间】:2020-07-01 22:33:36 【问题描述】:

我使用 DownloadManager 来下载一张照片并保存到外部图片目录:

.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, File.separator + filename)

Marshmallow 需要 WRITE_EXTERNAL_STORAGE(如预期的那样),但在 android Q 及更高版本上,无需许可即可正常工作。为什么会这样?是因为作用域存储吗?

【问题讨论】:

【参考方案1】:

Android 文档:

Android 为外部存储的读写访问定义了以下权限:READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE。

在早期版本的 Android 上,应用需要声明这些权限才能访问外部存储上应用特定目录之外的任何文件。较新的 Android 版本更多地依赖文件的用途而不是位置来确定应用程序访问该文件的能力。这种基于目的的存储模型改善了用户隐私,因为应用只能访问它们实际使用的设备文件系统区域。

为了让用户更好地控制他们的文件并限制文件混乱,默认情况下,面向 Android 10(API 级别 29) 及更高版本的应用被授予对外部存储或范围存储的范围访问权限.此类应用只能访问外部存储上特定于应用的目录,以及应用创建的特定类型的媒体。

For more

【讨论】:

以上是关于为啥在 Android Q 及更高版本上不需要 WRITE_EXTERNAL_STORAGE的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到错误消息:Android Gradle 插件仅支持 Kotlin Gradle 插件版本 1.3.10 及更高版本

为啥支持 C++11 及更高版本的 C++ 编译器需要 Boost.SmartPtr?

为啥 SSMS 17.x 及更高版本不支持 SSIS

android - 面向 Android 12 及更高版本的应用需要为 `android:exported` 指定显式值

为啥 iPhone 6 及更高版本的 wkwebview 不接受底部的点击?

android:exported 需要为 <activity> 显式指定。面向 Android 12 及更高版本的应用需要指定