Android6.0以后使用手机权限需要向用户申请,用户同意后才能使用权限。
思路
在Activity中定义好需要申请的权限,通过封装类去自动申请权限,以及回调。
一、checkSelPermission校验权限是否授权
public void checkSelPermission(Activity mActivity, String... permissions) {
//判断SDK版本
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {//如果是6.0以下,不申请
repPermissionResult.OnReqPermissionPass();
}
//未授权集合
List<String> stringList = new ArrayList<>();
for (String permission : permissions) {
//没有授权:PackageManager.PERMISSION_DENIED;已授权:PackageManager.PERMISSION_GRANTED
if (ContextCompat.checkSelfPermission(mActivity, permission) != PackageManager.PERMISSION_GRANTED) {
stringList.add(permission);
}
}
if (stringList != null && stringList.size() > 0) {
requertPermission(mActivity, stringList.toArray(new String[stringList.size()]));
} else {
repPermissionResult.OnReqPermissionPass();
}
}
二、requertPermission统一授权
private void requertPermission(Activity mActivity, String... permissions) {
ActivityCompat.requestPermissions(mActivity, permissions, ReqCode);
}
三、onReqPermissionResult授权回调
public void onReqPermissionResult(Activity mActivity,int reqCode, String[] permissions, int[] grantResults){
boolean hasPermissionDismiss = false;//有权限没有通过
if (reqCode == ReqCode) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == -1) {
hasPermissionDismiss = true;
}
}
if (hasPermissionDismiss) {
if (showSystemSetting) {
showSystemPermissionsSettingDialog(mActivity);//跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问
} else {
repPermissionResult.OnReqPermissionNoPass();
}
} else {
repPermissionResult.OnReqPermissionPass();
}
}
}
四、showSystemPermissionsSettingDialog禁止后提示跳转设置
AlertDialog mPermissionDialog;
public void showSystemPermissionsSettingDialog(final Activity mActivity) {
final String mPackName = mActivity.getPackageName();
if (mPermissionDialog == null) {
mPermissionDialog = new AlertDialog.Builder(mActivity)
.setMessage("已禁用权限,请手动授予")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
cancelPermissionDialog();
Uri packageURI = Uri.parse("package:" + mPackName);
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
mActivity.startActivity(intent);
mActivity.finish();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//关闭页面或者做其他操作
cancelPermissionDialog();
//mContext.finish();
repPermissionResult.OnReqPermissionNoPass();
}
})
.create();
}
mPermissionDialog.show();
}
五、RepPermissionResult权限申请结果回调
public interface RepPermissionResult {
//通过
void OnReqPermissionPass();
void OnReqPermissionNoPass();
}
六、使用
1、在Activity中新建RequestPermission 对象
public RequestPermission requestPermission;
2、在Oncreat中实例化
requestPermission = RequestPermission.getInstance();
(这里解释一下为啥要使用对象去实例化,为啥不直接用getInstance(),如果直接用getInstance(),会导致如果权限已经申请过了,但是没有设置相应的回调,那么下面的回调接口就会导致空指针异常,所以这里用实例化对象调用。)
3、使用
将需要申请的权限写进数组里
String[] permissions = new String[]{
Manifest.permission.CAMERA,
Manifest.permission.INTERNET};
设置回调
requestPermission.setRepPermissionResult(new RequestPermission.RepPermissionResult() {
@Override
public void OnReqPermissionPass() {
toastUtil.showToast(ToastUtil.PRIMARY, "成功啦");
}
@Override
public void OnReqPermissionNoPass() {
toastUtil.showToast(ToastUtil.ERROR, "失败啦");
}
});
申请权限
requestPermission.checkSelPermission(BaseActivity.this, permissions);
重写onRequestPermissionsResult方法,将回调传入封装类中
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
requestPermission.onReqPermissionResult(this, requestCode, permissions, grantResults);
}
完成,enjoy!
完整代码
public class RequestPermission {
public static RequestPermission requestPermission;
public static final int ReqCode = 0x001;
public static boolean showSystemSetting = true;
public RepPermissionResult repPermissionResult;
private RequestPermission() {}
public static RequestPermission getInstance() {
if (requestPermission == null) {
return new RequestPermission();
}
return requestPermission;
}
public void setRepPermissionResult(RepPermissionResult repPermissionResult) {
this.repPermissionResult = repPermissionResult;
}
/**
* 校验权限是否授权,如果没有授权就去申请权限
* @param mActivity activity对象
* @param permissions 权限集合
* @return
*/
public void checkSelPermission(Activity mActivity, String... permissions) {
//判断SDK版本
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {//如果是6.0以下,不申请
repPermissionResult.OnReqPermissionPass();
}
//未授权集合
List<String> stringList = new ArrayList<>();
for (String permission : permissions) {
//没有授权:PackageManager.PERMISSION_DENIED;已授权:PackageManager.PERMISSION_GRANTED
if (ContextCompat.checkSelfPermission(mActivity, permission) != PackageManager.PERMISSION_GRANTED) {
stringList.add(permission);
}
}
if (stringList != null && stringList.size() > 0) {
requertPermission(mActivity, stringList.toArray(new String[stringList.size()]));
} else {
repPermissionResult.OnReqPermissionPass();
}
}
/**
* 统一申请权限
* @param mActivity
* @param permissions
*/
private void requertPermission(Activity mActivity, String... permissions) {
ActivityCompat.requestPermissions(mActivity, permissions, ReqCode);
}
public void onReqPermissionResult(Activity mActivity,int reqCode, String[] permissions, int[] grantResults){
boolean hasPermissionDismiss = false;//有权限没有通过
if (reqCode == ReqCode) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == -1) {
hasPermissionDismiss = true;
}
}
if (hasPermissionDismiss) {
if (showSystemSetting) {
showSystemPermissionsSettingDialog(mActivity);//跳转到系统设置权限页面,或者直接关闭页面,不让他继续访问
} else {
repPermissionResult.OnReqPermissionNoPass();
}
} else {
repPermissionResult.OnReqPermissionPass();
}
}
}
/**
* 不再提示权限时的展示对话框
*/
AlertDialog mPermissionDialog;
public void showSystemPermissionsSettingDialog(final Activity mActivity) {
final String mPackName = mActivity.getPackageName();
if (mPermissionDialog == null) {
mPermissionDialog = new AlertDialog.Builder(mActivity)
.setMessage("已禁用权限,请手动授予")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
cancelPermissionDialog();
Uri packageURI = Uri.parse("package:" + mPackName);
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
mActivity.startActivity(intent);
mActivity.finish();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//关闭页面或者做其他操作
cancelPermissionDialog();
//mContext.finish();
repPermissionResult.OnReqPermissionNoPass();
}
})
.create();
}
mPermissionDialog.show();
}
public void cancelPermissionDialog() {
mPermissionDialog.dismiss();
}
public interface RepPermissionResult {
//通过
void OnReqPermissionPass();
void OnReqPermissionNoPass();
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容