有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在曲面视图中打开前摄像头

我遇到异常java.lang.RuntimeException: Fail to get camera infoCamera.getCameraInfo(cameraId,info);

我的代码是:

public void surfaceCreated(SurfaceHolder holder) {
    int cameraId = -1;
    for(int i=0;i<Camera.getNumberOfCameras();i++){
        Camera.CameraInfo info = new Camera.CameraInfo();
        Camera.getCameraInfo(cameraId,info);
        if(info.facing== Camera.CameraInfo.CAMERA_FACING_FRONT){
            cameraId = i;
            break;
        }
    }
    camera = Camera.open(cameraId);
}

而舱单也有:

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

<uses-feature 安卓:name="安卓.hardware.camera" />
<uses-feature 安卓:name="安卓.hardware.camera.front" />
<uses-feature 安卓:name="安卓.hardware.camera.autofocus" />

遗漏了什么,我该如何解决? 欢迎任何帮助


共 (3) 个答案

  1. # 1 楼答案

    您得到异常是因为您将RAID初始化为-1,这是错误的。 并通过它获取摄像机信息

    Camera.getCameraInfo(cameraId,info);

    将cameraId初始化为0以摆脱异常

  2. # 2 楼答案

    此方法将返回前摄像头Id:

    private int getFrontCameraId(){
                int camId = -1;
                int numberOfCameras = Camera.getNumberOfCameras();
                Camera.CameraInfo ci = new Camera.CameraInfo();
    
                for(int i = 0;i < numberOfCameras;i++){
                    Camera.getCameraInfo(i,ci);
                    if(ci.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
                        camId = i;
                    }
                }
    
                return camId;
            }
    

    将此id传递到此处:camera=Camera.open(getFrontCameraId());

  3. # 3 楼答案

    我改变了方法;以前我是实现SurfaceHolder.Callback,但现在我创建了它的对象

    我将代码从SurfaceCreated移动到了onResume()

    public void onResume() {
        super.onResume();
        for(int i=0;i<Camera.getNumberOfCameras();i++){
            Camera.CameraInfo info = new Camera.CameraInfo();
            Camera.getCameraInfo(i,info);
            if(info.facing== Camera.CameraInfo.CAMERA_FACING_FRONT){
                cameraId = i;
                break;
            }
        }
        camera=Camera.open(cameraId);
        camera.startPreview();
    }
    

    回调的对象是:

    SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
        public void surfaceCreated(SurfaceHolder holder) {
            // no-op   wait until surfaceChanged()
    
        }
        public void surfaceChanged(SurfaceHolder holder,
                                   int format, int width,
                                   int height) {
            Camera.Parameters parameters=camera.getParameters();
            Camera.Size size=getBestPreviewSize(width, height,
                        parameters);
            Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
    
            if (size!=null) {
                parameters.setPreviewSize(size.width, size.height);
                camera.setParameters(parameters);
                camera.setDisplayOrientation(90);
                cameraConfigured=true;
            }
            camera.startPreview();
        }
        public void surfaceDestroyed(SurfaceHolder holder) {
            // no-op
        }
    };
    

    这解决了我的问题