我正在尝试编写一个应用程序,以固定的给定时间间隔触发Android摄像头。我正在用TimerTask测试它,但是我读到我不认为在JPEG准备好之前再次触发相机。是否有一种方法以固定的间隔触发相机,并让JPEG在准备就绪时再来,然后再次触发它,让下一个JPEG在读取等时出现,而不会导致某种堆溢出?有没有办法做这个相机2?
以下是我到目前为止的相关方法:
PictureCallback onPicTake=new PictureCallback() {
@Override
public void onPictureTaken ( byte[] bytes, Camera camera){
Log.d("data size",""+bytes.length);
Log.d("taken", "taken");
new SaveImageTask(getStorage()).execute(bytes);
resetCam();
}
};
Camera.ShutterCallback onShutter=new Camera.ShutterCallback()
{
@Override
public void onShutter () {
AudioManager mgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mgr.playSoundEffect(AudioManager.FLAG_PLAY_SOUND);
}
};
private class CameraTrigger extends TimerTask{
public void run(){
mCamera.takePicture(onShutter, null, onPicTake);
}
}
preview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
timer = new Timer();
timer.schedule(new CameraTrigger(), 0, 1000);
}
});
private void resetCam() {
mCamera.startPreview();
preview.setCamera(mCamera);
}
答案 0 :(得分:1)
您的代码中没有任何严重错误,只要您确定onPictureTaken()
不会超过1000毫秒。
我建议的一个优化是违反直觉而不是将图片保存在后台任务中,而是在回调线程上进行。
原因是 bytes 的巨大内存块不能以这种方式容易地进行垃圾回收。从JVM的角度来看,以下模式不会给垃圾收集器带来负担:
但是如果有对字节的未完成引用,那么GC可能难以决定,并且您可以看到CPU使用率的峰值,应用程序没有响应,并且最终甚至延迟了TimeTask回调。 / p>
请注意,在主(UI)线程上使用 onPictureTaken()并不健康。要在后台保持相机回调,您需要在辅助Looper线程上打开相机(请参阅此example)。