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

如何修复Android删除外部SD卡文件时的‘EACCES(权限被拒绝)’错误?

解决Android非Marshmallow设备删除外部SD卡文件的问题

看起来你在非6.0设备上删除SD卡文件时碰了壁,虽然已经加了Manifest权限但还是失败,我来给你梳理几个可能的解决方向,都是针对老版本Android的常见坑:

  • 先确认文件路径是否属于APP私有目录
    老Android设备对外部SD卡的权限限制其实很严格,只有APP自己在Android/data/你的应用包名/下创建的文件,或者通过getExternalFilesDir()获取的目录里的文件,你才能直接删除。如果是SD卡根目录、其他APP的文件夹或者系统目录里的文件,哪怕你有WRITE_EXTERNAL_STORAGE权限,也大概率删不掉——这是厂商ROM的限制,不是代码的问题。

  • 先修改文件自身的权限再删除
    有些文件可能被设置成了只读权限,哪怕APP有系统权限也没法直接删。你可以先尝试修改文件权限再执行删除:

    File targetFile = new File("/sdcard/你要删除的文件路径");
    if (targetFile.exists()) {
        // 先把文件改成可写、可执行
        targetFile.setWritable(true);
        targetFile.setExecutable(true);
        boolean isDeleted = targetFile.delete();
        if (isDeleted) {
            Log.d("Delete", "文件删除成功");
        } else {
            Log.e("Delete", "文件删除失败,检查路径或权限");
        }
    }
    
  • 如果是媒体文件,先通知媒体库再删除
    要是你删除的是照片、视频这类被系统媒体库索引的文件,直接删可能会遇到系统锁定文件的情况。可以先让媒体库扫描更新,再尝试删除:

    File mediaFile = new File("/sdcard/DCIM/test.jpg");
    MediaScannerConnection.scanFile(
        getApplicationContext(),
        new String[]{mediaFile.getAbsolutePath()},
        null,
        (path, uri) -> {
            // 扫描完成后执行删除
            mediaFile.delete();
        }
    );
    
  • 用系统Intent让用户授权删除
    要是以上方法都不行,你可以借助系统的删除Intent,让用户手动确认删除——这种方式绕开了APP的权限限制,因为是用户主动操作的:

    File targetFile = new File("/sdcard/你要删的文件");
    Uri fileUri = Uri.fromFile(targetFile);
    Intent deleteIntent = new Intent(Intent.ACTION_DELETE);
    deleteIntent.setData(fileUri);
    startActivityForResult(deleteIntent, 1001); // 自定义请求码
    

    之后在onActivityResult里判断是否删除成功即可。

  • 检查SD卡的挂载状态
    最后别忘了确认SD卡是正常挂载的,要是SD卡处于只读或者未挂载状态,肯定删不了:

    String sdCardState = Environment.getExternalStorageState();
    if (!Environment.MEDIA_MOUNTED.equals(sdCardState)) {
        Toast.makeText(this, "SD卡未正常挂载", Toast.LENGTH_SHORT).show();
        return;
    }
    

还要提一句:有些早期的定制ROM(比如小米、华为的旧版本)对SD卡的权限锁得特别死,哪怕你做了所有操作,也没法删除非私有目录的文件,这种情况下只能引导用户手动通过系统文件管理器删除了。

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

火山引擎 最新活动