Probleme beim Aufrufen der Systemkamera durch Android 6.0

Hintergrund:

Das vorherige Projekt lief immer auf dem Gerät mit Android Version 5.0, und jetzt ist es notwendig, das Gerät in großen Mengen auszutauschen (Android 9), sodass ich auf das Problem gestoßen bin, dass die Kamera nicht aufgerufen werden konnte

Das Problem wirft:

java.lang.SecurityException: Berechtigungsverweigerung: Startabsicht { 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} (hat Extras) } aus ProcessRecord{be96695 17825:com.tisane.pda/u0a95} (pid=17825, uid=10095) mit widerrufener Berechtigung android.permission.CAMERA

Das Problem lösen:

Als ich diese Frage sah, kam mir als Erstes die Frage nach den Berechtigungen in den Sinn, und dann begann ich, den Code für die dynamische Beantragung von Berechtigungen hinzuzufügen

Der vorherige Code sieht so aus: Es ist die Systemkamera, die direkt aufgerufen wird

    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);
    }

Dies ist nach Android 6.0 nicht mehr möglich. Google hat beim Datenschutz und der Sicherheit der Nutzer gute Arbeit geleistet, daher gibt es eine dynamische Anwendungsberechtigung, die die Zustimmung des Nutzers erfordert.

Code nach der Änderung

    //调用相机的点击事件
    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