PreviewCallback и PreviewCallback с буфером не вызываются

У меня вопрос по поводу обратных вызовов предварительного просмотра с Android 4.0.x. Я установил камеру, создаю поверхность для отображения изображения с камеры on previewCallback-событие. Все отлично работает

Но с Android 4.0.x ни onPreviewCallback называется ни onPreviewCallbackWithBuffer, Есть ли решение этой проблемы?

Я хочу сделать снимок экрана и не хочу использовать takePicture()-way, потому что он замораживает живое изображение на короткое время.

2 ответа

Решение

Вы должны вызывать setPreviewCallback в методе surfaceChanged, а не только в 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());
    }
}

Вы можете вызвать 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 {
                        }
                    }
                }

У меня тоже была аналогичная проблема. Я инициализировал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();

Надеюсь, это поможет

Другие вопросы по тегам