我遇到了一个棘手的问题,其中camera.takePicture() jpeg回调的调用频率降低,而所需的图片尺寸更大。例如。它总是以640x480成功,但仅适用于5%至40%的情况,这些情况需要对3264x2448分辨率进行细微的参数调整。
相关代码:

public void foo(View view) {
    Camera.PictureCallback jpegCallback = new Camera.PictureCallback(){
        @Override
        public void onPictureTaken(byte[] bytes, Camera camera) {
            camera.release();
            Toast.makeText(SurvCamActivity.getInstance(), "jpeg callback", Toast.LENGTH_SHORT).show();
        }
    };
    //Gets desired resolution
    SpinnerResolution res = getSelectedSpinnerResolution();
    Camera camera = getCameraInstance();
    try {
        Camera.Parameters params = camera.getParameters();
        params.setPictureSize(res.width, res.height);
        camera.setParameters(params);
        camera.setPreviewTexture(new SurfaceTexture(R.layout.fragment_preview));
        camera.startPreview();
        camera.takePicture(null, null, jpegCallback);
    } catch (IOException e) {
        e.printStackTrace();
    }
}


现在奇怪的是,如果我将断点添加到camera.takePicture()并在线程到达那里后简单地恢复执行,它将始终调用jpeg回调。当我在Thread.sleep(700)之后添加camera.takePicture()时,它也开始一致地执行回调。有任何想法吗?在Nexus 4上进行了测试。

最佳答案

在启动camera.takePicture()之前不能再次调用jpegCallback.onPictureTaken(),因此需要限制button.onClick()。如果您始终将相机保持在预览模式,则可以减少延迟。

10-08 17:33