【问题标题】:How to use handler to capture images at regular intervals?如何使用处理程序定期捕获图像?
【发布时间】:2018-07-27 19:46:36
【问题描述】:

点击拍摄按钮后,我需要定期拍摄图像。我已经使用 Handler 编写了代码。但现在发生的是,我需要在每次捕获图像时单击按钮。我想要的是只单击一次按钮,然后进行自动化处理。即定期捕获图像而无需进一步点击。我怎样才能做到这一点。谢谢。

 public class MyCamera extends Activity {
        private Camera mCamera;
        private CameraPreview mCameraPreview;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);
            mCamera = getCameraInstance();
            mCameraPreview = new CameraPreview(this, mCamera);
            FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
            preview.addView(mCameraPreview);



            Button captureButton = (Button) findViewById(R.id.button_capture);
            captureButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mCamera.takePicture(null, null, mPicture);
                }
            });

            final Handler handler = new Handler();
            final Runnable r = new Runnable()
            {
                public void run()
                {
                    mCamera.takePicture(null,null,mPicture);
                }
            };
            handler.postDelayed(r, 15000);

        }


        private Camera getCameraInstance() {
            Camera camera = null;
            try {
                camera = Camera.open();
            } catch (Exception e) {
                // cannot get camera or does not exist
            }
            return camera;
        }



        PictureCallback mPicture = new PictureCallback() {

            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                File pictureFile = getOutputMediaFile();
                if (pictureFile == null) {
                    return;
                }
                try {
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    fos.write(data);
                    fos.close();
                } catch (FileNotFoundException e) {
                    Log.d(TAG, e.getMessage());
                } catch (IOException e) {
                    Log.d(TAG, e.getMessage());
                }

            }
        };



    }

【问题讨论】:

  • 这里的错误是什么??
  • 你的意思是要触发按钮点击时的间隔吗?如果是这样,您只需将处理程序代码与 handler.postDelayed 一起移动,以便在 onClick 中调用
  • @karandeepsingh 我检查了链接。但问题是,虽然任务是连续发生的,但每当我想捕获图像时,我都需要单击按钮。 .我想要的是只需单击一次捕获按钮即可定期捕获图像。我尝试了多种方式。还是找不到答案。这就是我要的。 一键捕捉图像开始。然后它会定期连续发生,无需任何用户交互。

标签: java android android-camera android-handler


【解决方案1】:

在你的 onclick 监听器中,

    handler.removeCallbacks(runnable);
    handler.postDelayed(runnable,15000);

并像这样在 onclick 侦听器之外声明您的处理程序和可运行,

 Handler handler=new Handler();
 Runnable runnable=new Runnable() {
      @Override
      public void run() {
          mCamera.takePicture(null, null, mPicture);
          handler.postDelayed(this, 15000);
      }
  };

解释

当您单击相机按钮时,将附加一个处理程序,该处理程序将在 15 分钟后拍照,我们将相同的可运行对象附加到处理程序以重复执行此任务。如果用户再次单击相机按钮,我有用户 handler.removeCallbacks(runnable); 以避免多个处理程序。可能您可以自行删除 onCickListener 。此外,当您的活动/相机不可用时,您应该致电handler.removeCallbacks(runnable);

【讨论】:

    【解决方案2】:

    尝试使您的处理程序和可运行全局,然后在 setOnclickListener() 中设置 handler.postDelayed(r, 15000);

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多