前言
今天改公司项目的 bug
时发现 Android10
的手机上无法访问指定路径的图片文件,出现 open failed: EACCES (Permission denied)
权限不足的错误。
原因
Android 10
中即使在 Manifest
里面申请了
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
存储读取权限,并且 App
动态获得了权限,在通过绝对路径打开文件时,也有可能出现 open failed: EACCES (Permission denied)
权限不足的错误。
官方文档的解释是:以 Android 10(API 级别 29)
及更高版本为目标平台的应用在默认情况下被赋予了对外部存储设备的分区访问权限(即分区存储)。此类应用只能看到本应用专有的目录(通过 Context.getExternalFilesDir()
访问)以及特定类型的媒体。
解决
这种分区存储限制了应用通过绝对路径去打开文件,不能通过 File file = new File(filePath)
去打开,这类路径不具有直接内核访问权限。要访问此类文件,应用必须使用 MediaStore
,并调用 openFile()
等方法。
如果不得不从绝对路径中打开文件,可以通过在 Manifest
的 application
标签里面加上如下代码:
android:requestLegacyExternalStorage="true"
来使用旧版本的存储规则,解决问题。