Android文件读写权限变更
Android文件读写权限变更
一大堆同学在读写文件时遇到权限问题,
Permission denied
Android10以前的访问
一般情况下,我们在清单文件声明读写权限,然后Android6.0开始要动态申请权限。
如何动态申请权限?请查看这篇文章
Android10文件管理
管理分区外部存储访问
为了让用户更好地管理自己的文件并减少混乱,以 Android 10(API 级别 29)及更高版本为目标平台的应用在默认情况下被赋予了对外部存储设备的分区访问权限(即分区存储)。此类应用只能看到本应用专有的目录(通过 Context.getExternalFilesDir() 访问)以及特定类型的媒体。除非您的应用需要访问存放在应用的专有目录以及 MediaStore 之外的文件,否则最好使用分区存储。
也就是通过Context.getExternalFilesDir(String type)这个方法获取到的分区存储,默认就有权限的。
这个路径是啥呢?
看类型了
{@link android.os.Environment#DIRECTORY_MUSIC},
{@link android.os.Environment#DIRECTORY_PODCASTS},
{@link android.os.Environment#DIRECTORY_RINGTONES},
{@link android.os.Environment#DIRECTORY_ALARMS},
{@link android.os.Environment#DIRECTORY_NOTIFICATIONS},
{@link android.os.Environment#DIRECTORY_PICTURES},
{@link android.os.Environment#DIRECTORY_MOVIES}.
/storage/emulated/0/Android/data/包名/files/类型
如果你填写null或者""则会没有类型
/storage/emulated/0/Android/data/包名/files
当然啦,你也可以自定义命名
比如说我写了otaPackages
那么这个路径就是
/storage/emulated/0/Android/data/包名/files/otaPackages
理解了吗?
这个不需要权限,类似于我们以前的扩展卡,只是现在扩展卡也分包名管理了,这样子不会凌乱。
影响范围:
重点:自己的,不需要权限。
官方有一直在强调
使用分区存储的应用对自己创建的文件始终拥有读/写权限,无论文件是否位于应用的专有目录内。因此,如果您的应用仅保存和访问自己创建的文件,则无需请求获得 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE 权限。
什么情况下需要权限?
若要访问其他应用创建的文件,则必须满足以下两个条件:
- 您的应用已获得 READ_EXTERNAL_STORAGE 权限。
- 这些文件位于以下其中一个明确定义的媒体集合中:
- 照片:存储在 MediaStore.Images 中。
- 视频:存储在 MediaStore.Video 中。
- 音频文件:存储在 MediaStore.Audio 中。
为了访问其他应用创建的任何其他文件(包括“downloads”目录下的文件),您的应用必须使用存储访问框架,该框架允许用户选择特定文件。
注意:使用分区存储的应用对于 /sdcard/DCIM/IMG1024.JPG 这类路径不具有直接内核访问权限。要访问此类文件,应用必须使用 MediaStore,并调用 openFile() 等方法。
警告:明年,主要平台版本将要求所有应用都使用分区存储,无论应用的目标 SDK 级别是多少。因此,您应该提前确保您的应用能够使用分区存储。为此,请确保针对搭载 Android 10(API 级别 29)及更高版本的设备启用了该行为。
如果你的版本还要用以前那套管理方式,怎么整呢?
官方文档说了
在清单文件里添加这个配置项
<manifest ... >
<!-- This attribute is "false" by default on apps targeting
Android 10 or higher. -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>