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

Android 11下如何使用ContentResolver删除自定义文件夹内的图片与视频?

Android 11下删除Pictures/MyFolder目录图片的实现方案

前置说明

Android 11默认启用分区存储,针对公共共享目录下的媒体文件有如下规则:

  • 你自己应用写入到公共Pictures目录的文件,可直接查询、删除,无需额外权限
  • 其他应用创建的媒体文件,删除时需要向用户申请单独授权

步骤1:修改查询逻辑,仅过滤MyFolder下的图片

你原有查询是返回所有图片,需要新增筛选条件,推荐使用MediaStore.Images.Media.RELATIVE_PATH(Android 10及以上生效)精准匹配路径,避免不同目录下重名文件夹的干扰:

String[] projection = new String[]{
        MediaStore.Images.Media._ID,
        MediaStore.Images.Media.DATE_TAKEN
};
Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
final String orderBy = MediaStore.Images.Media.DATE_TAKEN + " DESC";
// 筛选条件:相对路径等于Pictures/MyFolder/,注意末尾必须带斜杠
String selection = MediaStore.Images.Media.RELATIVE_PATH + " = ?";
String[] selectionArgs = new String[]{"Pictures/MyFolder/"};

Cursor cur = context.getContentResolver().query(images,
        projection,
        selection,
        selectionArgs,
        orderBy
);

注:MediaStore.Images.Media.DATA在Android 10及以上已被废弃,不要继续使用该字段做路径判断。


步骤2:使用ContentResolver删除图片

分两种场景处理:

场景1:删除应用自身创建的图片

查询到图片ID后直接调用delete方法即可:

if (cur != null && cur.moveToFirst()) {
    do {
        long imageId = cur.getLong(cur.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
        Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageId);
        context.getContentResolver().delete(imageUri, null, null);
    } while (cur.moveToNext());
    cur.close();
}

场景2:删除其他应用创建的图片

Android 11不允许直接删除第三方应用的媒体文件,需要通过系统提供的删除请求弹窗向用户申请授权:

if (cur != null && cur.moveToFirst()) {
    List<Uri> imageUris = new ArrayList<>();
    do {
        long imageId = cur.getLong(cur.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
        Uri imageUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageId);
        imageUris.add(imageUri);
    } while (cur.moveToNext());
    cur.close();
    
    // 构建批量删除请求
    PendingIntent deleteIntent = MediaStore.createDeleteRequest(context.getContentResolver(), imageUris);
    // 在Activity中启动授权弹窗,请求码自定义即可
    startIntentSenderForResult(deleteIntent.getIntentSender(), 1001, null, 0, 0, 0);
}

用户确认授权后,系统会自动完成批量删除操作,你可以在onActivityResult中接收操作结果。


替代方案

如果你的应用是文件管理器、相册类工具,可以申请MANAGE_EXTERNAL_STORAGE权限,获取所有文件的管理权限后可以直接删除任意目录的图片,但该权限需要Google Play审核通过才能上架,普通应用不建议使用。

内容的提问来源于stack exchange,提问作者Natheeshkumar Rangasamy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 21:39:02