Android动态申请权限
从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;例如,用户可以选择为相机应用提供相机访问权限,而不提供设备位置的访问权限。用户可以随时进入应用的“Settings”屏幕调用权限。
我们大多数情况都是处理,Android 6.0以上的动态申请权限, 忽略了6.0以下的权限处理。最新在项目中就出现了6.0以下权限处理,导致APP运行异常。
(一、) 针对6.0以上(包含6.0)处理
工具类:Frgment的处理
public static void checkPermissionByFragment(Context context, Fragment fragment, String permission, int requestCode, HavePermissionCallback callback) {
//检查权限
if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
//进入到这里代表没有权限.
if (fragment.shouldShowRequestPermissionRationale(permission)) {
//已经禁止提示了
Toast.makeText(context, "您已禁止该权限,需要重新开启。", Toast.LENGTH_SHORT).show();
} else {
fragment.requestPermissions(new String[]{permission}, requestCode);
}
} else {
callback.onHavePermissionCallback(permission, requestCode);
}
}
工具类:Activity的处理
public static void checkPermissionByActivity(Activity activity, String permission, int requestCode, HavePermissionCallback callback) {
//检查权限
if (ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED) {
//进入到这里代表没有权限.
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
//已经禁止提示了
Toast.makeText(activity, "您已禁止该权限,需要重新开启。", Toast.LENGTH_SHORT).show();
} else {
//请求申请的权限
ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode);
}
} else {
callback.onHavePermissionCallback(permission, requestCode);
}
}
下面是调用方式:
//Manifest.permission.CAMERA 摄像头权限
//100 请求的code值,回调使用
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PermissionUtil.checkPermissionByFragment(getActivity(), this, Manifest.permission.CAMERA,100, new HavePermissionCallback() {
@Override
public void onHavePermissionCallback(String permission, int requestCode) {
//TODO 检查摄像头权限已经通过,此处处理权限通过逻辑
}
});
}
系统回调
//系统回调的方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 100://前面申请的权限code
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//用户同意授权
//TODO处理权限通过的业务
} else {
//用户拒绝授权
}
break;
}
}
(二、) 针对6.0以下
很多时候我们习惯性遗忘掉了6.0以下的权限处理,使用5.0Android系统,去设置里面把应用的权限全部禁用掉了,出现APP异常运行处理。
主要是针对摄像头的权限处理。
//Android6.0以下的摄像头权限处理:
public static boolean isCameraCanUse() {
boolean canUse = true;
Camera mCamera = null;
try {
mCamera = Camera.open();
// setParameters 是针对魅族MX5 做的。MX5 通过Camera.open() 拿到的Camera
Camera.Parameters mParameters = mCamera.getParameters();
mCamera.setParameters(mParameters);
} catch (Exception e) {
canUse = false;
}
if (mCamera != null) {
mCamera.release();
}
return canUse;
}
完整权限逻辑处理:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PermissionUtil.checkPermissionByFragment(getActivity(), this, Manifest.permission.CAMERA, REQUEST_PERMSSION_REQUEST_CODE_CAMERA, new HavePermissionCallback() {
@Override
public void onHavePermissionCallback(String permission, int requestCode) {
//TODO 处理逻辑
}
});
} else {
if (PermissionUtil.isCameraCanUse()) {//针对6.0以下
//TODO 处理逻辑
} else {
ToastUtils.show(this.getContext(), "未开启摄像头权限,部分功能无法使用", Toast.LENGTH_SHORT);
}
}
网友评论