Android NDK开发详解应用数据和文件之管理存储设备上的所有文件
绝大多数需要共享存储空间访问权限的应用都可以遵循共享媒体文件和共享非媒体文件方面的最佳做法。然而,某些应用的核心用例需要广泛访问设备上的文件,但无法采用注重隐私保护的存储最佳实践高效地访问这些文件。对于这些情况,Android 提供了一种名为“所有文件访问权”的特殊应用访问权限。
例如,防病毒应用的主要用例可能需要定期扫描不同目录中的许多文件。如果此扫描需要反复的用户交互,让其使用系统文件选择器选择目录,就会带来糟糕的用户体验。其他用例(如文件管理器应用、备份和恢复应用以及文档管理应用)也需要考虑类似情况。
申请所有文件访问权
应用可通过执行以下操作向用户请求“所有文件访问权”:
在清单中声明 MANAGE_EXTERNAL_STORAGE 权限。
使用 ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION intent 操作将用户引导至一个系统设置页面,在该页面上,用户可以为您的应用启用以下选项:授予所有文件的管理权限。
如需确定您的应用是否已获得 MANAGE_EXTERNAL_STORAGE 权限,请调用 Environment.isExternalStorageManager()。
MANAGE_EXTERNAL_STORAGE 允许执行的操作
MANAGE_EXTERNAL_STORAGE 权限会授予以下权限:
对共享存储空间中的所有文件的读写访问权限。
注意:/sdcard/Android/media 目录是共享存储空间的一部分。
对 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() 将用户转到其他应用的自定义空间管理活动。
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 警告,提醒开发者有关 MANAGE_EXTERNAL_STORAGE 权限的 Google Play 政策。
仅当您的应用无法有效利用更有利于保护隐私的 API(如存储访问框架或 Media Store API)时,您才能请求 MANAGE_EXTERNAL_STORAGE 权限。您的应用对该权限的使用必须在允许的使用情形范围内,并且必须与应用的核心功能直接相关。如果您的应用包含与以下任一项类似的用例,可能会请求 MANAGE_EXTERNAL_STORAGE 权限:
文件管理器
备份和恢复应用
防病毒应用
文档管理应用
设备上的文件搜索
磁盘和文件加密
设备到设备数据迁移
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2023-05-01。