Android 10 11 删除本地照片方法
Android 10 11 删除本地照片方法
关于分区存储
1. 启用分区存储的情况
2. 未启用分区存储的情况
情景1:启用分区存储
权限申请
修改媒体文件
1. 获取图片Uri
2. 执行删除操作
3. 实际使用表现
4. 批量删除
情景2:未启用分区存储
权限申请
删除图片
关于分区存储
对于媒体文件的修改在代码和应用层面的不同,将取决于分区存储是否启用: Scoped Storage分区存储 在Android10开始引入,在Android11开始强制启用,是系统为了加强用户隐私保护、规整应用文件存储管理,采用的收紧外部文件的存储访问权限的方式; 对于不同设备和应用目标运行版本(targetSdkVersion),分区存储启用情况如下:
1. 启用分区存储的情况
当应用运行在搭载 >= Android10(API级别29) 系统的设备 且 targetSdkVersion >= 29时,在默认情况下,启用Scoped Storage分区存储。
2. 未启用分区存储的情况
当应用运行在搭载 < Android10 系统的设备 或 开发应用定义 targetSdkVersion < 29 时,默认不启用分区存储。
当应用运行在搭载 >= Android10 系统的设备 但 开发应用定义 targetSdkVersion 29 时,我们可以通过在AndroidManifest.xml文件中设置 requestLegacyExternalStorage=true来关闭分区存储。如下所示:
... android:requestLegacyExternalStorage="true"> ...
附: 关于build.gradle中compileSdkVersion,minSdkVersion,targetSdkVersion的意义可参考: Android targetSdkVersion你真的了解吗? 代码中判断应用运行设备的android版本(返回的是Androi版本对应的API级别):
android.os.Build.VERSION.SDK_INT
接下来将针对开启分区存储和未启用分区存储的情况分析删除媒体文件的不同:
情景1:启用分区存储
权限申请
为了访问由其他应用创建的文件,我们需要申请读取权限:READ_EXTERNAL_STORAGE。 在启用分区存储的情况下,我们应仅针对搭载 Android 9(API 级别 28)或更低版本的设备请求写权限1:WRITE_EXTERNAL_STORAGE。 在代码中,我们可以使用maxSdkVersion进行限制:
android:maxSdkVersion="28" /> 运行时权限申请: private static final List PERMISSIONS_LIST.add("android.permission.READ_EXTERNAL_STORAGE"); if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES.P) { PERMISSIONS_LIST.add("android.permission.WRITE_EXTERNAL_STORAGE"); } 获取权限方法: /** * 若没有权限则发起权限申请 * @param context 响应请求回调事件页面context * @param permissionList 权限列表 * @param REQUEST_CODE 请求标识 * @return 申请前是否已有权限 */ public boolean verifyPermissions(Context context, String[] permissionList, int REQUEST_CODE) { // 缺少权限,弹出对话框申请权限 if (!isPermissionGranted(permissionList)) { ActivityCompat.requestP