【问题标题】:android camera2 preview not working with surface viewandroid camera2预览不适用于表面视图
【发布时间】:2017-02-25 22:10:06
【问题描述】:

我一直在使用 TextureView 进行相机预览,直到我找不到设置背景颜色的方法,所以我切换到 SurfaceView,但预览不再起作用。除了预览之外,其他一切都运行良好。

这是我使用 TextureView 时的代码:

public void previewCamera(){
    try {
        SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(previewSize.getWidth(),previewSize.getHeight());
        Surface previewSurface = new Surface(surfaceTexture);

        captureRequestBuilder = device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        captureRequestBuilder.addTarget(previewSurface);
        device.createCaptureSession(Arrays.asList(previewSurface), new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(CameraCaptureSession session) {
                updatePreview(session);
            }

            @Override
            public void onConfigureFailed(CameraCaptureSession session) {
                Toast.makeText(getApplicationContext(),"unable to setup cam preview",Toast.LENGTH_SHORT).show();
            }
        },null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }}

..这是我使用 SurfaceView 的代码

public void previewCamera(){
    try {
        Surface previewSurface = surfaceView.getHolder().getSurface();

        captureRequestBuilder = device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        captureRequestBuilder.addTarget(previewSurface);
        device.createCaptureSession(Arrays.asList(previewSurface), new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(CameraCaptureSession session) {
                updatePreview(session);
            }

...我添加此代码以防万一它与它有关

private void updatePreview(CameraCaptureSession session) {
    previewSession = session;
    if (null == device) {
        return;
    }
    try {
        handlerThread = new HandlerThread("CameraPreview");
        handlerThread.start();
        handler = new Handler(handlerThread.getLooper());

        captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
        previewSession.setRepeatingRequest(captureRequestBuilder.build(), null, ((isRecording)? null:handler));
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

谢谢

【问题讨论】:

  • 你从哪里调用 previewCamera?在 onCreate?继续?或者在 SurfaceView 的surfaceCreated/Modified 回调中?您在系统日志中遇到了哪些错误,尤其是来自摄像头服务的错误?

标签: android surfaceview preview camera2


【解决方案1】:

您是否尝试在检索 Surface 对象之前设置固定大小?

surfaceView.setFixedSize(previewSize.getWidth(),previewSize.getHeight());

【讨论】:

  • setFixedSize 方法属于 SurfaceHolder,不属于 Surface 或 SurfaceView
【解决方案2】:

如果使用SurfaceView进行预览,则不应使用Handler。如下所示:

 manager.openCamera("0", mStateCallback, null);

顺便说一句,SurfaceView 的大小不会让预览不起作用,所以你不必设置固定大小。

【讨论】:

    猜你喜欢
    • 2017-09-09
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多