Android6.0调用系统相机遇到的问题

背景:

之前的项目一直都是跑在Android版本5.0的设备上的,现在要大批量的更换设备(Android 9),所以遇到了调用相机失败的问题

问题抛出:

java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=org.codeaurora.snapcam/com.android.camera.PermissionsActivity clip={text/uri-list U:file:///storage/emulated/0/workupload.jpg} (has extras) } from ProcessRecord{be96695 17825:com.tisane.pda/u0a95} (pid=17825, uid=10095) with revoked permission android.permission.CAMERA

解决问题:

看到这个问题脑子里首先想到的就是权限的问题,然后着手添加动态申请权限的代码

之前的代码是这样的,是直接调用的系统相机

    rechecked_img_noScrollgridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                onJurisdiction()
            }
        });

    public void photo() {
        Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "workupload.jpg"));
        //指定照片保存路径(SD卡),workupload.jpg为一个临时文件,每次拍照后这个图片都会被替换
        openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(openCameraIntent, TAKE_PICTURE);
    }

Android6.0之后这样做就不行了,google对用户隐私安全这块做到位了,于是出现了动态申请权限,需要用户同意才行

改完之后的代码

    //调用相机的点击事件
    rechecked_img_noScrollgridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                onJurisdiction()
            }
        });
    //动态申请权限
    private void onJurisdiction(){
        if (Build.VERSION.SDK_INT >= 23) {
            int checkCallPhonePermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA);
            if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.CAMERA},0);
                return;
            }else{
                photo();
            }
        } else {
            photo();
        }
    }
    //动态申请权限返回结果
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case 0:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    photo();
                } else {
                    Toast.makeText(getActivity(), "用户么有同意开启这个权限", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
    //调用系统相机
    public void photo() {
        Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "workupload.jpg"));
        //指定照片保存路径(SD卡),workupload.jpg为一个临时文件,每次拍照后这个图片都会被替换
        openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(openCameraIntent, TAKE_PICTURE);
    }

猜你喜欢

转载自blog.csdn.net/lanrenxiaowen/article/details/110952559