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);
}
}
}
簡單的動態許可權申請就完成了。