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
相关产品推荐
相关产品推荐

