管理存储设备上的所有文件

大多数需要访问共享存储空间的应用都可以遵循共享媒体文件共享非媒体文件的最佳实践。但是,有些应用的核心用例需要广泛访问设备上的文件,而无法使用保护隐私的存储最佳实践有效访问它们。对于这些情况,Android 提供了一种名为所有文件访问的特殊应用访问权限。

例如,防病毒应用的主要用例可能需要定期扫描不同目录中的许多文件。如果此类扫描需要用户反复互动才能使用系统文件选择器选择目录,则用户体验会非常差。文件管理器应用、备份和恢复应用以及文档管理应用等其他用例也需要类似考虑因素。

请求所有文件访问权限

应用可以通过以下方式请求用户授予所有文件访问权限

  1. 在清单中声明 MANAGE_EXTERNAL_STORAGE 权限。
  2. 使用 ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION Intent 操作将用户定向到系统设置页面,在该页面中,他们可以为您的应用启用以下选项:允许访问管理所有文件

要确定您的应用是否已获得 MANAGE_EXTERNAL_STORAGE 权限,请调用 Environment.isExternalStorageManager()

MANAGE_EXTERNAL_STORAGE 允许的操作

MANAGE_EXTERNAL_STORAGE 权限授予以下权限

  • 共享存储空间中所有文件的读写权限。

  • 访问 MediaStore.Files 表的内容。

  • 访问 USB On-The-Go (OTG) 驱动器和 SD 卡的根目录。

  • 对所有内部存储目录(/Android/data//sdcard/Android/sdcard/Android 的大多数子目录除外)的写入权限。此写入权限包括直接文件路径访问。

    获得此权限的应用仍然无法访问属于其他应用的应用专属目录,因为这些目录在存储卷上显示为 Android/data/ 的子目录。

当应用拥有 MANAGE_EXTERNAL_STORAGE 权限时,可以使用 MediaStore API 或直接文件路径访问这些额外文件和目录。但是,当您使用存储访问框架时,只有在没有 MANAGE_EXTERNAL_STORAGE 权限的情况下可以访问的文件或目录,您才能访问它们。

调用另一个应用的存储管理 Activity

在 Android 12(API 级别 31)及更高版本上,同时拥有 MANAGE_EXTERNAL_STORAGE 权限和 QUERY_ALL_PACKAGES 权限的应用(例如文件管理应用)可以使用 getManageSpaceActivityIntent() 将用户发送到另一个应用的自定义空间管理 Activity

getManageSpaceActivityIntent() 方法接受一个软件包名称和一个请求代码,并返回以下内容之一

  • 一个 PendingIntent,如果具有指定软件包名称的应用已定义自定义“管理空间”Activity。调用 getManageSpaceActivityIntent() 方法的文件管理应用随后可以调用返回的 Intent 将用户发送到自定义 Activity。
  • null,如果具有指定软件包名称的应用未定义“管理空间”Activity。

启用 MANAGE_EXTERNAL_STORAGE 以进行测试

要探索 MANAGE_EXTERNAL_STORAGE 权限如何影响您的应用,您可以启用该权限以进行测试。为此,请在连接到测试设备的计算机上运行以下命令

adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow

Google Play 通知

本部分向在 Google Play 上发布应用的开发者提供通知。

为限制对共享存储空间的广泛访问,Google Play 商店更新了政策,以评估目标平台为 Android 11(API 级别 30)或更高版本并通过 MANAGE_EXTERNAL_STORAGE 权限请求所有文件访问权限的应用。此政策自 2021 年 5 月起生效。

当您的应用的目标平台为 Android 11 或更高版本并声明 MANAGE_EXTERNAL_STORAGE 权限时,Android Studio 会显示如图 1 所示的 lint 警告。此警告提醒您 Google Play 商店有一项政策限制该权限的使用。

图 1. Android Studio 中的 Lint 警告,提醒开发者注意 Google Play 关于 MANAGE_EXTERNAL_STORAGE 权限的政策。

仅当您的应用无法有效利用更保护隐私的 API(例如存储访问框架媒体存储 API)时,才请求 MANAGE_EXTERNAL_STORAGE 权限。您的应用对该权限的使用必须属于允许的用途,并且必须与应用的核心功能直接相关。如果您的应用包含类似于以下任何一种用例,则很可能可以请求 MANAGE_EXTERNAL_STORAGE 权限

  • 文件管理器
  • 备份和恢复应用
  • 防病毒应用
  • 文档管理应用
  • 设备端文件搜索
  • 磁盘和文件加密
  • 设备到设备数据迁移