安卓6.0+ 動態(tài)權限申請總結


網上關于安卓動態(tài)權限申請的文章很多缚忧,但是畢竟眼花繚亂,所以下面我將根據自己的理解和在網上獲取到的信息對動態(tài)權限申請進行小小的總結杈笔,以便以后再次接觸安卓的時候能夠拿出來看闪水!

  • 下面有幾組需要動態(tài)申請的權限,據說在每一組中蒙具,只需要成功申請一組即可球榆。申請需要在AndroidManifest.xml中添加對應的代碼:
group:android.permission-group.CONTACTS
    permission:android.permission.WRITE_CONTACTS
    permission:android.permission.GET_ACCOUNTS    
    permission:android.permission.READ_CONTACTS
  
  group:android.permission-group.PHONE
    permission:android.permission.READ_CALL_LOG
    permission:android.permission.READ_PHONE_STATE 
    permission:android.permission.CALL_PHONE
    permission:android.permission.WRITE_CALL_LOG
    permission:android.permission.USE_SIP
    permission:android.permission.PROCESS_OUTGOING_CALLS
    permission:com.android.voicemail.permission.ADD_VOICEMAIL
  
  group:android.permission-group.CALENDAR
    permission:android.permission.READ_CALENDAR
    permission:android.permission.WRITE_CALENDAR
  
  group:android.permission-group.CAMERA
    permission:android.permission.CAMERA
  
  group:android.permission-group.SENSORS
    permission:android.permission.BODY_SENSORS
  
  group:android.permission-group.LOCATION
    permission:android.permission.ACCESS_FINE_LOCATION
    permission:android.permission.ACCESS_COARSE_LOCATION
  
  group:android.permission-group.STORAGE
    permission:android.permission.READ_EXTERNAL_STORAGE
    permission:android.permission.WRITE_EXTERNAL_STORAGE
  
  group:android.permission-group.MICROPHONE
    permission:android.permission.RECORD_AUDIO
  
  group:android.permission-group.SMS
    permission:android.permission.READ_SMS
    permission:android.permission.RECEIVE_WAP_PUSH
    permission:android.permission.RECEIVE_MMS
    permission:android.permission.RECEIVE_SMS
    permission:android.permission.SEND_SMS
    permission:android.permission.READ_CELL_BROADCASTS
  • 需要注意,無論是動態(tài)權限申請還是其他權限的申請禁筏,都需要在AndroidManifest.xml文件中進行申請持钉。對于動態(tài)權限還需要在對應的java文件中用代碼進行動態(tài)權限的申請。接下來的內容主要是在.java文件中進行動態(tài)權限申請的代碼的介紹篱昔。

--今天沒有進行研究每强,我想得過幾天再進行研究,然后再進行總結,今天帶外甥仔忘記了^ _ ^ 早點休息吧(2018/1/17 23:55)


好了空执,現在繼續(xù)我們的總結浪箭,首先,先給一個鏈接脆烟,這個是google官方的關于運行時動態(tài)申請權限的代碼山林,在github上,喜歡的話可以fork到你的github賬戶中邢羔,點這里進行查看驼抹。
在下面我的介紹中,我也是基于官方文檔的拜鹤,因為規(guī)則是人家定的框冀,你必須遵循人家的標準∶舨荆總的來說明也,在java代碼中動態(tài)申請權限分為三個大的步驟,步驟一是檢查是否已經獲得了權限惯裕,步驟二則在步驟一沒有獲取到權限的時候進行動態(tài)權限的申請温数,步驟三則在回調函數中實現相應的操作。
下面我將以申請手機拍照的權限作為例子來總結分析:
在官方文檔的注釋當中蜻势,有幾句話是很重要的撑刺,我摘抄在下面:

* This Activity requests permissions to access the camera ({@link android.Manifest.permission#CAMERA})
 * when the 'Show Camera' button is clicked to display the camera preview.

 * First, permissions are checked if they have already been granted through {@link
 * ActivityCompat#checkSelfPermission(Context, String)}.
 * If permissions have not been granted, they are requested through
 * {@link ActivityCompat#requestPermissions(Activity, String[], int)} and the return value checked
 * in
 * a callback to the {@link android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback}
 * interface.

這里表達的意思和我前面總結的三個步驟其實是一樣的。
接下來握玛,我們來看具體的代碼够傍,首先是一個showCamera()函數:

public void showCamera(View view) {
        Log.i(TAG, "Show camera button pressed. Checking permission.");
        // BEGIN_INCLUDE(camera_permission)
        // Check if the Camera permission is already available.
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            // Camera permission has not been granted.

            requestCameraPermission();

        } else {

            // Camera permissions is already available, show the camera preview.
            Log.i(TAG,
                    "CAMERA permission has already been granted. Displaying camera preview.");
            showCameraPreview();
        }
        // END_INCLUDE(camera_permission)

    }

在這部分代碼里面其實包含了我總結的兩個步驟,即步驟一檢查是否已經申請到了權限步驟二如果沒有則進行權限的動態(tài)申請挠铲。檢查是否已經獲得了權限的代碼是if語句里面的判斷條件所示的代碼冕屯,在這里拿出來展示,以便看得更加清晰:

ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED

其實原理很簡單拂苹,就是使用ActivityCompat.checkSelfPermission(Context, String)來判斷是否已經獲得了權限安聘,如果其返回值等于PackageManager.PERMISSION_GRANTED則已經獲得,否則沒有獲得權限醋寝。函數中的第一個參數是Context參數搞挣,即上下文,這個一般是this(fragment中則一般是getActivity())音羞,第二個參數是String類型的參數囱桨,表示的是申請的動態(tài)權限的類型,比如這里需要申請Camera的權限嗅绰,則是Manifest.permission.CAMERA舍肠,如果是其他搀继,則填上相應的即可,關于這個我會在文章后面進行一個總結翠语。
判斷完之后叽躯,如果已經獲得了權限,則我們可以用我們定義的方法打開相機肌括,完成相應的操作点骑;否則,我們要動態(tài)申請權限谍夭,即進行步驟二黑滴,我們用了另外一個函數來寫申請相機權限的過程,代碼如下:

private void requestCameraPermission() {
        Log.i(TAG, "CAMERA permission has NOT been granted. Requesting permission.");

        // BEGIN_INCLUDE(camera_permission_request)
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.CAMERA)) {
            // Provide an additional rationale to the user if the permission was not granted
            // and the user would benefit from additional context for the use of the permission.
            // For example if the user has previously denied the permission.
            Log.i(TAG,
                    "Displaying camera permission rationale to provide additional context.");
            Snackbar.make(mLayout, R.string.permission_camera_rationale,
                    Snackbar.LENGTH_INDEFINITE)
                    .setAction(R.string.ok, new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            ActivityCompat.requestPermissions(MainActivity.this,
                                    new String[]{Manifest.permission.CAMERA},
                                    REQUEST_CAMERA);
                        }
                    })
                    .show();
        } else {

            // Camera permission has not been granted yet. Request it directly.
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
                    REQUEST_CAMERA);
        }
        // END_INCLUDE(camera_permission_request)
    }

上面的這個函數看似很復雜紧索,其實思路很清晰的袁辈,下面我就來分析分析:首先用ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CAMERA)這個函數來檢測用戶是否設定了申請權限時彈出一些東西來提示是否允許使用相應的權限,如果是珠漂,那么就定制相應的提示晚缩,比如這里就使用了一個Snackbar來提醒用戶進行權限的申請;如果用戶沒有設定媳危,那么直接進行權限的申請荞彼,而不告知用戶。申請權限的函數是:

ActivityCompat.requestPermissions(Activity, String[], int)

第一個參數是Context待笑,第二個參數是申請的權限的字符串數組卿泽,因為有時需要申請的權限不止一個,第三個參數則是請求碼滋觉,這里已經定義了它的值:REQUEST_CAMERA = 0,關于不同的權限的請求碼將會在文章的后面進行總結齐邦。
最后椎侠,我們進行最后一個步驟,即實現回調函數措拇,只需要重寫onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)這個函數即可我纪,函數里面需要實現的內容我也展示出來,注意這里是以申請相機權限為例的:

if (requestCode == REQUEST_CAMERA) {
            // BEGIN_INCLUDE(permission_result)
            // Received permission result for camera permission.
            Log.i(TAG, "Received response for Camera permission request.");

            // Check if the only required permission has been granted
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Camera permission has been granted, preview can be displayed
                Log.i(TAG, "CAMERA permission has now been granted. Showing preview.");
                Snackbar.make(mLayout, R.string.permision_available_camera,
                        Snackbar.LENGTH_SHORT).show();
            } else {
                Log.i(TAG, "CAMERA permission was NOT granted.");
                Snackbar.make(mLayout, R.string.permissions_not_granted,
                        Snackbar.LENGTH_SHORT).show();

            }
            // END_INCLUDE(permission_result)

        }

在這個回調函數中丐吓,根據申請權限時返回的信息來判斷權限是否申請成功浅悉,從而用Snackbar來給用戶相應的提示,告訴用戶權限申請成功與否券犁。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末术健,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子粘衬,更是在濱河造成了極大的恐慌荞估,老刑警劉巖咳促,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異勘伺,居然都是意外死亡跪腹,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門飞醉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冲茸,“玉大人,你說我怎么就攤上這事缅帘≈崾酰” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵股毫,是天一觀的道長膳音。 經常有香客問我,道長铃诬,這世上最難降的妖魔是什么祭陷? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮趣席,結果婚禮上兵志,老公的妹妹穿的比我還像新娘。我一直安慰自己宣肚,他們只是感情好想罕,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霉涨,像睡著了一般按价。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笙瑟,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天楼镐,我揣著相機與錄音,去河邊找鬼往枷。 笑死框产,一個胖子當著我的面吹牛,可吹牛的內容都是我干的错洁。 我是一名探鬼主播秉宿,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屯碴!你這毒婦竟也來了描睦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤窿锉,失蹤者是張志新(化名)和其女友劉穎酌摇,沒想到半個月后膝舅,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡窑多,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年仍稀,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埂息。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡技潘,死狀恐怖,靈堂內的尸體忽然破棺而出千康,到底是詐尸還是另有隱情享幽,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布拾弃,位于F島的核電站值桩,受9級特大地震影響,放射性物質發(fā)生泄漏豪椿。R本人自食惡果不足惜奔坟,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搭盾。 院中可真熱鬧咳秉,春花似錦、人聲如沸鸯隅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝌以。三九已至炕舵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跟畅,已是汗流浹背幕侠。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碍彭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓悼潭,卻偏偏與公主長得像庇忌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舰褪,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評論 25 707
  • 幾乎每個人都知道都知道皆疹,Google為了提高Android系統(tǒng)的安全在6.0系統(tǒng)加上了動態(tài)申請權限。權限不在是像6...
    邢二創(chuàng)閱讀 10,110評論 1 17
  • 文/聆聽流年 你是愛穿旗袍的女子 馨嬅落落的氣質 歲月 被束起在長發(fā)里 你是愛穿旗袍的女子 萼萼婷婷著老街的斑駁...
    聆聽流年_b2a4閱讀 278評論 0 3
  • 終于知道 走比跑累 老師比學生精明 現實比夢境更能讓人清醒 偌大的操場 稀稀疏疏幾盞殘燈 滿天的星光 正好給幾對小...
    墨蘭molan閱讀 126評論 0 3
  • 小灶群今天的話題是:你有沒有什么小心愿一直沒實現呢表牢? 我想了想窄绒,寫道:我想變大咖,縱橫多個領域崔兴! 罢玫肌!先別管這個愿...
    撿到蜜罐的熊閱讀 76評論 2 3