不调用带缓冲区的PreviewCallback和PreviewCallback

问题描述 投票:6回答:3

我对Android 4.0.x的预览回调有疑问。我设置了一个相机,创​​建了一个显示相机图像on previewCallback事件的表面。一切正常。

但是对于Android 4.0.x,既不会调用onPreviewCallback,也不会调用onPreviewCallbackWithBuffer。有没有解决此问题的方法?

我想拍摄屏幕快照,并且不希望使用takePicture()方式,因为它会在短时间内冻结实时图像。

android callback camera
3个回答
7
投票

您不仅必须在surfaceCreated中,必须在surfaceChanged方法中调用setPreviewCallback。

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    if (mHolder.getSurface() == null){
      return;
    }

    try {
        mCamera.stopPreview();
    } catch (Exception e){
      // ignore: tried to stop a non-existent preview
    }

    try {
        mCamera.setPreviewCallback(this);
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();

    } catch (Exception e){
        Log.d(TAG, "Error starting camera preview: " + e.getMessage());
    }
}

2
投票

您可以调用setOneShotPreviewCallback

mCamera.setOneShotPreviewCallback(new Camera.PreviewCallback() {
                @Override
                public void onPreviewFrame(byte[] data, Camera camera) {
                    Camera.Parameters parameters = camera.getParameters();
                    int format = parameters.getPreviewFormat();
                    //YUV formats require more conversion
                    if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) {
                        int w = parameters.getPreviewSize().width;
                        int h = parameters.getPreviewSize().height;
                        // Get the YuV image
                        YuvImage yuv_image = new YuvImage(data, format, w, h, null);
                        // Convert YuV to Jpeg
                        Rect rect = new Rect(0, 0, w, h);
                        ByteArrayOutputStream output_stream = new ByteArrayOutputStream();
                        yuv_image.compressToJpeg(rect, 100, output_stream);
                        byte[] byt = output_stream.toByteArray();
                        FileOutputStream outStream = null;
                        try {
                            // Write to SD Card
                            File file = createFileInSDCard(FOLDER_PATH, "Image_"+System.currentTimeMillis()+".jpg");
                            //Uri uriSavedImage = Uri.fromFile(file);
                            outStream = new FileOutputStream(file);
                            outStream.write(byt);
                            outStream.close();
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                        }
                    }
                }

0
投票

我也有类似的问题。我在相机准备好之前初始化了PreviewCallbackWithBuffet。为了解决这个问题,我使用了以下代码:

_camera.addCallbackBuffer(createPreviewBuffer(new Size(width, height)));
                    _camera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
                        @Override
                        public void onPreviewFrame(byte[] bytes, Camera camera) {
                            processingRunnable.setNextFrame(bytes, camera))
                        }
                    });
                    _camera.startPreview();

希望有帮助

© www.soinside.com 2019 - 2024. All rights reserved.