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

大多数需要共享存储访问权限的应用程序可以遵循共享媒体文件共享非媒体文件的最佳实践。但是,某些应用程序的核心用例需要对设备上的文件进行广泛的访问,但无法使用注重隐私的存储最佳实践有效地访问这些文件。Android 为这些情况提供了名为全文件访问权限的特殊应用程序访问权限。

例如,防病毒应用程序的主要用例可能需要定期扫描不同目录中的许多文件。如果此扫描需要重复的用户交互以使用系统文件选择器选择目录,则会提供糟糕的用户体验。其他用例(例如文件管理器应用程序、备份和恢复应用程序以及文档管理应用程序)需要类似的考虑。

请求全文件访问权限

应用程序可以通过以下操作向用户请求全文件访问权限

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

要确定您的应用是否已获得 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 权限的情况下访问文件或目录。

调用其他应用的存储管理活动

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

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

  • 一个 PendingIntent,如果具有指定包名的应用已定义自定义的“管理空间”活动。然后,调用 getManageSpaceActivityIntent() 方法的文件管理应用可以调用返回的意图,将用户发送到自定义活动。
  • null,如果具有指定包名的应用没有定义“管理空间”活动。

为测试启用 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 权限

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