Android 10+ 适配数据存取权限,WRITE_EXTERNAL_STORAGE no longer provides write access when targeting Android 10+
Android 10+ 适配数据存取权限
众所周知,如今的互联网程式已经五花八门,稍不留神用户的资料和隐私就泄露了。各大厂商为了统一、集中管理、解决这一问题,也是东施效颦。Google也在朝着某OS的方向前进,对于最近更新的Android 11来说,单在设备数据存储方面就做了大的调整。
一、显示多个文件夹中的图片或视频文件
使用 query() API 查询媒体集合。如需对媒体文件进行过滤或排序,请调整 projection、selection、selectionArgs 和 sortOrder 参数。
显示特定文件夹中的图片或视频
请使用以下方法:
1、按照请求应用权限中所述的最佳做法,请求 READ_EXTERNAL_STORAGE 权限。
2、根据 MediaColumns.DATA 的值检索媒体文件,该值包含磁盘上的媒体项的绝对文件系统路径。
二、显示特定文件夹中的图片或视频
请使用以下方法:
1、按照请求应用权限中所述的最佳做法,请求 READ_EXTERNAL_STORAGE 权限。
2、根据 MediaColumns.DATA 的值检索媒体文件,该值包含磁盘上的媒体项的绝对文件系统路径。
三、在一次操作中修改或删除多个媒体文件
根据应用在哪个 Android 版本上运行来纳入逻辑。
在 Android 11 上运行
请使用以下方法:
使用 MediaStore.createWriteRequest() 或 MediaStore.createTrashRequest() 为应用的写入或删除请求创建待定 intent,然后通过调用该 intent 提示用户授予修改一组文件的权限。
评估用户的响应:
如果授予了权限,请继续修改或删除操作。
如果未授予权限,请向用户说明您的应用中的功能为何需要该权限。
详细了解如何使用 Android 11 中提供的这些方法执行批量操作。
在 Android 10 上运行
如果您的应用以 Android 10(API 级别 29)为目标平台,请停用分区存储,继续使用适用于 Android 9 及更低版本的方法来执行此操作。
在 Android 9 或更低版本上运行
请使用以下方法:
按照请求应用权限中所述的最佳做法,请求 WRITE_EXTERNAL_STORAGE 权限。
使用 MediaStore API 修改或删除媒体文件。
四、拍摄单张图片
当您想拍摄单张图片在应用中使用(例如,用作用户个人资料的照片)时,请使用 ACTION_IMAGE_CAPTURE intent 要求用户使用设备的摄像头拍照。系统会将拍摄的照片存储在 MediaStore.Images 表中。
五、与特定应用共享媒体文件
使用FileProvider
六、暂时停用分区存储
在您的应用与分区存储完全兼容之前,您可以使用以下方法之一暂时停用分区存储:
以 Android 9(API 级别 28)或更低版本为目标平台。
如果您以 Android 10(API 级别 29)或更高版本为目标平台,请在应用的清单文件中将 requestLegacyExternalStorage 的值设置为 true:
<manifest … >
<application android:requestLegacyExternalStorage=“true” … >
…
注意:当您将应用更新为以 Android 11(API 级别 30)为目标平台后,如果应用在搭载 Android 11 的设备上运行,系统会忽略 requestLegacyExternalStorage 属性,因此您的应用必须做好支持分区存储并为这些设备上的用户迁移应用数据的准备。
如需测试以 Android 9 或更低版本为目标平台的应用在使用分区存储时的行为,您可以通过将 requestLegacyExternalStorage 的值设置为 false,选择启用该行为。如果在搭载 Android 11 的设备上进行测试,您还可以使用应用兼容性标记来测试应用在使用和不使用分区存储时的行为。