在BaseActivity中申请APP所需要的危险权限,此处只列举了三项,
在所需要的activity中调用对应的权限判断,根据需要调用不同的空实现方法实现逻辑处理,对于小米、华为等手机,在第一点击拒绝后,将不再弹出提示信息,本人的做法是在点击拒绝后弹出提示框,告知用户此权限的重要性,并让用户点击设置去设置权限。设置按钮跳转到当前应用的设置界面,见最后代码。
// sd卡权限
private String[] SdCardPermission = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
//手机状态权限
private String[] readPhoneStatePermission = {Manifest.permission.READ_PHONE_STATE};
//定位权限
private String[] locationPermission = {Manifest.permission.ACCESS_FINE_LOCATION};
/**
* sd卡权限判断。当手机系统大于 23 时,才有必要去判断权限是否获取
*/
protected void judgeSdCardPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查该权限是否已经获取
int i = ContextCompat.checkSelfPermission(this, SdCardPermission[0]);
// 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
if (i != PackageManager.PERMISSION_GRANTED) {
// 如果没有授予该权限,就去提示用户请求
ActivityCompat.requestPermissions(this, SdCardPermission, 100);
}else{
doSdCardResult();
}
}else{
doSdCardResult();
}
}
/**
* 手机状态权限
*/
protected void judgePhoneStatePermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查该权限是否已经获取
int i = ContextCompat.checkSelfPermission(this, readPhoneStatePermission[0]);
// 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
if (i != PackageManager.PERMISSION_GRANTED) {
// 如果没有授予该权限,就去提示用户请求
ActivityCompat.requestPermissions(this, readPhoneStatePermission, 200);
}else{
doPhoeStateResult();
}
}
else{
doPhoeStateResult();
}
}
/**
* 定位权限
*/
protected void judgeLocationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查该权限是否已经获取
int i = ContextCompat.checkSelfPermission(this, locationPermission[0]);
// 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
if (i != PackageManager.PERMISSION_GRANTED) {
// 如果没有授予该权限,就去提示用户请求
ActivityCompat.requestPermissions(this, locationPermission, 300);
}else{
doLocationResult();
}
}else{
doLocationResult();
}
}
/**
* 用户权限 申请 的回调方法
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 100) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
doSdCardResult();
}
}else{
弹出对话框提示用户去设置,如果不设置直接退出
}
}
if (requestCode == 200) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
doPhoneStateResult();
}
else{
弹出对话框提示用户去设置,如果不设置直接退出
}
}
}
if (requestCode == 300) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
doLocationResult();
}
else{
弹出对话框提示用户去设置,如果不设置直接退出
}
}
}
}
/**
* 空实现,根据自己的需要做相应的逻辑处理
*/
protected void doSdCardResult() {}
protected void doPhoneStateResult() {}
protected void doLocationResult() {}
针对小米、华为等手机,跳转到当前应用设置界面
/**
* 跳转到当前应用设置界面
*/
private void jumpToSetting() {
isSettingFlag=true;
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package",getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
在onResume()方法中做判断,如果没有设置直接退出当前界面
@Override
protected void onResume() {
super.onResume();
if (isSettingFlag){
if (ActivityCompat.checkSelfPermission(this,CameraPermission[0])!=PackageManager.PERMISSION_GRANTED){
//如果没有获取权限
finish();
}else {
doCameraResult();
}
isSettingFlag=false;
}
}