Android定时间隔相机触发

时间:2015-11-19 05:19:51

标签: android android-camera

我正在尝试编写一个应用程序,以固定的给定时间间隔触发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);
}

1 个答案:

答案 0 :(得分:1)

您的代码中没有任何严重错误,只要您确定onPictureTaken()不会超过1000毫秒。

我建议的一个优化是违反直觉而不是将图片保存在后台任务中,而是在回调线程上进行。

原因是 bytes 的巨大内存块不能以这种方式容易地进行垃圾回收。从JVM的角度来看,以下模式不会给垃圾收集器带来负担:

  • byte [] bytes = new byte [1Mb];
  • 填充字节
  • onPreviewFrame(的字节);
  • 再没人需要字节
  • 字节内存被回收

但是如果有对字节的未完成引用,那么GC可能难以决定,并且您可以看到CPU使用率的峰值,应用程序没有响应,并且最终甚至延迟了TimeTask回调。 / p>

请注意,在主(UI)线程上使用 onPictureTaken()并不健康。要在后台保持相机回调,您需要在辅助Looper线程上打开相机(请参阅此example)。