You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:06:04