在Android6.0之前,我们只需要在AndroidManifest.xml文件中直接添加权限即可,但是在Android6.0之后,我们只在AndroidManifest.xml文件中配置是不够的,还需要在Java代码中进行动态获取权限。当然这里不是所有的权限都需要动态获取,只需要获取危险权限就可以了。(毕竟Android权限100多种,要是每个都需要获取,那不累死开发人员啦)
Android中的危险权限分为9组24种:
我们只需要在用这些权限的时候,才需要去动态申请,除这些之外的权限,我们只需要在AndroidManifest.xml文件种写上即可,动态申请的权限同样需要在AndroidManifest.xml文件中写。而且每一组种的权限只要有一个授权了,其他的也会自动授权
动态申请权限步骤:
1、在AndroidManifest.xml文件中写上这个权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2、在代码中请求该权限
if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED)
{
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}
如果权限多的话,可以在string数组里写上多个
List<String> permissionList=new ArrayList<>();
if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED)
{
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED)
{
permissionList.add(Manifest.permission.CAMERA);
}
if (!permissionList.isEmpty()){ //申请的集合不为空时,表示有需要申请的权限
ActivityCompat.requestPermissions(this,permissionList.toArray(new String[permissionList.size()]),1);
}else { //所有的权限都已经授权过了
}
3、授权结果处理(重写onRequestPermissionResult方法)
单个
/**
* 权限申请返回结果
* @param requestCode 请求码
* @param permissions 权限数组
* @param grantResults 申请结果数组,里面都是int类型的数
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ //同意权限申请
Toast.makeText(this,"授权成功", Toast.LENGTH_SHORT).show();
}else { //拒绝权限申请
Toast.makeText(this,"权限被拒绝了,程序功能限制", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
多个
/**
* 权限申请返回结果
* @param requestCode 请求码
* @param permissions 权限数组
* @param grantResults 申请结果数组,里面都是int类型的数
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0){
for (int i = 0; i < grantResults.length; i++) {
int grantResult = grantResults[i];
if (grantResult == PackageManager.PERMISSION_DENIED){ //这个是权限拒绝
String s = permissions[i];
Toast.makeText(this,s+"权限被拒绝了",Toast.LENGTH_SHORT).show();
}else{ //授权成功了
//do Something
String s = permissions[i];
Toast.makeText(this,s+"授权成功",Toast.LENGTH_SHORT).show();
}
}
}
break;
default:
break;
}
}