我遇到的问题, camera.takePicture()
jpeg回调的频率较低,而所需的图片大小更高。例如。它总是以640x480的速度成功,但仅在5%至40%的情况下使用较小的参数调整(3264x2444分辨率)。相关代码:
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回调。当我在camera.takePicture()
之后添加Thread.sleep(700)
时,它也开始始终执行回调。有任何想法吗?在Nexus 4。
您在启动jpegCallback.onPictureTaken()
之前不能再次调用camera.takePicture()
,因此您需要油门进行button.onClick()
。如果您一直将相机保持在预览模式。
编辑:事实证明,相机对象可能已经收集了垃圾。我创建了对它的静态引用,现在它可以毫无问题地工作。