android11 申请所有文件访问权限

Android 11 引入了强制执行分区存储的限制,导致应用默认不能访问外部文件。
针对以前涉及较多文件的操作,可采用申请所有文件访问权限的方式来解决这一问题,实现方式如下。
(虽然这样做安全性低,官方并不推荐这样,但确实最快适配原有应用程序的方式)

1. AndroidManifest.xml中添加如下内容:
用于声明应用程序需要使用 MANAGE_EXTERNAL_STORAGE 权限。同时,使用了 tools:ignore=“ScopedStorage” 来忽略与分区存储(Scoped Storage)相关的 Lint 检查。

     <!-- Android11额外添加 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    tools:ignore="ScopedStorage" />

2. 申请所有文件访问权限,该操作会跳转到所有文件权限申请页面

    // 请求文件访问权限的请求码,可以是任意整数值
    private static final int REQUEST_MANAGE_FILES_ACCESS = 2;
    //申请所有文件访问权限
    public void requestPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            //判断是否有管理外部存储的权限
            if (!Environment.isExternalStorageManager()) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                intent.setData(Uri.parse("package:" + getPackageName()));
                startActivityForResult(intent, REQUEST_MANAGE_FILES_ACCESS);
            } else {
                // TODO: 2023/11/22  
                // 已有所有文件访问权限,可直接执行文件相关操作
            }
        } else {
            // TODO: 2023/11/22  
            //非android11及以上版本,走正常申请权限流程
        }
    }

android11 申请所有文件访问权限_第1张图片
3. 获取用户授权情况

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_MANAGE_FILES_ACCESS) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                if (Environment.isExternalStorageManager()) {
                    // TODO: 2023/11/22  
                    // 用户已经授予文件访问权限
                    // 在这里执行创建文件夹和初始化数据库的操作
                } else {
                   	// TODO: 2023/11/22  
                    // 用户尚未授予文件访问权限
                    // 可以在此处处理用户未授予权限的情况
                    
                }
            }
        }
    }

你可能感兴趣的:(android,android11)