Android動態(tài)申請權限
從 Android 6.0(API 級別 23)開始,用戶開始在應用運行時向其授予權限,而不是在應用安裝時授予。此方法可以簡化應用安裝過程,因為用戶在安裝或更新應用時不需要授予權限。它還讓用戶可以對應用的功能進行更多控制;例如,用戶可以選擇為相機應用提供相機訪問權限,而不提供設備位置的訪問權限。用戶可以隨時進入應用的“Settings”屏幕調(diào)用權限。
我們大多數(shù)情況都是處理,Android 6.0以上的動態(tài)申請權限, 忽略了6.0以下的權限處理。最新在項目中就出現(xiàn)了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)) {
//已經(jīng)禁止提示了
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)) {
//已經(jīng)禁止提示了
Toast.makeText(activity, "您已禁止該權限,需要重新開啟。", Toast.LENGTH_SHORT).show();
} else {
//請求申請的權限
ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode);
}
} else {
callback.onHavePermissionCallback(permission, requestCode);
}
}
下面是調(diào)用方式:
//Manifest.permission.CAMERA 攝像頭權限
//100 請求的code值,回調(diào)使用
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 檢查攝像頭權限已經(jīng)通過,此處處理權限通過邏輯
}
});
}
系統(tǒng)回調(diào)
//系統(tǒng)回調(diào)的方法
@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處理權限通過的業(yè)務
} else {
//用戶拒絕授權
}
break;
}
}
(二、) 針對6.0以下
很多時候我們習慣性遺忘掉了6.0以下的權限處理,使用5.0Android系統(tǒng),去設置里面把應用的權限全部禁用掉了,出現(xiàn)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);
}
}