先直接看代码:
1 public void onClick(View v){ 2 onCallPermission(); 3 } 4 5 public void onCallPermission(){ 6 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//判断当前系统的SDK版本是否大于23 7 //如果当前申请的权限没有授权 8 if (!(checkSelfPermission(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED)){ 9 //第一次请求权限的时候返回false,第二次shouldShowRequestPermissionRationale返回true 10 //如果用户选择了“不再提醒”永远返回false。 11 if (shouldShowRequestPermissionRationale(android.Manifest.permission.RECORD_AUDIO)){ 12 Toast.makeText(this, "Please grant the permission this time", Toast.LENGTH_LONG).show(); 13 } 14 //请求权限 15 requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO},1); 16 }else {//已经授权了就走这条分支 17 Log.i("wei", "onClick granted"); 18 } 19 } 20 } 21 22 23 @Override 24 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 25 if (requestCode==1){ 26 if (permissions[0].equals(Manifest.permission.RECORD_AUDIO)&&grantResults[0]==PackageManager.PERMISSION_GRANTED){ 27 listernUi();//得到权限之后去做的业务 28 }else {//没有获得到权限 29 Toast.makeText(this,"你不给权限我就不好干事了啦",Toast.LENGTH_SHORT).show(); 30 } 31 } 32 }
第一个方法:Button的点击事件,点击之后请求权限,然后走第二个方法。
第二个方法:请求权限,checkSelfPermission(Manifest.permission.RECORD_AUDIO)是检查应用本身是否包含对应的权限,如果包含返回PackageManager.PERMISSION_GRANTED;
shouldShowRequestPermissionRationale :应用安装后第一次访问,直接返回false;第一次请求权限时,用户拒绝了,下一次 shouldShowRequestPermissionRationale()返回 true,这时候可以显示一些为什么需要这个权限的说明;第二次请求权限时,用户拒绝了,并选择了“不再提醒”的选项时:shouldShowRequestPermissionRationale()返回 false;
requestPermissions(new String[]{Manifest.permission.RECORD_AUDIO},1); :是请求对应的权限,会弹出一个对话框让用户选择是否授权,用户选择之后会走 onRequestPermissionsResult这个回调方法
第三个方法:当用户选择之后进入该方法,授权处理之后的业务逻辑就写在这个方法里面,(不建议直接把业务逻辑写在requestPermission之后,写在这个回调方法中更好),主要是先对requestCode进行判断,看他对应的是哪个requestPermissions方法,然后判断是否授权了。