Android6.0之后,官方将权限分为普通权限和危险权限,危险权限血需要动态设置
危险权限
- CAMERA
- READ_CALENDAR、WRITE_CALENDAR
- READ_CONTACTS、WRITE_CONTACTS、GET_ACCOUNTS
- ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION
- READ_AUDIO
- READ_PHTONE_STATE、CALL_PHONE、READ_CALL_LOG、WRITE_CALL_LOG、ADD_VOICEMAIL、USE_SIP、PROCESS_OUTGOING_CALLS
- BODY_SENSORS
- SEND_SMS、RECEIVE_SMS、READ_SMS、RECEIVE_WAP_PUSH、RECEIVE_MMS
- READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE
检查权限
// 调用系统检测权限方法, 返回一个int值
ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION)
// 缺失权限,值为-1
PackageManager.PERMISSION_DENIED
// 拥有该权限,值为0
PackageManager.PERMISSION_GRANTED
请求权限
请求权限方法,该方法会回调onRequestPermissionsResult
方法
// 字符串数组,里面申明需要得权限
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE);
请求权限回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_LOCATION_CODE) {
if (grantResults.length > 0) {
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION)) {
// shouldShowRequestPermissionRationale方法判断用户是否点击了不在提示,为true时下次还会出现,false之后就不会出现请求的弹窗,此时提示用户应该开启权限
new AlertDialog.Builder(getContext())
.setMessage("需要开启权限才能使用该功能")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 前往系统设置权限得位置
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", getContext().getPackageName(), null));
startActivity(intent);
}
})
.setNegativeButton("取消", null)
.create()
.show();
} else {
Toast.makeText(getContext(), "XX权限被拒绝,请前往设置开启权限", Toast.LENGTH_SHORT).show();
}
}
}
}
}
}