-1

首先请原谅我的英语不好。我在以编程方式拍照时遇到问题。我写了一个应用程序,它根据倒数计时器收集照片,然后使用 c++ 代码处理照片。

我正在使用虚拟 SurfaceView,因为我不需要在 UI 中进行预览。下面的代码在我的手机 Xperia mini - API 15 上运行(所以权限和代码是正确的),但我借用了学校的 Nexus 5 - API 21 并且预览存在问题。

takePicture: camera 0: Cannot take picture without preview enabled

我找到了一个解决方案,它使用 setPreviewTexture(下面评论)而不是 setPreviewDisplay。它适用于通常保存的第一张照片,但在第二次调用 takePicture() 后出现相同的错误。

谢谢你的每一个建议,LS

Camera camera;
@Override
protected void onResume() {
    super.onResume();
    // is camera on device?
    if(!checkCameraHardware()) return;

    releaseCamera();
    try {
        camera.stopPreview();
    } catch (Exception e){
      Log.d(TAG, "No preview before.");
    }

    SurfaceView dummy = new SurfaceView(this);
    camera = Camera.open();
    Camera.Parameters params = camera.getParameters();
    params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
    camera.setParameters(params);

    try {
        //camera.setPreviewTexture(new SurfaceTexture(10));
        camera.setPreviewDisplay(dummy.getHolder());
    } catch (IOException e) {
        e.printStackTrace();
    }
    camera.startPreview();
}

解决方案:

我需要刷新预览。下面的代码也适用于 Xperie 和 Nexus。问题仍然是为什么我必须使用 setPreviewTexture,因为 setPreviewDisplay 总是在 Nexus 上返回错误。

    camera.takePicture(null, null, new PictureCallback() {
        @Override
        public void onPictureTaken(final byte[] data, Camera camera) {
            // save picture
            refreshPreview();
        }
    });

public void refreshPreview() {
    try {
        camera.stopPreview();
    } catch (Exception e) {}

    try {
        camera.startPreview();
    } catch (Exception e) {}
}

并在函数 onResume()

try {
    camera.setPreviewTexture(new SurfaceTexture(10));
} catch (IOException e) {}
4

2 回答 2

1

只需添加一个回调即可在您的相机实例上开始预览。问题是在相机实例上开始预览后,需要一些时间才能拍照。试试这个:

           camera.startPreview();
            camera.setOneShotPreviewCallback(new Camera.PreviewCallback() {
                @Override
                public void onPreviewFrame(byte[] data, Camera camera) {
                    camera.takePicture(null, null, new Camera.PictureCallback() {
                        @Override
                        public void onPictureTaken(byte[] data, Camera camera) {
                   // do something you want with your picture and stop preview
                            camera.stopPreview();
                        }
                    });
于 2015-07-01T16:58:01.787 回答
0

拍摄照片后,刷新您的表面视图并停止预览并释放相机并再次重新启动该过程。

        try {
                camera.takePicture(null, null, new PictureCallback() {
            public void onPictureTaken(final byte[] data, Camera camera) {
                //once ur logic done
                refreshCamera();
            }
        });
            } catch (Exception e2) {
                // Toast.makeText(getApplicationContext(), "Picture not taken", Toast.LENGTH_SHORT).show();
                e2.printStackTrace();
            }

        public void refreshCamera() {
            if (dummy.getHolder().getSurface() == null) {
                return;
            }

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

            try {
                camera.setPreviewDisplay(dummy.getHolder());
                camera.startPreview();
            } catch (Exception e) {

            }
        }

希望这个解决方案可以帮助你。

于 2015-04-15T22:39:41.227 回答