如何使用handler定时抓图?
How to use handler to capture images at regular intervals?
点击拍摄按钮后,我需要定期拍摄图像。我已经使用 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());
}
}
};
}
尝试使您的处理程序和可运行程序成为全局的,然后在 setOnclickListener() 中设置
handler.postDelayed(r, 15000);
在您的 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 。此外,当您的 activity/camera 不可用时,您应该调用 handler.removeCallbacks(runnable);
。
点击拍摄按钮后,我需要定期拍摄图像。我已经使用 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());
}
}
};
}
尝试使您的处理程序和可运行程序成为全局的,然后在 setOnclickListener() 中设置 handler.postDelayed(r, 15000);
在您的 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 。此外,当您的 activity/camera 不可用时,您应该调用 handler.removeCallbacks(runnable);
。