android - 管理外部存储与写入外部存储

标签 android permissions storage android-permissions android-external-storage

我最近必须实现一项功能来将本地文件保存在下载文件夹中。这项挑战带来了一些我尚未找到答案的问题。

MANAGE_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE 有什么区别?

这里是google对MANAGE_EXTERNAL_STORAGE的描述

Google Play restricts the use of high risk or sensitive permissions, including a special app access called All files access. This is only applicable to apps that target Android 11 (API level 30) and declare the MANAGE_EXTERNAL_STORAGE permission...

以及WRITE_EXTERNAL_STORAGE的定义

Allows an application to write to external storage. Starting in API level 19, this permission is not required to read/write files in your application-specific directories...

那么,有什么区别呢?我应该什么时候使用每一个?为什么Google需要3个权限来处理外部存储?我应该询问什么才能将文件保存到“下载”文件夹中?

最佳答案

MANAGE_EXTERNAL_STORAGE:

  • 适用于 Android 11 及更高版本
  • 允许对 SDK 称为外部存储的内容进行近乎完整的读/写访问
  • 将导致您的应用被禁止在 Play 商店(或许还有其他地方)上分发,除非您可以向 Google 证明该许可是必要的,但这非常困难

WRITE_EXTERNAL_STORAGE:

  • 适用于所有当前版本的 Android
  • 在 Android 9 及更低版本(以及带有 android:requestLegacyExternalStorage="true" 的 Android 10)上,允许对 SDK 称为外部存储的所有内容进行写入访问
  • 在 Android 11+ 上,允许对少数公共(public)位置进行写入访问
  • 无需 Google 许可即可用于 Play 商店中的应用

Why Google need 3 permissions to handle external storage?

因为随着时间的推移,事情已经发生了变化。被认为适合 Android 2.x 的方法(WRITE_EXTERNAL_STORAGE 对外部存储具有完全的写入访问权限)存在问题。

What should I ask to save a file on Downloads folder?

最有可能的答案是“不要写入Downloads/”。请记住,在 Android 11+ 上,您无权读取 Downloads/ 中非您的应用创建的文件。这意味着,如果您尝试在那里写入文件,并且已经存在由其他应用程序创建的同名文件,则会失败并出现错误 - 您无法覆盖其他应用程序创建的文件。

通常,更好的答案是使用 ACTION_CREATE_DOCUMENT/ActivityResultContracts.CreateDocument 并允许用户告诉您用户想要在用户本地或云存储中的哪个位置您可以放置​​此内容。

但是,如果您坚持使用 Downloads/WRITE_EXTERNAL_STORAGE 就足够了。

关于android - 管理外部存储与写入外部存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73909410/

相关文章:

Android 访问外部存储

android - 安卓编码标准

android - 如何在 android 上将 WHERE 子句添加到查询

optimization - 存储算法问题-用很少的内存验证顺序数据

php写入文件权限问题

node.js - 无法建立 Bower 错误隧道套接字,原因=解析错误

java - Android文件存储存储内存位置

java - 在android studio中使用java解析m3u文件

java - 如何从多个来源填充一个ListView?

Android - 应用程序未安装