- 初始化状态
isExternalStorageManager => false
READ_EXTERNAL_STORAGE => false
READ_EXTERNAL_STORAGE => false
MANAGE_EXTERNAL_STORAGE => false
- 仅在“应用权限”页面,打开存储权限中的“允许管理所有文件”
isExternalStorageManager => true
READ_EXTERNAL_STORAGE => true
WRITE_EXTERNAL_STORAGE => true
MANAGE_EXTERNAL_STORAGE => false
- 仅在“应用权限”页面,打开存储权限中的“仅允许访问媒体文件”
isExternalStorageManager => false
READ_EXTERNAL_STORAGE => true
WRITE_EXTERNAL_STORAGE => true
MANAGE_EXTERNAL_STORAGE => false
- 仅在“所有文件访问权限”页面,授予权限
isExternalStorageManager => true
READ_EXTERNAL_STORAGE => false
WRITE_EXTERNAL_STORAGE => false
MANAGE_EXTERNAL_STORAGE => false
因此,可以得出如下结论
- 不要尝试判断
MANAGE_EXTERNAL_STORAGE
权限,因为其永远为false isExternalStorageManager
、ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION
、ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
API,只能在安卓11及以上版本调用(低版本调用会闪退)- “应用权限”页面,打开存储权限中的“允许管理所有文件”会使得
isExternalStorageManager
变为true;但反之在“所有文件访问权限”页面授予权限,并不会改变WRITE_EXTERNAL_STORAGE
的允许情况
因此,为了兼容 安卓4.4-安卓12,在11以下,建议使用checkSelfPermission
方法进行存储权限判断;而安卓11及以上使用Environment.isExternalStorageManager
即可
Android 权限的变化, 几乎每个版本的SDK都会有, 其中最大的一次是在6.0时, 增加的动态权限申请。要访问管理外部存储的文件, 需增加MANAGE_EXTERNAL_STORAGE权限的申请
Android11改变了此前安卓系统对文件管理的规则,在Android11上,文件读写变成了特殊权限。应用默认只能读写自己的目录/android/data/包名,这就导致我们想修改某个文件里的内容,结果却没有读写权限。本文主要提供一种解决方法——root+adb。
Android 11文件管理权限申请,为什么需要这个权限,因为在Android 11后,无法直接在SDcard根目录写文件,Android 11之后要使用分区存储,但是分区存储使用起来很麻烦,所以可以申请文件管理权限,这样就可以随意读写SDcard了,写到根目录也没问题。
清单文件声明如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/a
Android继承了Linux中的文件权限机制,系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。文件或目录的访问权限分为**只读`(r)`**、**只写`(w)`** 和 **可执行`(x)`** 三种方式。
android 11 访问权限需要在AndroidManifest.xml中添加 android:requestLegacyExternalStorage="true"即可
Android11 无Root 访问data目录实现、Android11访问data目录、Android11解除data目录限制、Android11 data空白解决、SAF文件访问框架
private void requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// 先判断有没有权限