【问题标题】:How to set CAMERA permission in order to pass regular test?如何设置 CAMERA 权限以通过常规测试?
【发布时间】:2025-12-21 07:15:10
【问题描述】:

这是一个非常奇怪的情况。我正在使用camera2 API,并且有一种打开相机的常规方法。

manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);

这个方法需要做测试,这个

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !=
            PackageManager.
        return;
    }

通过简单的测试来推断清单中是否声明了CAMERA 权限。

<uses-permission android:name="android.permission.CAMERA" />

我的清单文件中有此权限,如果我将此应用程序上传到 Samsung S5,它可以正常工作,但如果我将此应用程序上传到中国设备,则会发生错误。不通过测试,最终不要打开相机......

也许我应该动态设置权限?

还有一件事,我已经尝试过调用方法来打开相机内部测试,这样

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !=
            PackageManager.
        manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);
        return;
    }

但是犯了这个错误

致命异常:主进程:com.example.android.camera2basic,PID:29649 主题:主题:{} java.lang.SecurityException:缺乏访问 android.hardware.camera2.utils.CameraBinderDecorator.throwOnError 相机服务的权限(CameraBinderDecorator.java:108) 在 android.hardware.camera2.legacy.CameraDeviceUserShim.connectBinderShim(CameraDeviceUserShim.java:336) 在 android.hardware.camera2.CameraManager.openCameraDeviceUserAsync(CameraManager.java:327) 在 android.hardware.camera2。 CameraManager.openCamera(CameraManager.java:457) 在 com.example.android.camera2basic.activities.CameraActivity.openCamera(CameraActivity.java:919)

我做错了什么?

【问题讨论】:

    标签: java android camera android-camera


    【解决方案1】:

    API 级别 23+ 上,您需要在运行时请求权限(即使您已在清单中声明它们)。

    你应该这样做:

    ActivityCompat.requestPermissions(this,
        new String[]{Manifest.permission.CAMERA},
        CAMERA_REQUEST);
    

    要处理结果,您需要在 Activity 中覆盖 onRequestPermissionsResult()

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == CAMERA_REQUEST) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission granted
                // you can do your Camera related stuff
            } else {
                // permission denied
            }
        }
    
        // ...
    }
    

    查看documentation 的运行时权限。

    【讨论】: