我遇到了一个棘手的问题,其中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()
。如果您始终将相机保持在预览模式,则可以减少延迟。