Android分区存储下如何通过Media Store URI删除目录及内部所有文件
分区存储删除公共目录下自建文件夹解决方案
Android 10及以上的分区存储机制没有提供直接删除公共媒体目录下自建文件夹的API,你需要先删除该文件夹下所有已被MediaStore索引的文件,空文件夹会由系统自动回收,具体实现步骤如下:
- 第一步:查询
Pictures/somedir路径下的所有图片文件
构造MediaStore查询条件,筛选出存放在该目录下的所有图片资源,示例代码如下:
val projection = arrayOf(MediaStore.Images.Media._ID) val selection = "${MediaStore.Images.Media.RELATIVE_PATH} = ?" val selectionArgs = arrayOf("${Environment.DIRECTORY_PICTURES}/somedir/") val cursor = contentResolver.query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null )
- 第二步:批量删除查询到的所有文件
遍历游标拿到所有文件的URI,批量删除即可。注意Android 11及以上删除其他应用创建的媒体文件需要申请READ_MEDIA_IMAGES权限,删除时如果抛出RecoverableSecurityException,需要唤起系统授权弹窗让用户同意删除操作:
val idList = mutableListOf<Long>() cursor?.use { while (it.moveToNext()) { val id = it.getLong(it.getColumnIndexOrThrow(MediaStore.Images.Media._ID)) idList.add(id) } } if (idList.isNotEmpty()) { val deleteSelection = "${MediaStore.Images.Media._ID} IN (${idList.joinToString(",")})" contentResolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, deleteSelection, null) }
- 第三步:空目录自动清理
当该目录下所有媒体文件都被删除后,系统会自动扫描并清理这个空的somedir目录,不需要额外手动操作。如果需要立即生效,可以触发一次媒体库扫描。
注意事项
- 如果该目录下还存放了非图片类型的文件,需要对应到MediaStore的其他表(如Downloads、Video等)执行相同的查询删除操作,所有文件都删除后目录才会被回收
- 不要使用File API直接操作公共目录路径,分区存储下该操作无权限,会返回执行失败
内容的提问来源于stack exchange,提问作者user7431543
相关产品推荐
相关产品推荐

