如何修复Android删除外部SD卡文件时的‘EACCES(权限被拒绝)’错误?
看起来你在非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




