Android 6.0+ 动态权限获取(包含对Android 10+Android11+的支持)
Xayah Lv3

原CSDN博客地址

Android6.0 开始,权限获取不再是简单地在 AndroidManifest.xml 添加几行代码了, Google 引入了 动态权限 的概念,需要在代码中添加。

添加步骤(以读取和写入权限为例):

  1. AndroidManifest.xml 中添加权限

    1
    2
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. Android10 开始,还需要添加:

    1
    2
    3
    4
    <application
    android:requestLegacyExternalStorage="true"
    ...
    </application>
  3. Activity 相应位置调用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == -1) {
    // 没有Write权限,动态获取
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{
    Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    Log.d("TAG", "onCreate: 申请获得Write权限!");
    } else {
    Log.d("TAG", "onCreate: 已获得Write权限!");
    }
    }

    然而在 Android11 开始,** WRITE_EXTERNAL_STORAGE** 等特殊权限的获取又发生了变化…

    image

    当仍沿用 Android10- 的权限获取方式时,会在调用权限时 抛出异常

    因为在 Andorid11+ 中, Google 添加了一个新的权限: MANAGE_EXTERNAL_STORAGE

    APP 动态请求权限时,会引导用户进入一个 权限设置界面

    image

    所以,在Android11+中:

    AndroidManifest.xml中添加权限:

    1
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    image

    该权限仅支持 Android11+

  4. 在Activity相应位置调用:

    1
    2
    3
    4
    5
    6
    7
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    // new一个intent转到系统设置界面
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
    intent.setData(Uri.parse("package:" + mContext.getPackageName()));
    // 1024为REQUEST_CODE
    startActivityForResult(intent, 1024);
    }
  5. 所以合并起来的代码是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public void getWriteRight() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    // new一个intent转到系统设置界面
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
    intent.setData(Uri.parse("package:" + mContext.getPackageName()));
    // 1024为REQUEST_CODE
    startActivityForResult(intent, 1024);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == -1) {
    // 没有Write权限,动态获取
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{
    Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    Log.d("TAG", "onCreate: 申请获得Write权限!");
    } else {
    Log.d("TAG", "onCreate: 已获得Write权限!");
    }
    }
    }
由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务
总字数 42.3k 访客数 访问量