Android 6.0之后的權(quán)限
6.0之前,只要在mainfest申請即可。
6.0之后:
兩種辦法:
a:targetSdk如果設(shè)置為22及以下,則同6.0之前,直接在清單文件申請即可。
b:targetSdk>=23,動態(tài)申請權(quán)限。
思路:應(yīng)用啟動或在需要權(quán)限的時(shí)候判斷是否已有對應(yīng)權(quán)限,若無,則對需要的權(quán)限進(jìn)行申請。若用戶拒絕,做出對應(yīng)的處理。
動態(tài)申請權(quán)限:
流程:清單文件申請—–>權(quán)限檢查—–>申請權(quán)限—–>權(quán)限回調(diào)
1.清單文件申請
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
}else{
//
}
這里用了 ContextCompat.checkSelfPermission的API,第一個(gè)參數(shù)是Context,第二個(gè)參數(shù)是權(quán)限。
2.申請權(quán)限
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
這里使用了requestPermissions API,前兩個(gè)參數(shù)同checkSelfPermission,第三個(gè)參數(shù)是int型的權(quán)限請求碼。
如果想申請權(quán)限時(shí)附帶解釋,可以使用下面這個(gè)API
ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,Manifest.permission.READ_CONTACTS)
3.權(quán)限申請回調(diào)
實(shí)現(xiàn)OnRequestPermissionsResultCallback接口中的onRequestPermissionsResult方法。
@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;
}
}
}
第一個(gè)參數(shù):請求碼,第二個(gè)參數(shù)請求權(quán)限的集合,第三個(gè)參數(shù)對應(yīng)權(quán)限申請的結(jié)果集。
如果被用戶點(diǎn)擊返回,則結(jié)果集長度為0。
grantResults[0] == PackageManager.PERMISSION_GRANTED表示 第一個(gè)申請的權(quán)限已被授權(quán)。