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

大多数需要共享存储访问权限的应用都可以遵循共享媒体文件共享非媒体文件的最佳实践。但是,某些应用的核心用例需要广泛访问设备上的文件,但无法使用隐私友好型存储最佳实践有效地访问它们。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 OTG (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() 将用户引导至另一个应用的 自定义存储空间管理 Activity

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

  • 如果指定包名的应用定义了自定义的“管理存储空间” Activity,则返回一个 PendingIntent。调用 getManageSpaceActivityIntent() 方法的文件管理应用可以随后调用返回的 Intent 将用户引导至自定义 Activity。
  • 如果指定包名的应用未定义“管理存储空间” Activity,则返回 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 警告,提醒开发者有关 MANAGE_EXTERNAL_STORAGE 权限的 Google Play 政策。

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

  • 文件管理器
  • 备份和还原应用
  • 防病毒应用
  • 文档管理应用
  • 设备上的文件搜索
  • 磁盘和文件加密
  • 设备间数据迁移