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

Android 6.0及以上系統(tǒng)運行時權(quán)限是要動態(tài)申請的摔笤,如果沒有申請比如相機權(quán)限垦写、定位權(quán)限等敏感權(quán)限吕世,直接運行在Android 6.0及以上系統(tǒng)會閃退梯投。
根據(jù)谷歌提供的申請權(quán)限教程命辖,個人覺得很繁瑣,每次寫重復(fù)代碼顯得很無聊尔艇,因此我封裝了一個通用檢查工具類。
一漓帚、在BaseActivity中封裝權(quán)限檢查回調(diào)接口
聲明一個回調(diào)接口母债,用一個List保存回調(diào)尝抖,對外提供添加回調(diào)方法毡们,重寫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)限申請回掉
     */
    public void addRequestPermissionsResult(PermissionCallBack callback) {
        if (permissionCallBacks == null) {
            permissionCallBacks = new ArrayList<>();
        }

        if (permissionCallBacks.size() >= 1) {
            permissionCallBacks.clear();
        }
        permissionCallBacks.add(callback);
    }
   //系統(tǒng)權(quán)限申請回調(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搅荞,用于申請權(quán)限
自定義請求結(jié)果回調(diào)红氯,分為有權(quán)限和有權(quán)限咕痛。通用權(quán)限檢查步驟為先檢查有沒有權(quán)限痢甘,如果沒有茉贡,先給需要申請權(quán)限的Activity增加權(quán)限申請回調(diào)塞栅,在這個回調(diào)中檢查結(jié)果腔丧,處理結(jié)果放椰,然后發(fā)起權(quán)限申請愉粤。

public interface PermissionRequestCallback {
        void hasPermission();

        void noPermission();
    }
    /**
     * 通用檢查權(quán)限方法
     * @param context
     * @param permissions 權(quán)限數(shù)組
     * @param requestPermissionCode 請求權(quán)限時的activity 請求碼
     * @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 {

          //沒有權(quán)限砾医,則先給Activity增加一個我們自定義的權(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)) {//給用戶一個解釋
               // Logs.base.d("應(yīng)該展示一個UI提示:ShowRequestPermissionRationale %s權(quán)限",permissionName);
                Dialogs.showMustConfirmDialog(context, "權(quán)限申請", String.format("%s需要獲得%s權(quán)限才能正常使用此功能,請允許衣厘!", appLabel, permissionName), new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ActivityCompat.requestPermissions(context, permissions, requestPermissionCode);
                    }
                });

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


        }


    }
    //是不是要給一個用戶一個解釋
    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};//相機權(quán)限

  CheckPermissionUtils. checkPermission(this, cameraPermissions, REQUEST_CAMERA_PERMISSION, "相機", new CheckPermissionUtils.PermissionRequestCallback() {
                @Override
                public void hasPermission() {
               //有權(quán)限怖亭,可以安全地做操作了
                }
                @Override
                public void noPermission() {
                    ToastHelper.makeImgToast("沒有訪問相機的權(quán)限,請打開訪問權(quán)限再試");
                }
            });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兴猩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子早歇,更是在濱河造成了極大的恐慌讨勤,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潭千,死亡現(xiàn)場離奇詭異,居然都是意外死亡借尿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門路翻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茂契,你說我怎么就攤上這事蝶桶〉粢保” “怎么了真竖?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵厌小,是天一觀的道長恢共。 經(jīng)常有香客問我璧亚,道長讨韭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮吉嚣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尝哆。我一直安慰自己秉撇,他們只是感情好秋泄,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布琐馆。 她就那樣靜靜地躺著恒序,像睡著了一般瘦麸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滋饲,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天厉碟,我揣著相機與錄音屠缭,去河邊找鬼箍鼓。 笑死呵曹,一個胖子當著我的面吹牛款咖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铐殃,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砍聊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起玻蝌,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俯树,沒想到半個月后帘腹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體许饿,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡阳欲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年陋率,在試婚紗的時候發(fā)現(xiàn)自己被綠了球化。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓦糟。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡筒愚,死狀恐怖菩浙,靈堂內(nèi)的尸體忽然破棺而出巢掺,到底是詐尸還是另有隱情,我是刑警寧澤陆淀,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站先嬉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疫蔓。R本人自食惡果不足惜浸剩,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绢要。 院中可真熱鬧,春花似錦重罪、人聲如沸樱哼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呼胚。三九已至茄唐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝇更,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工年扩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厨幻。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓相嵌,卻偏偏與公主長得像况脆,于是被迫代替她去往敵國和親饭宾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容