问题描述
当一个备忘录应用(如 Google Keep, Wunderlist, Stickynotes 等)向设备申请“照片、媒体和其它文件”的访问权限时,常常会让用户提供感到不确定。因此,我们能否仅请求文件的访问权限而跳过对“照片”、“媒体”等单独项目的许可申请呢?在Android 6.0及更高版本下,应用权限管理是否足够细化?
解决方案
特别注意以下操作可能会对用户隐私和程序功能有深远影响,请确保你在开发阶段充分测试并做好详细的用户沟通。
方法1:存储访问框架(SAF)
尽管“照片、媒体和其他文件”这一请求集涵盖了广泛的文件类型,如图片、视频、文档等,并提供了读取、写入及其它更多操作的权限,这些权限一旦授予,则允许应用对整个 /sdcard
进行探索、修改乃至删除。
在 Android 6.0 及更高版本中,目前没有更细粒度的方式来单独管理这些文件访问权限。为减少不必要的权限询问次数并提供更好的用户体验,可以使用 Storage Access Framework (SAF) 来允许应用仅获取特定的文件或目录(包括其子目录)而不访问整个外部存储。
实现步骤:
- 使用Android ContentProvider注册一个可编辑的数据源。
- 在界面中添加一个按钮来触发用户浏览已授权的路径并选择所需的文件或文件夹进行访问。
具体代码示例如下:
// 添加读取权限请求
Intent intent = new Intent(Intent.ACTION_GET_CONTENT)
.addCategory(Intent.CATEGORY_OPENABLE)
.setType("*/*");
startActivityForResult(intent, 1);
- 在应用内部处理用户选择的结果,进行具体的文件操作。
方法2:Android Q的 scoped storage(分层存储)
Android开发团队为了更好地保护用户的隐私权,引入了 scoped storage。这一机制限制了每个应用可以直接访问的某些文件和目录。在 Android 10及以上版本中,大多数类型的个人数据被从外部存储移出来到了一种叫做“私有存储”的环境中(如:应用的数据包)。这意味着多数使用公开环境存储的应用都会发现自己缺少了对所有外部存储位置的直接访问权。
采用此新体系的话:
- 普通用户的私人物品会保持原样,而应用则受限于特定的数据类型与路径。
- 开发者们需更新其App以满足这一新的要求,包括从
externalStorage
转向使用文件提供者访问。
综上所述,在Android 6.0以上系统中,开发者可利用上述 SAF 来细化权限范围或者采用 Android Q 引入的 scoped storage 新机制来优化用户的隐私保护设置和应用的操作体验。请务必在部署前进行充分测试,并保持与用户之间的良好沟通。