參閱Android Developer: https://developer.android.com/training/permissions/requesting.html#perm-request
運(yùn)行時(shí)權(quán)限
從Android 6.0(API level 23)開始饮亏,用戶需要在App運(yùn)行的時(shí)候授予某些權(quán)限砂蔽,而并非安裝時(shí)。Android的系統(tǒng)權(quán)限分為兩種:
- Normal permissons. 這列權(quán)限只需要在Androidmanifest文件中列出既可老虫,系統(tǒng)會(huì)自動(dòng)授予這些權(quán)限咱旱。
- Dangerous permissions. 這類權(quán)限由于涉及到用戶的隱私确丢,所以不僅需要在Androidmanifest文件中列出,還需要在App運(yùn)行時(shí)由用戶授予吐限。后文中的權(quán)限都指此類權(quán)限鲜侥。文章的最后會(huì)列出哪些權(quán)限屬于Dangerous permissions.
具體操作
檢查權(quán)限
如果你的App的某項(xiàng)操作需要用到某項(xiàng)權(quán)限,你首先需要檢查你的APP是否已經(jīng)被授予了該權(quán)限诸典,調(diào)用ContextCompat.checkSelfPermission()方法即可描函。示例代碼如下:
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
該方法會(huì)返回一個(gè)Int類型的值,當(dāng)返回值等于 PackageManager.PERMISSION_GRANTED時(shí)表示你已經(jīng)獲得了該權(quán)限狐粱;當(dāng)返回值等于PERMISSION_DENIED時(shí)舀寓,表示還未獲得該權(quán)限,需要用戶授予肌蜻。
獲得權(quán)限
有些情況下互墓,你可能會(huì)需要向用戶解釋為什么需要獲得該權(quán)限。那么什么時(shí)候向用戶解釋呢蒋搜,Android提供了shouldShowRequestPermissionRationale()方法篡撵,當(dāng)其返回true的時(shí)候判莉,表明你應(yīng)該向用戶解釋你需要該權(quán)限的原因,如果返回false育谬,則不需要骂租。
接下來就是調(diào)用requestPermissions()方法來申請(qǐng)權(quán)限。示例代碼如下
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// 是否該向用戶解釋
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// 向用戶解釋原因
} else {
ActivityCompat.requestPermissions(thisActivity,
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.
}
}
處理申請(qǐng)權(quán)限的結(jié)果
當(dāng)App申請(qǐng)權(quán)限的時(shí)候斑司,系統(tǒng)會(huì)彈出一個(gè)Dialog(該Dialog不可自定義)。用戶選擇以后但汞,會(huì)觸發(fā)onRequestPermissionsResult() 方法宿刮,我們會(huì)在該方法里處理用戶選擇的結(jié)果。具體代碼如下:
@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) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
Dangerous permissions and permission groups
Permission Group | Permissions |
---|---|
CALENDAR | READ_CALENDAR, WRITE_CALENDAR |
CAMERA | CAMERA |
CONTACTS | READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS |
LOCATION | ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION |
MICROPHONE | RECORD_AUDIO |
PHONE | READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG, WRITE_CALL_LOG, ADD_VOICEMAIL, USE_SIP, PROCESS_OUTGOING_CALLS |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS, RECEIVE_SMS, READ_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS |
STORAGE | READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE |