Android權(quán)限處理的那些事

最近了解了Android中權(quán)限申請的一些情況欺抗,由于Android系統(tǒng)的定制售碳,里面還是有不少坑的,所以就系統(tǒng)梳理下關于Android權(quán)限申請的技術點绞呈。

一贸人、權(quán)限處理分類


由上圖可以看出,主要分為四類佃声。下表逐一介紹各類對應的一些情況艺智。


二、動態(tài)權(quán)限申請

雖然總的來說分為四類圾亏,但是只需要處理一種情況十拣,即動態(tài)申請權(quán)限。其他三種情況志鹃,要么默認實現(xiàn)夭问,要么系統(tǒng)定制,無法從代碼角度進行調(diào)整曹铃。那么下面先來看下那些權(quán)限需要動態(tài)申請缰趋。

(1)權(quán)限列表

Android6.0以上把權(quán)限分為普通權(quán)限和危險權(quán)限,所以危險權(quán)限是需要動態(tài)申請陕见,給予用戶提示的秘血,而危險權(quán)限就是上表展示的內(nèi)容。

看到上面的 permissions评甜,會發(fā)現(xiàn)一個問題灰粮,危險權(quán)限都是一組一組的。

分組對權(quán)限機制的申請是有一定影響的忍坷。例如app運行在android 6.x的機器上谋竖,對于授權(quán)機制是這樣的。如果你申請某個危險的權(quán)限承匣,假設你的app早已被用戶授權(quán)了同一組的某個危險權(quán)限蓖乘,那么系統(tǒng)會立即授權(quán),而不需要用戶去點擊授權(quán)韧骗。比如你的app對READ_CONTACTS已經(jīng)授權(quán)了嘉抒,當你的app申請WRITE_CONTACTS時,系統(tǒng)會直接授權(quán)通過袍暴。

此外些侍,對于申請時的彈窗上面的文本說明也是對整個權(quán)限組的說明隶症,而不是單個權(quán)限。

下面介紹下Android 6.0以上 動態(tài)申請權(quán)限所設計到的一些方法岗宣。

(2)權(quán)限申請方法

在申請權(quán)限先蚂会,首先要保證在AndroidManifest中寫明需要的權(quán)限。
例如:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

具體權(quán)限方法詳解:

權(quán)限申請示例

以獲取定位權(quán)限為例耗式。

1.點擊按鈕胁住,檢查并申請權(quán)限

btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (Build.VERSION.SDK_INT >23) {
                    if (ContextCompat.checkSelfPermission(MainActivity.this,
                             Manifest.permission.ACCESS_COARSE_LOCATION)
                            == PackageManager.PERMISSION_GRANTED) {
                        //授予權(quán)限
                        getLoation();
                    }else{
                        //未獲得權(quán)限
                        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}
                                ,REQUEST_CODE_LOCATION);
                    }
                }
            }
        });

如果有權(quán)限,執(zhí)行獲取位置邏輯刊咳,如果沒權(quán)限彪见,則進行請求權(quán)限。

2.權(quán)限申請結(jié)果回調(diào)

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_CODE_LOCATION)
        {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                getLoation();
            } else
            {
                if (shouldShowRequestPermissionRationale( Manifest.permission.ACCESS_COARSE_LOCATION)){
                    new AlertDialog.Builder(this)
                            .setMessage("申請定位權(quán)限,才能為你推送更準確的信息")
                            .setPositiveButton("確定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    //申請定位權(quán)限
                                    requestPermissions(MainActivity.this,
                                            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE_LOCATION);
                                }
                            }).show();
                }
            }
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

如果同意娱挨,執(zhí)行獲取位置邏輯余指,如果拒絕,重寫shouldShowRequestPermissionRationale方法跷坝,返回true,向用戶彈窗給出一個獲取權(quán)限的提示酵镜,點擊后再次申請權(quán)限。

public boolean shouldShowRequestPermissionRationale(@NonNull String permission) {
        if (permission.equals(Manifest.permission.ACCESS_COARSE_LOCATION) ) {
            return true;
        } else {
            return super.shouldShowRequestPermissionRationale(permission);
        }
    }

重寫shouldShowRequestPermissionRationale柴钻,在申請位置權(quán)限時淮韭,返回true,給用戶解釋顿颅。

以上就是動態(tài)申請權(quán)限的邏輯缸濒,大概流程如下:


注意:
shouldShowRequestPermissionRationale :默認情況下足丢,不重寫該方法粱腻,在Android原生系統(tǒng)中,如果第二次彈出權(quán)限申請的對話框斩跌,會出現(xiàn)“以后不再彈出”的提示框绍些,如果用戶勾選了,你再申請權(quán)限耀鸦,則shouldShowRequestPermissionRationale返回true柬批,意思是說要給用戶一個 解釋,告訴用戶為什么要這個權(quán)限袖订。

三氮帐、開源項目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末上沐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子楞艾,更是在濱河造成了極大的恐慌参咙,老刑警劉巖龄广,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蕴侧,居然都是意外死亡择同,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門净宵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敲才,“玉大人,你說我怎么就攤上這事塘娶」榻铮” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵刁岸,是天一觀的道長脏里。 經(jīng)常有香客問我,道長虹曙,這世上最難降的妖魔是什么迫横? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮酝碳,結(jié)果婚禮上矾踱,老公的妹妹穿的比我還像新娘。我一直安慰自己疏哗,他們只是感情好呛讲,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著返奉,像睡著了一般贝搁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芽偏,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天雷逆,我揣著相機與錄音,去河邊找鬼污尉。 笑死膀哲,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的被碗。 我是一名探鬼主播某宪,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锐朴!你這毒婦竟也來了兴喂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞻想,沒想到半個月后压真,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蘑险,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年滴肿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佃迄。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡泼差,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呵俏,到底是詐尸還是另有隱情堆缘,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布普碎,位于F島的核電站吼肥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏麻车。R本人自食惡果不足惜缀皱,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望动猬。 院中可真熱鬧啤斗,春花似錦、人聲如沸赁咙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彼水。三九已至崔拥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猿涨,已是汗流浹背握童。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工姆怪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叛赚,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓稽揭,卻偏偏與公主長得像俺附,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子溪掀,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

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