微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MANAGE_EXTERNAL_STORAGE 在重启 android 11 设备时被撤销

如何解决MANAGE_EXTERNAL_STORAGE 在重启 android 11 设备时被撤销

MANAGE_EXTERNAL_STORAGE 特殊权限在重启后被撤销 您好!重现问题的步骤

  1. 使用目标 SDK 安装 APK 30 示例 APK LINK
  2. 授予存储权限和访问所有文件的特殊权限
  3. 重启设备

Boooom 转到系统设置并检查访问所有文件权限。

解决方法

我为 Android 11 实现了这样的代码,并且在重新启动时不会撤销存储访问

如果您的目标是 Android 11 (targetSdkVersion 30),那么您需要在 AndroidManifest.xml 中获得以下权限以进行修改和文档访问。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

对于 Android 10,您将以下行放在 AndroidManifest.xml 标记中

android:requestLegacyExternalStorage="true"

下面的方法检查权限是被允许还是被拒绝

private boolean checkPermission() {
    if (SDK_INT >= Build.VERSION_CODES.R) {
        return Environment.isExternalStorageManager();
    } else {
        int result = ContextCompat.checkSelfPermission(PermissionActivity.this,READ_EXTERNAL_STORAGE);
        int result1 = ContextCompat.checkSelfPermission(PermissionActivity.this,WRITE_EXTERNAL_STORAGE);
        return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED;
    }
}

Android 11 及以下版本可使用以下方法请求权限

private void requestPermission() {
    if (SDK_INT >= Build.VERSION_CODES.R) {
        try {
            Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
            intent.addCategory("android.intent.category.DEFAULT");
            intent.setData(Uri.parse(String.format("package:%s",getApplicationContext().getPackageName())));
            startActivityForResult(intent,2296);
        } catch (Exception e) {
            Intent intent = new Intent();
            intent.setAction(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
            startActivityForResult(intent,2296);
        }
    } else {
        //below android 11
        ActivityCompat.requestPermissions(PermissionActivity.this,new String[]{WRITE_EXTERNAL_STORAGE},PERMISSION_REQUEST_CODE);
    }
}

Android 11及以上版本处理权限回调

@Override
protected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
    super.onActivityResult(requestCode,resultCode,data);
    if (requestCode == 2296) {
        if (SDK_INT >= Build.VERSION_CODES.R) {
            if (Environment.isExternalStorageManager()) {
                // perform action when allow permission success
            } else {
                Toast.makeText(this,"Allow permission for storage access!",Toast.LENGTH_SHORT).show();
            }
        }
    }
}

处理 Android 11 以下操作系统版本的权限回调

@Override
public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0) {
                boolean READ_EXTERNAL_STORAGE = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                boolean WRITE_EXTERNAL_STORAGE = grantResults[1] == PackageManager.PERMISSION_GRANTED;

                if (READ_EXTERNAL_STORAGE && WRITE_EXTERNAL_STORAGE) {
                    // perform action when allow permission success
                } else {
                    Toast.makeText(this,Toast.LENGTH_SHORT).show();
                }
            }
            break;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。