运行时权限简述
Android 6.0新增了运行时权限,导致部分权限即需要在AndroidMenifest中声明,也需要运行时进行权限申请,以下就是需要进行动态申请的权限。
- 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* CALENDAR(日历)
在什么条件下我们需要处理运行时权限?
APP运行在Android 6.0或者更高级别的设备中,而且targetSdkVersion>=23时。
处理时需要注意什么?
- 必须在AndroidManifest.xml中进行申明。
- 同一种类型权限被授权了,那么这个类型的其他权限也被授权了。比如只要日历权限的读或写其中一个被动态授权,那么日历的读写权限都同时被动态授权了。
- 申请某个权限时弹出的Dialog是对同类权限总的说明。
- Activity必须继承AppCompatActivity
怎么进行处理?
下方代码会先判断是否是6.0及以后版本,如果是的话,通过方法checkSelfPermission()进行权限检查,如果没有权限,则通过requestPermissions()进行申请权限。申请权限完成后,requestPermissions()内部会调用onRequestPermissionsResult()进行结果回调通知当前Activity或Fragment。
注意 :checkSelfPermission()调用后系统会显示一个请求用户授权的提示对话框,App不能配置和修改这个对话框。
private void requestPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int checkCallPhonePermission = ContextCompat.checkSelfPermission(
BaseApplication.getContext(),
Manifest.permission.READ_EXTERNAL_STORAGE);
//是否有权限
if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {
LogTool.d(TAG, "requestPermissions");
//是否是拒绝过一次权限申请。
if(ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_EXTERNAL_STORAGE)){
LogTool.d(TAG,"user reject this permissions");
return;
}else { //申请权限
LogTool.d(TAG, "requestPermissions");
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_PERMISSIONS_REQUEST_CODE);
return;
}
return;
}
}
LogTool.d(TAG, "Already have permissions");
}
这个是结果回调,根据用户是否给予权限做出相关事情。
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
int grantResult = grantResults[0];
//doSomething
}
}