不调用带缓冲区的PreviewCallback和PreviewCallback

时间:2012-12-11 12:49:50

标签: android callback camera

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

但是使用Android 4.0.x既不会调用onPreviewCallback也不会调用onPreviewCallbackWithBuffer。 这个问题有解决方法吗?

我想拍摄一个屏幕截图而不想使用takePicture()方式,因为它会在短时间内冻结实时图像。

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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 {
                        }
                    }
                }

答案 2 :(得分: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();

希望有帮助