安卓權限檢測代碼

Android 23 以后加入了新的權限檢查機制狈邑,對一些危險權限,進行了新的授權管理蚤认,以讓用戶明確app都是用了哪些權限米苹,這也讓我們的開發(fā)多做了一些工作。

public class BaseActivity extends Activity { 
   protected static final int REQ_CODE_REQUEST_OPEN_PERMISSION = 0x9001;

    // 危險權限的列表
    private static Map<String, String> sPermissionMap;

    static {
        sPermissionMap = new LinkedHashMap<>();
        sPermissionMap.put(Manifest.permission.READ_PHONE_STATE, "讀取手機信息");
        sPermissionMap.put(Manifest.permission.READ_CONTACTS, "讀取聯(lián)系人");
        sPermissionMap.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, "讀寫外部存儲空間");
        sPermissionMap.put(Manifest.permission.CAMERA, "相機");
        sPermissionMap.put(Manifest.permission.RECORD_AUDIO, "錄音");
        sPermissionMap.put(Manifest.permission.ACCESS_FINE_LOCATION, "訪問位置");
    }

    // 檢測權限
    protected void checkPermission() {
        Observable.fromIterable(sPermissionMap.keySet()).filter(new Predicate<String>() {
            @Override
            public boolean test(String permission) throws Exception {
                return ActivityCompat.checkSelfPermission(BaseActivity.this, permission) != PackageManager.PERMISSION_GRANTED;
            }
        }).toList().subscribe(new Consumer<List<String>>() {
            @Override
            public void accept(List<String> permissions) throws Exception {
                requestPermissions(permissions.toArray(new String[0]));
            }
        });
    }

    // 判斷是否需要顯示為什么要申請權限
    private void shouldShowRequestPermissionRationale(final List<String> permissions) {
        Observable.fromIterable(permissions).filter(new Predicate<String>() {
            @Override
            public boolean test(String permission) throws Exception {
                return ActivityCompat.shouldShowRequestPermissionRationale(BaseActivity.this, permission);
            }
        }).toList().subscribe(new Consumer<List<String>>() {
            @Override
            public void accept(final List<String> showRequestPermissions) throws Exception {
                if (showRequestPermissions.size() > 0) {
                    getPermissionRationale(showRequestPermissions).subscribe(new Consumer<String>() {
                        @Override
                        public void accept(String permissionRationale) throws Exception {
                            showRequestPermissionRationaleDialog(permissions, permissionRationale);
                        }
                    });
                } else {
                    /**
                     *  // 下面的代碼可以強制用戶打開所有的權限砰琢。
                     *  getPermissionRationale(permissions).subscribe(new Consumer<String>() {
                     *      @Override
                     *      public void accept(String permissionRationale) throws Exception {
                     *          showPermissionRefusedDialog(permissionRationale);
                     *      }
                     *  });
                     */
                    onPermissionGranted();
                }
            }
        });
    }

    // 獲取權限的提示
    private Observable<String> getPermissionRationale(List<String> permissions) {
        return Observable.fromIterable(permissions).toList().map(new Function<List<String>, String>() {
            @Override
            public String apply(List<String> permissions) throws Exception {
                StringBuilder builder = new StringBuilder();
                if (permissions != null && permissions.size() > 0) {
                    for (int i = 0; i < permissions.size(); i++) {
                        builder.append(sPermissionMap.get(permissions.get(i)));
                        if (i != permissions.size() - 1) {
                            builder.append("蘸嘶,");
                        }
                    }
                }
                return builder.toString();
            }
        });
    }

    // 顯示為什么要申請權限的對話框
    private void showRequestPermissionRationaleDialog(final List<String> permissions, String permissionRationale) {
        // 顯示權限請求對話框
        DialogUtils.showAlert(BaseActivity.this, "申請權限", "應用需要申請" + permissionRationale + "的權限", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                requestPermissions(permissions.toArray(new String[0]));
            }
        });
    }

    // 申請權限
    private void requestPermissions(String[] permissions) {
        if (permissions == null || permissions.length == 0) {
            onPermissionGranted();
            return;
        }
        ActivityCompat.requestPermissions(BaseActivity.this, permissions, Config.REQUEST_ASK_PERMISSIONS);
    }

    // 權限授權后
    protected void onPermissionGranted() {

    }

    // 提供給子類檢查權限,如果沒有權限陪汽,提示用戶打開相應的權限辛萍。
    @Override
    public void checkPermissions(String... permissions) {
        Observable.fromArray(permissions).filter(new Predicate<String>() {
            @Override
            public boolean test(String permission) throws Exception {
                return ActivityCompat.checkSelfPermission(BaseActivity.this, permission) != PackageManager.PERMISSION_GRANTED;
            }
        }).toList().subscribe(new Consumer<List<String>>() {
            @Override
            public void accept(List<String> notGrantPermissions) throws Exception {
                getPermissionRationale(notGrantPermissions).subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String permissionRationale) throws Exception {
                        if (!TextUtils.isEmpty(permissionRationale)) {
                            showPermissionRefusedDialog(permissionRationale);
                        }
                    }
                });
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, final String[] permissions, int[] grantResults) {
        if (requestCode == Config.REQUEST_ASK_PERMISSIONS) {
            if (grantResults == null || grantResults.length == 0) return;
            List<String> notGrantedPermissions = new ArrayList<>();
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                    notGrantedPermissions.add(permissions[i]);
                }
            }
            if (notGrantedPermissions.size() == 0) {
                onPermissionGranted();
            } else {
                shouldShowRequestPermissionRationale(notGrantedPermissions);
            }
        }
    }

    // 顯示權限拒絕對話框
    protected void showPermissionRefusedDialog(String permissionRationale) {
        DialogUtils.showConfirm(this, "申請權限", "應用需要申請" + permissionRationale + "的權限刹帕,但已被拒絕,請手動設置。", getString(R.string.sure), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                SystemCompat.startPermissionSettingActivityForResult(BaseActivity.this, REQ_CODE_REQUEST_OPEN_PERMISSION);
            }
        }, getString(R.string.cancel), null);
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垃僚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尚镰,更是在濱河造成了極大的恐慌鼻种,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澜薄,死亡現(xiàn)場離奇詭異为肮,居然都是意外死亡,警方通過查閱死者的電腦和手機肤京,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門颊艳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事棋枕“仔蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵戒悠,是天一觀的道長熬荆。 經(jīng)常有香客問我,道長绸狐,這世上最難降的妖魔是什么卤恳? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮寒矿,結果婚禮上突琳,老公的妹妹穿的比我還像新娘。我一直安慰自己符相,他們只是感情好拆融,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啊终,像睡著了一般镜豹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓝牲,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天趟脂,我揣著相機與錄音,去河邊找鬼例衍。 笑死昔期,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的佛玄。 我是一名探鬼主播硼一,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梦抢!你這毒婦竟也來了般贼?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奥吩,失蹤者是張志新(化名)和其女友劉穎具伍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圈驼,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年望几,在試婚紗的時候發(fā)現(xiàn)自己被綠了绩脆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖靴迫,靈堂內(nèi)的尸體忽然破棺而出惕味,到底是詐尸還是另有隱情,我是刑警寧澤玉锌,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布名挥,位于F島的核電站,受9級特大地震影響主守,放射性物質(zhì)發(fā)生泄漏禀倔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一参淫、第九天 我趴在偏房一處隱蔽的房頂上張望救湖。 院中可真熱鬧,春花似錦涎才、人聲如沸鞋既。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邑闺。三九已至,卻和暖如春棕兼,著一層夾襖步出監(jiān)牢的瞬間陡舅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工程储, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹭沛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓章鲤,卻偏偏與公主長得像摊灭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子败徊,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,140評論 25 707
  • Android 是一個特權分離(privilege-separated)操作系統(tǒng)帚呼,在其中每個應用都以一個不同的系統(tǒng)...
    DanieX閱讀 4,102評論 0 3
  • 剛建了一個QQ群,感興趣的大家一起多多交流:544645972 在 android permission權限與安全...
    Shawn_Dut閱讀 1,964評論 1 8
  • 第一次見到她皱蹦,被她身上特有的氣質(zhì)所吸引煤杀,她著裝優(yōu)雅身材勻稱皮膚白皙,長相也屬于甜美型沪哺,她是湖北武漢人沈自,一段時間的相...
    當歸2017閱讀 194評論 0 0
  • 文/槿硯 夜深了,歸府大門緊閉辜妓,屋檐下的兩盞紅燈籠靜靜的掛著枯途,燭火跳躍忌怎。 屋內(nèi),床帷羅帳之下酪夷,歸字謠與我并排而坐榴啸。...
    胡喜寶閱讀 570評論 0 5