Android權限處理(6.0以上、6.0以下)

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);
    }

}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,667評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,500評論 19 139
  • 發(fā)熱放入Android6.0帶來了新的權限管理方式,根據(jù)提供的官方文檔,再加上自己的理解,做了以下匯總僅供大家伙參...
    PapiAP閱讀 1,841評論 0 6
  • 新的一天開始了,經(jīng)過昨天一天的游戲,孩子們已經(jīng)開始打開了。 今天我會帶孩子們玩游戲闖關,練大腦的靈活性和記憶力,拓...
    阿寧sunny閱讀 601評論 0 4
  • 不知道出于什么原因,腦子總是強迫性的思考一些東西,不斷重復,所以試著從記錄的方式輸出自己的觀點,輸出自己的想法。 ...
    知識改變棟棟閱讀 277評論 0 0

友情鏈接更多精彩內(nèi)容