Android 11系统scoped storage其他目录图片无法删除如何适配
Android 11 分区存储删除公共目录图片适配方案
问题根因
从Android 11(API等级30)开始,分区存储规则强制生效,第三方应用如果不是对应媒体文件的创建者,无法直接通过
ContentResolver.delete()方法删除公共存储中的媒体资源,原来Android 10及更低版本的调用逻辑会直接执行失败。
适配步骤
1. 声明必要权限
在AndroidManifest.xml中添加适配不同版本的权限配置:
<!-- Android 13及以上读取图片权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:minSdkVersion="33" /> <!-- Android 12及以下读取存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- Android 10及以下写存储权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
非文件管理类应用不建议申请MANAGE_EXTERNAL_STORAGE权限,否则会被Google Play拒审
2. 分版本实现删除逻辑
修改原有delSysMedia方法,Android 11及以上版本需要向系统申请删除授权:
private void delSysMedia(ImageModel mi) { ContentResolver cr = context.getContentResolver(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 11及以上走授权删除流程 List<Uri> deleteUris = new ArrayList<>(); // 构造目标图片的唯一Uri Uri targetUri = ContentUris.withAppendedId(Images.Media.EXTERNAL_CONTENT_URI, mi.getId()); deleteUris.add(targetUri); // 生成系统删除申请的PendingIntent PendingIntent deleteIntent = MediaStore.createDeleteRequest(cr, deleteUris); try { // 用当前Activity启动授权弹窗,请求码可自定义 ((Activity)context).startIntentSenderForResult(deleteIntent.getIntentSender(), 10086, null, 0,0,0); } catch (IntentSender.SendIntentException e) { e.printStackTrace(); } } else { // Android 10及以下走原有逻辑 cr.delete(Images.Media.EXTERNAL_CONTENT_URI, Images.Media._ID + "=?", new String[]{String.valueOf(mi.getId())}); cr.delete(Images.Thumbnails.EXTERNAL_CONTENT_URI, Images.Thumbnails.IMAGE_ID + "=?", new String[]{String.valueOf(mi.getId())}); } }
3. 处理授权结果
在启动删除申请的Activity中重写onActivityResult判断授权结果:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 10086) { if (resultCode == RESULT_OK) { // 用户同意授权,删除成功,系统会自动清理对应缩略图,无需手动删除Thumbnails表 } else { // 用户拒绝授权,删除失败 } } }
特殊说明
如果删除的是你的应用自身创建的媒体文件,不需要申请用户授权,原有删除逻辑在Android 11及以上版本也可正常运行。
内容的提问来源于stack exchange,提问作者Maan Chaudhary
相关产品推荐
相关产品推荐

