Android 運(yùn)行時(shí)權(quán)限檢查通用工具類

Android 6.0及以上系統(tǒng)運(yùn)行時(shí)權(quán)限是要?jiǎng)討B(tài)申請(qǐng)的,如果沒(méi)有申請(qǐng)比如相機(jī)權(quán)限、定位權(quán)限等敏感權(quán)限,直接運(yùn)行在Android 6.0及以上系統(tǒng)會(huì)閃退。
根據(jù)谷歌提供的申請(qǐng)權(quán)限教程,個(gè)人覺(jué)得很繁瑣,每次寫(xiě)重復(fù)代碼顯得很無(wú)聊,因此我封裝了一個(gè)通用檢查工具類。
一、在BaseActivity中封裝權(quán)限檢查回調(diào)接口
聲明一個(gè)回調(diào)接口,用一個(gè)List保存回調(diào),對(duì)外提供添加回調(diào)方法,重寫(xiě)Activity的onRequestPermissionsResult權(quán)限回調(diào)方法回調(diào)自定義的接口

   /**
     * TODO 權(quán)限回調(diào)接口
     */
  public interface PermissionCallBack {
        void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                        @NonNull int[] grantResults);
    }

 private List<PermissionCallBack> permissionCallBacks = null;
/**
     * TODO 添加Activity權(quán)限申請(qǐng)回掉
     */
    public void addRequestPermissionsResult(PermissionCallBack callback) {
        if (permissionCallBacks == null) {
            permissionCallBacks = new ArrayList<>();
        }

        if (permissionCallBacks.size() >= 1) {
            permissionCallBacks.clear();
        }
        permissionCallBacks.add(callback);
    }
   //系統(tǒng)權(quán)限申請(qǐng)回調(diào),這里調(diào)用我定義的回調(diào)
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (permissionCallBacks == null) return;
        for (PermissionCallBack callBack : permissionCallBacks) {
            callBack.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }

    }

二、創(chuàng)建CheckPermissionUtils,用于申請(qǐng)權(quán)限
自定義請(qǐng)求結(jié)果回調(diào),分為有權(quán)限和有權(quán)限。通用權(quán)限檢查步驟為先檢查有沒(méi)有權(quán)限,如果沒(méi)有,先給需要申請(qǐng)權(quán)限的Activity增加權(quán)限申請(qǐng)回調(diào),在這個(gè)回調(diào)中檢查結(jié)果,處理結(jié)果,然后發(fā)起權(quán)限申請(qǐng)。

public interface PermissionRequestCallback {
        void hasPermission();

        void noPermission();
    }
    /**
     * 通用檢查權(quán)限方法
     * @param context
     * @param permissions 權(quán)限數(shù)組
     * @param requestPermissionCode 請(qǐng)求權(quán)限時(shí)的activity 請(qǐng)求碼
     * @param permissionName 權(quán)限中文名稱
     * @param callback  權(quán)限回調(diào)
     */
    public static void checkPermission(final BaseActivity context, final String[] permissions, final int requestPermissionCode, final String permissionName, final PermissionRequestCallback callback) {
        if (hasPermission(context,permissions)) {  
            callback.hasPermission();
        } else {

          //沒(méi)有權(quán)限,則先給Activity增加一個(gè)我們自定義的權(quán)限結(jié)果回調(diào)
            context.addRequestPermissionsResult(new BaseActivity.PermissionCallBack() {
                @Override
                public void onRequestPermissionsResult(int requestCode, @NonNull String[]
                        permissions, @NonNull int[] grantResults) {

                    if (requestCode == requestPermissionCode && grantResults != null&&grantResults.length>0) {
                        if (checkGrantResult(grantResults,permissions.length)) {
                       
                            callback.hasPermission();
                        } else {
                         
                            callback.noPermission();
                          
                        }
                    }
                }
            });

            if (shouldShowRequestPermissionRationale(context, permissions)) {//給用戶一個(gè)解釋
               // Logs.base.d("應(yīng)該展示一個(gè)UI提示:ShowRequestPermissionRationale %s權(quán)限",permissionName);
                Dialogs.showMustConfirmDialog(context, "權(quán)限申請(qǐng)", String.format("%s需要獲得%s權(quán)限才能正常使用此功能,請(qǐng)?jiān)试S!", appLabel, permissionName), new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ActivityCompat.requestPermissions(context, permissions, requestPermissionCode);
                    }
                });

            }else{
                //請(qǐng)求權(quán)限
                ActivityCompat.requestPermissions(context, permissions, requestPermissionCode);
            }


        }


    }
    //是不是要給一個(gè)用戶一個(gè)解釋
    public static boolean shouldShowRequestPermissionRationale(Activity context, String[] permissions) {
        for (int i = 0; i < permissions.length; i++) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(context,permissions[i])){
                return true;
            }
        }
        return false;
    }

    public static boolean hasPermission( Activity context,String[] permissions) {
        for (int i = 0; i < permissions.length; i++) {
           if (ActivityCompat.checkSelfPermission(context, permissions[i])
                    != PackageManager.PERMISSION_GRANTED){
               return false;
           }
        }
        return true;
    }
   //檢查授權(quán)結(jié)果
    public static boolean checkGrantResult(int[] grantResults,int permissionCount) {
        for (int i = 0; i < permissionCount; i++) {
            if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
              return false;
            }
        }
        return true;
    }

三、使用權(quán)限工具類
只需要在Activity中調(diào)用即可

 private static final int REQUEST_CAMERA_PERMISSION = 997;
 private static String[] cameraPermissions = {Manifest.permission.CAMERA};//相機(jī)權(quán)限

  CheckPermissionUtils. checkPermission(this, cameraPermissions, REQUEST_CAMERA_PERMISSION, "相機(jī)", new CheckPermissionUtils.PermissionRequestCallback() {
                @Override
                public void hasPermission() {
               //有權(quán)限,可以安全地做操作了
                }
                @Override
                public void noPermission() {
                    ToastHelper.makeImgToast("沒(méi)有訪問(wèn)相機(jī)的權(quán)限,請(qǐng)打開(kāi)訪問(wèn)權(quán)限再試");
                }
            });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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