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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:03:19