为了进一步保护用户的安全和隐私,安卓从6.0版本推出了将权限一分为二,分为普通权限和危险权限。6.0以下依然是在安装时列出所有权限,用户同意后就开始安装,所有权限即为同意。而6.0以后危险权限默认用户没有授权,所以我们在使用这些危险权限前需要得到用户的授权,用户同意后才能继续提供服务。
1.先看看哪些是危险权限。共9组24个
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE
2.判断是否已授权:
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED)
checkSelfPermission返回一个int数,可以与后面这个值比较,相等说明已经授权。这行代码判断ACCESS_FINE_LOCATION授权与否。
3.发出权限请求并得到用户选择:
发出权限请求:
ActivityCompat.requestPermissions(MainActivity.this,array,1);
这个请求的一个参数是一个字符串数组,是权限数组,也就是每次可以发出多个权限的请求。
返回的结果在下面的方法中:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1:
if (grantResults.length>0){
for (int permit:grantResults){
if (permit!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(MainActivity.this,"请同意所有权限",Toast.LENGTH_SHORT).show();
return;
}
}
locate();
}
break;
}
}
第一个参数结果码,为1说明正常,第二个是权限数组,第三个是结果数组,Int类型,我对这个数组进行遍历,如上所说与PackageManager.PERMISSION_GRANTED这个值进行比较确定用户是否对相应权限进行了授权。
4.多个要求权限的处理技巧:用一个list,判断每一个权限把没有授权的加入list,然后转成数组进行请求:
List<String> permissions=new ArrayList<>();
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED){
permissions.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.READ_PHONE_STATE)
!=PackageManager.PERMISSION_GRANTED){
permissions.add(android.Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
!=PackageManager.PERMISSION_GRANTED){
permissions.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissions.isEmpty()){
String[] array=permissions.toArray(new String[permissions.size()]);
ActivityCompat.requestPermissions(MainActivity.this,array,1);
} else {
locate();//已经同意所有权限
}