1. 程式人生 > >android 6.0及以上動態許可權的獲取

android 6.0及以上動態許可權的獲取

基於安全效能的考慮,android 6.0(API 23)以後,google規定了系統需要動態獲取許可權
一、總結需要使用者手動獲取的許可權:
所屬許可權組 許可權
日曆 READ_CALENDAR
日曆 WRITE_CALENDAR
相機 CAMERA
聯絡人 READ_CONTACTS
聯絡人 WRITE_CONTACTS
聯絡人 GET_ACCOUNTS
位置 ACCESS_FINE_LOCATION
位置 ACCESS_COARSE_LOCATION
麥克風 RECORD_AUDIO
電話 READ_PHONE_STATE
電話 CALL_PHONE
電話 READ_CALL_LOG
電話 WRITE_CALL_LOG
電話 ADD_VOICEMAIL
電話 USE_SIP
電話 PROCESS_OUTGOING_CALLS
感測器 BODY_SENSORS
簡訊 SEND_SMS
簡訊 RECEIVE_SMS
簡訊 READ_SMS
簡訊 RECEIVE_WAP_PUSH
簡訊 RECEIVE_MMS
儲存 READ_EXTERNAL_STORAGE
儲存 WRITE_EXTERNAL_STORAGE
需要注意的是:部分許可權是屬於成組出現的,比如:儲存的讀寫許可權READ_EXTERNAL_STORAGE和 WRITE_EXTERNAL_STORAGE,如果應用程式請求在AndroidManifest中列出的危險許可權,並且應用程式已經在同一許可權組中具有另一個危險許可權,系統會立即授予許可權,而不會與使用者進行任何互動,。例如,如果一個應用程式先前已經請求並被授予READ_CONTACTS許可權,然後它請求WRITE_CONTACTS(同屬於聯絡人一組),系統會立即授予該許可權,不會再彈出許可權授予詢問的對話方塊。

二、動態許可權的申請方法:
1、首先,需要在AndroidManifest.xml靜態申請許可權,否則無法動態申請許可權:
這裡寫圖片描述
(需要注意許可權設定的位置)
2、參考官網實現方式,在java程式碼中實現動態申請許可權的邏輯

 public void requestPower() {
    //判斷是否已經賦予許可權
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.上表許可權字元)
                != PackageManager.PERMISSION_GRANTED) {
           //如果應用之前請求過此許可權但使用者拒絕了請求,此方法將返回 true。
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.上表許可權字元)) {//這裡可以寫個對話方塊之類的項向用戶解釋為什麼要申請許可權,並在對話方塊的確認鍵後續再次申請許可權 } else { //申請許可權,字串陣列內是一個或多個要申請的許可權,1是申請許可權結果的返回引數,在onRequestPermissionsResult可以得知申請結果 ActivityCompat.requestPermissions(this
, new String[]{Manifest.permission.上表許可權字元,}, 1); } } }

3、判斷許可權申請結果的方法(在許可權申請對話方塊消失後執行):在Activity中,許可權申請對話方塊消失之後,可以相應的複寫 方法,監聽許可權申請的結果:

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == 1) {
            for (int i = 0; i < permissions.length; i++) {
                if (grantResults[i] == PERMISSION_GRANTED) {
                    Toast.makeText(this, "" + "許可權" + permissions[i] + "申請成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "" + "許可權" + permissions[i] + "申請失敗", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

三、下面以檔案讀寫許可權的動態申請為例,實現簡單的動態申請功能:
1.首先,在mainfest.xml檔案中註冊靜態許可權:
這裡寫圖片描述
2.具體的在程式碼中實現:

 //許可權動態申請

    public void requestAllPower() {
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
                //如果應用之前請求過此許可權但使用者拒絕了請求,返回 true。
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            } else {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
            }
        }
    }

簡單的動態許可權申請就完成了。