目录
认识6.0以后的权限问题
权限概念
概念问题不用多说,你想使用手机中的某项功能或涉及用户信息时,就需要调用权限,被用户确认后,方可使用。
权限的分类
Google 将权限分为两类:一类是Normal Permissions,一类是Dangerous Permission。
Normal Permissions
Normal Permissions(常规权限)主要是要使用手机的某项功能时且不涉及用户信息情况下,在AndroidManifest.xml注册下就可以正常使用,在安装时就授权,不需要每次使用时都检查权限,而且用户不能取消以上授权
Normal Permissions权限
Dangerous Permission
Dangerous Permission(危险权限)主要是在手机使用过程中需要获取用户隐私时,询问用户是否给于此权限。用户同意,便可以正常使用。
Dangerous Permission权限
代码中怎么去获取权限
Normal Permissions 获取权限
这个获取权限很简单只需要在AndroidManifest.xml中获取即可
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
Dangerous Permission 获取权限
核心流程
动态权限的核心工作流程:checkSelfPermission检查是否已被授予——>requestPermissions申请权限——>自动回调onRequestPermissionsResult——>shouldShowRequestPermissionRationale。无论什么框架变出花来都离不开这个基本的流程。
checkSelfPermission检查
private boolean checkSelfPermissionAll(String[] permissions) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
Log.i("cdy", "checkSelfPermissionAll: "+permission);
return false;
}
}
return true;
}
请求权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE
, Manifest.permission.READ_CONTACTS}, 10000);
自动回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode==10000){
boolean isPermission = true;
for(int grant:grantResults){
if(grant!=PackageManager.PERMISSION_GRANTED){
isPermission=false;
break;
}
}
if(isPermission){
Intent intent = new Intent(getApplicationContext(), ContactListActivity.class);
startActivityForResult(intent, 0);
}
}
}
shouldShowRequestPermissionRationale作用在拒绝权限后,提示用户的(在完全拒绝后)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(requestCode==PERMISSIONS_REQUEST_CALL_PHONE){
if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
callPhone();
}else {
if(!ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.CALL_PHONE)){
AlertDialog dialog = new AlertDialog.Builder(this)
.setMessage("该功能需要访问电话的权限,否则无法工作")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create();
dialog.show();
}
return;
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}