Android 6.0 之后,对于一些危险权限,应用只是在配置文件中申请权限是不可以执行危险操作的,要执行这些危险操作,都必须进行运行时权限处理。
运行时权限就是在程序需要使用危险权限时,由用户授权给予应用去执行某些危险操作
具体操作:
1>判断是否已经获得权限:
使用 ContextCompat 的 checkSelfPermission() 方法,需要传入两个参数:第一个是 Context第二个是当前需要申请的权限名然后这个方法有返回值,和 PackageManager.PEMISSION_GRANTED 作比较, 如果相等则说明获得权限,如果不相等则说明用户没有授权int code=ContextCompat.checkSelfPermission(this,"android.permission.READ_CONTACTS"); if(code== PackageManager.PERMISSION_GRANTED){ //操作代码 Intent intent=new Intent(this,NumActivity.class); startActivity(intent); }else{ //调用ActivityCompat.requestPermissions()方法申请运行时权限 ActivityCompat.requestPermissions(this, new String[]{"android.permission.READ_CONTACTS"},1); }
如果已经获得权限,则直接可以执行相关操作
如果没有获得权限,则进入 2>
2>获取运行时权限:
调用 ActivityCompat.requestPermissions() 方法申请运行时权限 ,需要传入三个参数
第一个是Context
第二个是当前需要申请的权限名
第三个是请求码,确保唯一值就行//调用ActivityCompat.requestPermissions()方法申请运行时权限 ActivityCompat.requestPermissions(this, new String[]{"android.permission.READ_CONTACTS"},1);
3>返回授权结果:调用完 ActivityCompat.requestPermissions() 方法后无论是什么结果都会返回 onRequestPermissionsResult() 方法,而且授权结果会打包在 grantResults 参数当中,现在只需要判断授权结果,做相应处理就行了
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){ //执行操作 Intent intent=new Intent(this,NumActivity.class); startActivity(intent); } break; default: } }