Android 6.0動態(tài)權(quán)限申請

概述

Google在 Android 6.0 開始引入了權(quán)限申請機制,將所有權(quán)限分成了正常權(quán)限和危險權(quán)限莱革。應(yīng)用的相關(guān)功能每次在使用危險權(quán)限時需要動態(tài)的申請并得到用戶的授權(quán)才能使用峻堰。

權(quán)限分類

系統(tǒng)權(quán)限分為兩類:正常權(quán)限和危險權(quán)限。

  • 正常權(quán)限不會直接給用戶隱私權(quán)帶來風險盅视。如果您的應(yīng)用在其清單中列出了正常權(quán)限捐名,系統(tǒng)將自動授予該權(quán)限。
  • 危險權(quán)限會授予應(yīng)用訪問用戶機密數(shù)據(jù)的權(quán)限闹击。如果您的應(yīng)用在其清單中列出了正常權(quán)限镶蹋,系統(tǒng)將自動授予該權(quán)限。如果您列出了危險權(quán)限赏半,則用戶必須明確批準您的應(yīng)用使用這些權(quán)限贺归。
危險權(quán)限和權(quán)限組

重要方法

  • ContextCompat.checkSelfPermission
    檢查應(yīng)用是否具有某個危險權(quán)限。如果應(yīng)用具有此權(quán)限断箫,方法將返回 PackageManager.PERMISSION_GRANTED拂酣,并且應(yīng)用可以繼續(xù)操作。如果應(yīng)用不具有此權(quán)限仲义,方法將返回 PackageManager.PERMISSION_DENIED婶熬,且應(yīng)用必須明確向用戶要求權(quán)限。

  • ActivityCompat.requestPermissions
    應(yīng)用可以通過這個方法動態(tài)申請權(quán)限埃撵,調(diào)用后會彈出一個對話框提示用戶授權(quán)所申請的權(quán)限赵颅。

  • ActivityCompat.shouldShowRequestPermissionRationale
    如果應(yīng)用之前請求過此權(quán)限但用戶拒絕了請求,此方法將返回 true暂刘。如果用戶在過去拒絕了權(quán)限請求饺谬,并在權(quán)限請求系統(tǒng)對話框中選擇了 Don't ask again 選項,此方法將返回 false鸳惯。如果設(shè)備規(guī)范禁止應(yīng)用具有該權(quán)限商蕴,此方法也會返回 false叠萍。

  • onRequestPermissionsResult
    當應(yīng)用請求權(quán)限時芝发,系統(tǒng)將向用戶顯示一個對話框。當用戶響應(yīng)時苛谷,系統(tǒng)將調(diào)用應(yīng)用的 onRequestPermissionsResult() 方法辅鲸,向其傳遞用戶響應(yīng),處理對應(yīng)的場景腹殿。

示例

本示例在Google示例的基礎(chǔ)上做了少許修改独悴,步驟如下:

1例书、在AndroidManifest.xml中添加所需權(quán)限。

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

2刻炒、封裝了一個requestPermission方法來動態(tài)檢查和申請權(quán)限

    private void requestPermission() {

        Log.i(TAG,"requestPermission");
        // Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
            Log.i(TAG,"checkSelfPermission");
            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.READ_CONTACTS)) {
                Log.i(TAG,"shouldShowRequestPermissionRationale");
                // Show an expanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.READ_CONTACTS},
                        MY_PERMISSIONS_REQUEST_READ_CONTACTS);

            } else {
                Log.i(TAG,"requestPermissions");
                // No explanation needed, we can request the permission.
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.READ_CONTACTS},
                        MY_PERMISSIONS_REQUEST_READ_CONTACTS);
                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        }
    }

3决采、重寫onRequestPermissionsResult方法根據(jù)用戶的不同選擇做出響應(yīng)。

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.i(TAG,"onRequestPermissionsResult granted");
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.

                } else {
                    Log.i(TAG,"onRequestPermissionsResult denied");
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                    showWaringDialog();
                }
                return;
            }

            // other 'case' lines to check for other
            // permissions this app might request
        }
    }

    private void showWaringDialog() {
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setTitle("警告坟奥!")
                .setMessage("請前往設(shè)置->應(yīng)用->PermissionDemo->權(quán)限中打開相關(guān)權(quán)限树瞭,否則功能無法正常運行!")
                .setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // 一般情況下如果用戶不授權(quán)的話爱谁,功能是無法運行的晒喷,做退出處理
                finish();
            }
        }).show();
    }

RxPermissions

官方提供的方法在一次申請多個權(quán)限的時候代碼邏輯寫起來比較繁瑣,于是有了RxPermissions访敌。RxPermissions是使用Rxjava封裝的第三方的權(quán)限申請庫凉敲,他的特點是借助Rxjava的特性簡化了權(quán)限申請的代碼邏輯,使代碼看起來簡潔易讀寺旺。具體的使用方法可以參看《RxPermissions獲取運行時權(quán)限》爷抓,里面寫的比較詳細。

參考文獻

Google Doc:在運行時請求權(quán)限
Google Doc:正常權(quán)限和危險權(quán)限
權(quán)限分類:正常權(quán)限和危險權(quán)限
Android6.0動態(tài)權(quán)限申請步驟以及需要注意的一些坑
Android6.0------權(quán)限申請管理(單個權(quán)限和多個權(quán)限申請)
android6.0運行時權(quán)限詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迅涮,一起剝皮案震驚了整個濱河市废赞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叮姑,老刑警劉巖唉地,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異传透,居然都是意外死亡耘沼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門朱盐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來群嗤,“玉大人,你說我怎么就攤上這事兵琳】衩兀” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵躯肌,是天一觀的道長者春。 經(jīng)常有香客問我,道長清女,這世上最難降的妖魔是什么钱烟? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上拴袭,老公的妹妹穿的比我還像新娘读第。我一直安慰自己,他們只是感情好拥刻,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布怜瞒。 她就那樣靜靜地躺著,像睡著了一般般哼。 火紅的嫁衣襯著肌膚如雪盼砍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天逝她,我揣著相機與錄音浇坐,去河邊找鬼。 笑死黔宛,一個胖子當著我的面吹牛近刘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播臀晃,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼觉渴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了徽惋?” 一聲冷哼從身側(cè)響起案淋,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎险绘,沒想到半個月后踢京,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡宦棺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年瓣距,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片代咸。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹈丸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呐芥,到底是詐尸還是另有隱情逻杖,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布思瘟,位于F島的核電站荸百,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏潮太。R本人自食惡果不足惜管搪,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铡买。 院中可真熱鬧更鲁,春花似錦、人聲如沸奇钞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽景埃。三九已至媒至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谷徙,已是汗流浹背拒啰。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留完慧,地道東北人谋旦。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像屈尼,于是被迫代替她去往敵國和親册着。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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