Android 6.0及其更高版本中,即API>=23之后的版本中某些受保护的权限无法直接通过Manifest来直接默认获取,只能通过动态获取,这样做的好处是显而易见的,可以让权限用在该用的地方。

动态获取权限要做的是这几件事情:

  • 判断当前的系统版本,API版本的多少来确定使用哪种获取权限的方法,如果API小于23那么就不需要发起权限获取操作。
  • 如果API大于或等于23那么就发起权限获取,ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},1); this 为当前的操作主体Activity,string数组内为所请求的权限,可见可以同时获取多个权限,最后一位是请求码requestcode。
  • 最后一步是确定回调函数onRequestPermissionsResult(int requestCode,String[] Permissions,int[] grantResult) 其中grantResult数组的第一位若等于PackageManager.PERMISSION_GRANTED那么说明权限被授予否则权限授予失败。

接下来show you the code:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        try{
          //权限申请函数
            requestCameraPermission();
        }catch (Exception e){
            Log.d("CameraDemo Start",e.toString());
        }
    }
});
private void requestCameraPermission(){
    //判断SDK版本是否大于23
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        int checkCameraPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
        if(checkCameraPermission != PackageManager.PERMISSION_GRANTED){
            //进入这个部分表示程序没有该权限
            ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},1);
            return;
        }else{
            Toast.makeText(MainActivity.this,"相机权限已获取成功",Toast.LENGTH_LONG).show();
            onCallCamera();
        }
    }else{
        Toast.makeText(MainActivity.this,"API小于23无需获取权限,只需要声明即可",Toast.LENGTH_LONG).show();
        onCallCamera();
    }
}
public void onRequestPermissionsResult(int requestCode,String[] Permissions,int[] grantResult){
    switch (requestCode){
        case 1:
            if(grantResult[0] == PackageManager.PERMISSION_GRANTED){
                //TODO 相机调用函数
                onCallCamera();
            }else{
                Toast.makeText(MainActivity.this,"权限被拒绝",Toast.LENGTH_LONG).show();
            }
        break;
        default:
            super.onRequestPermissionsResult(requestCode,Permissions,grantResult);
    }
}
​
private void onCallCamera() {
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(i, 1);
    Toast.makeText(MainActivity.this, "函数调用成功", Toast.LENGTH_LONG).show();
}
protected void onActivityResult(int requestcode, int resultCode, Intent data){
  //接收camera拍摄下来的照片回传到activity中
    try{
        if(requestcode !=1){
            return;
        }
   super.onActivityResult(requestcode,resultCode,data);
        Bundle extras = data.getExtras();
        Bitmap bitmap = (Bitmap)extras.get("data");
        imageView.setImageBitmap(bitmap);
    }catch (Exception e){
        Log.d("Camera",e.toString());
    }
​
}

下面是另外一个动态获取权限的思路:

Intent i =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){
  ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1);
}else {
    startActivityForResult(i,1);
  Toast.makeText(MainActivity.this,"test_1",Toast.LENGTH_LONG).show();
}
startActivityForResult(i,1);
Toast.makeText(MainActivity.this,"test_2",Toast.LENGTH_LONG).show();

核心部分是:

if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){   ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1); } 

其中的本质就是判断权限是否存在,然后若是不存在该权限那么就直接申请。但有一个坏处是这里申请的权限是写死的,最好的解决办法是写一个函数便于调用。

Last modification:September 21st, 2019 at 12:23 pm
不要打赏!不要打赏!(大雾