You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android删除可移动SD卡(第二外部存储)文件失败求助

搞定Android外部SD卡文件删不掉的问题

兄弟,我太懂你这种试了各种方法都删不掉文件的抓狂感了!你遇到的核心问题其实是Android对可移除SD卡的权限限制——尤其是从Android 10(API 29)开始的分区存储规则,直接用File.delete()操作SD卡文件基本是行不通的,哪怕你换canonical或绝对路径也没用。

既然你的文件路径是从MediaStore拿的,那咱们就用最适配的方法来解决:

方法一:用MediaStore直接删除(最推荐,适配你的场景)

既然文件是从MediaStore获取的,那直接通过ContentResolver调用MediaStore的删除接口才是正道,步骤很简单:

  1. 先根据文件路径匹配MediaStore里的记录,然后调用删除方法。给你写个示例代码:
String targetFilePath = filesPath.get(0);
ContentResolver resolver = getContentResolver();

// 构建查询条件,精准匹配你要删的文件路径
String selection = MediaStore.Files.FileColumns.DATA + "=?";
String[] selectionArgs = new String[]{targetFilePath};

// 执行删除操作
int deletedCount = resolver.delete(
    MediaStore.Files.getContentUri("external"),
    selection,
    selectionArgs
);

// 检查结果
if (deletedCount > 0) {
    Log.e("MyLogs", "文件终于删掉啦!");
} else {
    Log.e("MyLogs", "还是没删掉,可能路径不对或者权限不够");
}

方法二:用存储访问框架(SAF)拿权限再删(适配所有SD卡文件)

如果上面的方法没生效,那你可以让用户手动授予SD卡目录的访问权限,用SAF来操作:

  1. 先启动SAF让用户选择SD卡目录:
Intent pickDirIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(pickDirIntent, 1001); // 1001是自定义的请求码
  1. 在回调里获取权限并删除文件:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1001 && resultCode == RESULT_OK) {
        Uri treeUri = data.getData();
        // 把权限持久化,下次打开APP不用再让用户选
        getContentResolver().takePersistableUriPermission(
            treeUri,
            Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION
        );

        // 找到你要删的文件(这里需要根据你的文件路径拆分定位,示例用文件名简化)
        DocumentFile rootDir = DocumentFile.fromTreeUri(this, treeUri);
        DocumentFile targetFile = rootDir.findFile("你要删除的文件名");
        
        if (targetFile != null && targetFile.delete()) {
            Log.e("MyLogs", "文件删除成功!");
        } else {
            Log.e("MyLogs", "删除失败,文件可能不存在或权限不足");
        }
    }
}

为啥你的原代码不管用?

给你唠唠原因,免得以后踩坑:

  • 可移除SD卡的文件,Android系统是严格限制APP直接操作的,File类的删除方法在这种场景下就是摆设,返回false很正常。
  • 从Android 10开始,WRITE_EXTERNAL_STORAGE权限已经不再给APP外部存储的完全访问权了,分区存储规则下,APP只能碰自己的私有目录和MediaStore里的文件。

另外还有几个小提醒:

  • 如果你用的是Android 11+,别在Manifest里加android:requestLegacyExternalStorage="true",这个是临时兼容旧版的,长远来看会被淘汰。
  • 测试的时候要确保文件没被其他APP占用,比如正在被播放器打开,这种情况也删不掉哦。

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

火山引擎 最新活动