0

I have been using TextureView for my camera preview until I cannot find a way to set its background color so I switched to SurfaceView but the preview is not working anymore. Everything else is working fine, except for the preview.

Here is my code when I used 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();
    }}

..and here is my code using 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);
            }

...and I am adding this code just in case it has something to do with it

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

Thanks

Handsum
  • 15
  • 1
  • 7
  • Where are you calling previewCamera from? In onCreate? onResume? Or in the SurfaceView surfaceCreated/Modified callbacks? What errors are you getting in the system logs, especially from the camera service? – Eddy Talvala Nov 29 '16 at 01:42

2 Answers2

0

Have you tried setting a fixed size before retrieving the Surface object?

surfaceView.setFixedSize(previewSize.getWidth(),previewSize.getHeight());
DaveJ
  • 55
  • 1
  • 6
0

You should not use Handler if you use SurfaceView to preview.Just like following:

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

By the way,the size of SurfaceView won't let the preview don't work,so you don't have to set a fix size.