Android6.0权限需要主动申请已经很久了,这里写一篇文章记录下。
这类的文章也很多,各位可以百度参考下,下面我只是把权限申请的逻辑详细介绍下,并附上DEMO代码。
具体逻辑可以看上面的图片,逻辑已经很详细了。
请求单个权限
public void startCamera(View view) {
requestPermission(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS);
}
private void requestPermission(String... permissions) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
// 第一次请求权限时,用户如果拒绝,下一次请求shouldShowRequestPermissionRationale()返回true
// 向用户解释为什么需要这个权限
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
new AlertDialog.Builder(this)
.setMessage("申请相机权限")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//申请相机权限
ActivityCompat.requestPermissions(SinglePermissionActivity.this,
new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
}
})
.show();
} else {
//申请相机权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST_CODE);
}
} else {
tvPermissionStatus.setTextColor(Color.GREEN);
tvPermissionStatus.setText("相机权限已申请");
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
tvPermissionStatus.setTextColor(Color.GREEN);
tvPermissionStatus.setText("相机权限已申请");
} else {
//用户勾选了不再询问
//提示用户手动打开权限
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
tvPermissionStatus.setText("相机权限已被禁止,需手动打开");
tvPermissionStatus.setTextColor(Color.RED);
} else {
tvPermissionStatus.setText("相机权限已被禁止,可再次申请");
tvPermissionStatus.setTextColor(Color.RED);
}
}
}
}
请求多个权限
public void startCamera(View view) {
requestPermission(Manifest.permission.CAMERA, Manifest.permission.READ_CONTACTS);
}
private void requestPermission(String... permissions) {
List<String> deniedPermissions = findDeniedPermissions(this, permissions);
if (deniedPermissions.size() > 0) {
ActivityCompat.requestPermissions(this,
deniedPermissions.toArray(new String[deniedPermissions.size()]), CAMERA_REQUEST_CODE);
} else {
tvPermissionStatus.setText("相机、联系人权限已申请");
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_REQUEST_CODE) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
builder.append(permissions[i] + "权限已申请" + "\n");
} else {
//用户勾选了不再询问,提示用户手动打开权限
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {
builder.append(permissions[i] + "权限已被禁止,需手动打开" + "\n");
} else {
builder.append(permissions[i] + "权限已被禁止,可再次申请" + "\n");
}
}
}
tvPermissionStatus.setText(builder.toString());
}
}
@TargetApi(value = Build.VERSION_CODES.M)
public List<String> findDeniedPermissions(Context context, String... permission) {
List<String> denyPermissions = new ArrayList<>();
for (String value : permission) {
if (ContextCompat.checkSelfPermission(context, value) != PackageManager.PERMISSION_GRANTED) {
denyPermissions.add(value);
}
}
return denyPermissions;
}