关于android权限的知识

普通权限,直接获得;

  1. 危险权限有哪些?短信、电话、通讯录、地理位置、摄像头、读存照片等;
  2. 能否获得权限的状态?android6.0以上可以;
  3. 能否知道,用户点击的“允许”还是“禁止”?23以上才能知道,低版本的不行;
  4. 运行时获取权限,要求targetSdk>=23;

四个比较重要的API:

checkSelfPermission();  //检查是否在已经获取权限
shouldShowRequestPermissionRationale();  //是否弹系统获取权限的提示框
requestPermissions(); //获取权限
onRequestPermissionsResult(); //回调

为了兼容低版本,不用区分sdkVersion是否大于23,建议第1个使用ContextCompat.checkSelfPermission();中间2个,使用ActivityCompat;
6.0以上,拒绝时如果不选择不再提醒,每次都会弹出提示框;6.0以下,拒绝时不选择不再提醒,只有重新打开app,才会再次弹出提示框;

sdk>=23 sdk<23
checkSelfPermission() 返回其该有的值 总是true
shouldShowRequestPermissionRationale() 第一次false,选择不再提醒并拒绝后,下次返回false 不起作用
requestPermissions() 可以是一组权限 不起作用
onRequestPermissionsResult(); 不会执行

示例代码:

@Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_my_camera);
       ButterKnife.bind(this);

       btn = (Button) findViewById(R.id.camera_btn);
       btn.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               int hasCameraPermission = ContextCompat.checkSelfPermission(activity, cameraStr);
               if (hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
                   if (!ActivityCompat.shouldShowRequestPermissionRationale(activity, cameraStr)) {
                       new AlertDialog.Builder(activity).setMessage("reason for need camera").setPositiveButton("ok",null).show();
                       return;
                   }
                   ActivityCompat.requestPermissions(activity, new String[]{cameraStr}, 0);
                   return;
               }
               openCamera();    //android6.0以下的
           }
       });

   }

   //android6.0以下不会执行
   @Override
   public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[]
           grantResults) {
       super.onRequestPermissionsResult(requestCode, permissions, grantResults);
       if (permissions[0].equals(cameraStr)) {
           if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               btn.setText("granted");
               openCamera();
           } else {
               btn.setText("denied");
           }
       }
   }

   private void openCamera(){
       Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
       startActivity(intent);
   }

推荐文章http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/

你可能感兴趣的:(关于android权限的知识)