该权限在xml中声明

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />

申请权限,主要用到如下4个函数

检查权限

int checkSelfPermission(String)

申请权限

void requestPermissions(int, String...)

是否应该显示请求权限的说明

boolean shouldShowRequestPermissionRationale(String)

处理权限结果回调

void onRequestPermissionsResult(int,String[],int[])

上述四个方法中,前三个方法在support-v4ActivityCompat中都有,建议使用兼容库中的方法。最后一个方法是用户授权或者拒绝某个权限组时系统会回调Activity或者Fragment中的方法。

checkSelfPermission的返回值有如下两种

已拒绝 PackageManager.PERMISSION_DENIED
已授权 PackageManager.PERMISSION_GRANTED

动态权限申请

Android 6.0之上Android11以下申请权限

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {// 6.0
    String[] perms = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_PHONE_STATE};
    for (String p : perms) {
        int ret = ContextCompat.checkSelfPermission(activity, p);
        if (ret != PackageManager.PERMISSION_GRANTED) {
            //TODO 跳转到权限页,请求权限
            return;
        }
    }
}

Android11申请权限

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    //判断是否有管理外部存储的权限
    if (!Environment.isExternalStorageManager()) {
        //TODO 跳转到权限页,请求权限
    }
}

跳转系统授权页面

跳转到“应用信息”页面,安卓默认只能跳转到 "应用信息"页面,但是国内手机厂商大多支持各自自定义的Intent,直接跳到应用程序权限页面

/**
 * 当前应用详情页面(在该页面单击权限,进入的是权限组页面)
 */
public static void goAppDetailsSettings(Context context) {
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    intent.setData(Uri.fromParts("package", context.getPackageName(), null));
    context.startActivity(intent);
}
最后修改:2023 年 06 月 08 日 10 : 06 PM
如果觉得此文章有用,请随意打赏