Android 13(API 33)中file.delete()删除文件失败求助
Android R及以上版本删除外部存储公共目录文件失败的解决办法
Android 11(API 30)起引入分区存储机制,即便已申请READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限,直接调用File.delete()删除公共媒体目录(如Movies)下的文件也会失败——这类文件由系统媒体库统一管理,需通过对应API操作。
解决办法一:使用MediaStore API删除文件
通过MediaStore定位目标文件并执行删除,代码示例如下:
public boolean deleteTargetVideo(Context context, String filePath) { String selection = MediaStore.Video.Media.DATA + "=?"; String[] selectionArgs = new String[]{filePath}; ContentResolver resolver = context.getContentResolver(); // 执行删除,返回成功删除的条目数 int deletedCount = resolver.delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs); return deletedCount > 0; }
调用时传入上下文和目标文件路径///storage/emulated/0/Movies/RoveDashCam/Rove-R24K-PRO/Videos/2023_0322_205825_0019.MP4即可,返回true代表删除成功。
解决办法二:迁移至APP专属外部存储目录
如果该视频是你的APP下载生成的,建议将文件存储到APP专属外部目录,比如:
File appMoviesDir = new File(context.getExternalFilesDir(Environment.DIRECTORY_MOVIES), "RoveDashCam/Rove-R24K-PRO/Videos");
此目录属于APP私有空间,Android R及以上版本无需额外权限,可直接用File.delete()删除文件,同时避免了分区存储的限制。
额外说明
- Android 10(API 29)可在
AndroidManifest.xml中添加android:requestLegacyExternalStorage="true"临时兼容旧的File操作,但该属性在Android 11及以上版本会被忽略,不建议长期依赖。 - 若targetSdkVersion已升级至30+,必须适配分区存储逻辑,避免依赖旧的文件操作方式。
内容的提问来源于stack exchange,提问作者MARSH
相关产品推荐
相关产品推荐

