Android权限机制
- 保护用户安全和隐私
- 低于6.0系统安装APP权限一次性申请
- 运行时权限
Android权限分类
- 普通权限(自动授权)
- 危险权限(手动授权)——9组24个权限

在程序运行时申请权限
- AndroidManifest.xml中
<uses-permission android:name="android.permission.CALL_PHONE">
- ContextCompat.checkSelfPermission(Context,权限名)方法,判断是否授权PackageManager.PERMISSION_GRANTED
- ActivityCompat.requestPermissions(Activity实例,String数组,请求码)申请授权
if(ContextCompat.checkSelfPermission(MainActivity.this,Mainifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED)
{
//没有授权,则申请授权
ActivityCompat.requestPermissions(MainActivity.this,new String[]{android.Manifest.permission.CALL_PHONE},1)
}else{
//有授权,则执行逻辑
}
- 回调onRequestPermissionsResult(请求码,String数组,授权结果grantResults)方法
switch(requestCode){
case 1:
if(grantResult.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
//执行业务逻辑
}else{
//提示未授权
}
break;
default:
}
一次申请多个权限
- 创建List<String>集合
List<String> permissionList = new ArrayList<>();
- 依次判断是否授权,未授权就添加到List集合
if(ContextCompat.checkSelfPermission(MainActivity.this,android.Manifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED)
{
//没有授权,则加入List
permissonList.add(Mainifest.permission.CALL_PHONE);
}
- 判断是否需要申请
if(!permissionList.isEmpty()){
//需要申请
//第4、第5步
}else{
//已有权限,无需申请
//执行业务逻辑
}
- List转换成String数组
String[] permissons = permissionList.toArray(new String[peimissionList.size()]);
- String数组传入ActivityCompat.requestPermissions()
ActivityCompat.requestPermissions(MainActivity.this,permissions,1);
- onRequestPermissionResult()中循环判断是否全部授权
if(grantResults.length>0){
for(int result:grantResults){
//若有一个未授权,则结束程序
if(result!=PackageManager.PERMISSION_GRANTED){
finish();
return;
}
}
//执行业务逻辑
}else{
//未知错误
}
Demo:获取CALL_PHONE授权
Demo:使用百度定位