Android6.0 动态权限

权限组:




































1. 检查是否有权限

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
        }
     }

2. 申请权限

private static final int MY_PERMISSIONS_REQUESTS = 1001;
final String[] permissions = {
Manifest.permission.READ_EXTERNAL_STORAG,
Manifest.permission.READ_SMS,
Manifest.permission.USE_FINGERPRINT,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_CONTACTS,
Manifest.permission.CAMERA,
Manifest.permission.READ_CALENDAR
}
ActivityCompat.requestPermissions(this,permissions,MY_PERMISSIONS_REQUESTS);

3.是否显示权限说明(提示)信息

ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)
此方法在第一次申请权限时返回false,点击allow后返回false。在点击deny后调用返回true,此时可以给出提示信息。
在勾选不在询问后返回false。

if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
// 显示给用户的解释
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(“没有读写SD卡的权限,请先申请”);
builder.setIcon(R.mipmap.ic_launcher);
builder.setNegativeButton(“确定”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//确定逻辑->申请权限操作
}
});
builder.setPositiveButton(“取消”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//取消的逻辑
}
});
builder.create().show();
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
permissions,
MY_PERMISSIONS_REQUESTS);
}

Android6.0 动态权限_第1张图片

4.对权限申请结果的处理

重写Activity的onRequestPermissionsResult方法,在Fragment中重写onRequestPermissionsResult时,注意需要调用super.onRequestPermissionsResult

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// public static final int PERMISSION_DENIED = -1;
// public static final int PERMISSION_GRANTED = 0;
if (requestCode == MY_PERMISSIONS_REQUESTS) {
if (permissions.length > 0) {
for (String permission : permissions) {
//返回申请列表的权限
Log.d(“tag”, “permission–>” + permission );
}
if (grantResults.length > 0) {
for (int i : grantResults) {
Log.d(“tag”, “result—>” + i);
}
}
}
}
}

5.在处理权限问题时,有时需要跳转到权限设置界面,方法如下(调研时发现需要机型适配,以后再说):

public static void toSelfSetting(Context context) {
Intent mIntent = new Intent();
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 9) {
mIntent.setAction(“android.settings.APPLICATION_DETAILS_SETTINGS”);
mIntent.setData(Uri.fromParts(“package”, context.getPackageName(), null));
} else if (Build.VERSION.SDK_INT <= 8) {
mIntent.setAction(Intent.ACTION_VIEW);
mIntent.setClassName(“com.android.settings”, “com.android.setting.InstalledAppDetails”);
mIntent.putExtra(“com.android.settings.ApplicationPkgName”, context.getPackageName());
}
context.startActivity(mIntent);
}

可以参考:https://blog.csdn.net/donkor_/article/details/79374442,适配得比较详细(未验证)

你可能感兴趣的:(Android)