Android6.0開始新增了動(dòng)態(tài)權(quán)限的申請(qǐng),以往我們?cè)贏ndroidManifest.xml文件中添加的權(quán)限,有一部分現(xiàn)在需要?jiǎng)討B(tài)申請(qǐng)了,當(dāng)compileSdkVersion和targetSdkVersion為 23時(shí),必須要?jiǎng)討B(tài)設(shè)定權(quán)限了。這無形中增加了不少代碼量呀!下面來看看哪些權(quán)限需要?jiǎng)討B(tài)申請(qǐng)了:
| 需要申請(qǐng)的權(quán)限 | |
|---|---|
| 權(quán)限組 | 權(quán)限 |
| android.permission-group.CALENDAR | android.permission.READ_CALENDAR |
| android.permission.WRITE_CALENDAR | |
| android.permission-group.CAMERA | android.permission.CAMERA |
| android.permission-group.CONTACTS | android.permission.READ_CONTACTS |
| android.permission.WRITE_CONTACTS | |
| android.permission.GET_ACCOUNTS | |
| android.permission-group.LOCATION | android.permission.ACCESS_FINE_LOCATION |
| android.permission.ACCESS_COARSE_LOCATION | |
| android.permission-group.MICROPHONE | android.permission.RECORD_AUDIO |
| android.permission-group.PHONE | android.permission.READ_PHONE_STATE |
| android.permission.CALL_PHONE | |
| android.permission.READ_CALL_LOG | |
| android.permission.WRITE_CALL_LOG | |
| android.permission.USE_SIP | |
| android.permission.PROCESS_OUTGOING_CALLS | |
| android.permission-group.STORAGE | android.permission.READ_EXTERNAL_STORAGE |
| android.permission.WRITE_EXTERNAL_STORAGE | |
| android.permission-group.SENSORS | android.permission.BODY_SENSORS |
| android.permission-group.SMS | android.permission.SEND_SMS |
| android.permission.READ_SMS | |
| android.permission.RECEIVE_SMS | |
| android.permission.RECEIVE_WAP_PUSH |
上表中同一組的任何一個(gè)權(quán)限被授權(quán)了,其他權(quán)限也自動(dòng)被授權(quán)。例如,一旦WRITE_CONTACTS被授權(quán)了,app也有READ_CONTACTS和GET_ACCOUNTS了。
使用方法
例如:我們?cè)谑褂孟鄼C(jī)的時(shí)候需要檢查是否應(yīng)有相機(jī)授權(quán)
1.在Activity中
//檢查權(quán)限
if(ActivityCompat.checkSelfPermission(EditPersonalDynamicActivity.this,
Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){
//調(diào)用這個(gè)方法只會(huì)在API>=23的時(shí)候才會(huì)起作用,否則一律返回false
//第一次請(qǐng)求權(quán)限時(shí),用戶拒絕了,調(diào)用后返回true
//第二次請(qǐng)求權(quán)限時(shí),用戶拒絕且選擇了“不在提醒”,調(diào)用后返回false。
//設(shè)備的策略禁止當(dāng)前應(yīng)用獲取這個(gè)權(quán)限的授權(quán)時(shí)調(diào)用后返回false 。
if(ActivityCompat.shouldShowRequestPermissionRationale(EditPersonalDynamicActivity.this,Manifest.permission.CAMERA)){
//此時(shí)我們都彈出提示
ActivityCompat.requestPermissions(EditPersonalDynamicActivity.this,
new String[]{Manifest.permission.CAMERA},CAMERA_PREMISSION);
}else{
//這里是用戶各種拒絕后我們也彈出提示
ActivityCompat.requestPermissions(EditPersonalDynamicActivity.this,
new String[]{Manifest.permission.CAMERA},CAMERA_PREMISSION);
}
}else {
//正常情況,表示權(quán)限是已經(jīng)被授予的
}
@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==CAMERA_PREMISSION) {
if (grantResults.length == permissions.length){
for(int grant:grantResults){
if(grant!=PackageManager.PERMISSION_GRANTED){
//有權(quán)限被禁止了
//......
return;
}
}
// 此處表示權(quán)限被授予,你可以開始做你想要做的事
} else {
// 權(quán)限被用戶禁止
}
}
}
2.在Fragment中
在Fragment中申請(qǐng)權(quán)限,不要使用ActivityCompat.requestPermissions, 直接使用Fragment的requestPermissions方法,否則會(huì)回調(diào)到Activity的onRequestPermissionsResult,另外在fragment中詢問的方法也可以直接使用fragment中的方法shouldShowRequestPermissionRationale方法。
如果在Fragment中嵌套Fragment,在子Fragment中使用requestPermissions方法,onRequestPermissionsResult不會(huì)回調(diào)回來,建議使用getParentFragment().requestPermissions方法,
這個(gè)方法會(huì)回調(diào)到父Fragment中的onRequestPermissionsResult,加入以下代碼可以把回調(diào)透?jìng)鞯阶覨ragment
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
List<Fragment> fragments = getChildFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if (fragment != null) {
fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);
}
}
}
}
然而,每次都要這樣寫一遍還是太麻煩,后面我會(huì)封裝一個(gè)So easy的庫(kù)用來簡(jiǎn)化申請(qǐng)權(quán)限。
PS:這是地址:http://www.itdecent.cn/p/184679b311b2