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