在表面视图中打开前置摄像头

时间:2016-02-11 07:01:45

标签: java android camera

我得到例外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 android:name="android.permission.CAMERA" />

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

缺少什么,我该如何解决? 欢迎任何帮助。

3 个答案:

答案 0 :(得分:1)

您正在获得异常,因为您将cameraId初始化为-1,这是错误的。 并传递它以获取相机信息

Camera.getCameraInfo(cameraId,info);

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

答案 1 :(得分:1)

我改变了方法;之前我正在实施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
    }
};

这解决了我的问题。

答案 2 :(得分:0)

此方法将返回前摄像头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());

相关问题