每5秒钟在android中拍照 [英] Taking pictures in android every 5 seconds
问题描述
使用相机API,我能够成功拍摄照片并将其保存到文件夹中.这是我正在使用的代码:
Using the camera API, i am able to successfully take a picture and save it to a folder. Here is the code that i am using:
Main.xml:
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" />
<Button
android:id="@+id/button_capture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Capture" />
助手类:
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class CameraPreview extends SurfaceView implements
SurfaceHolder.Callback {
private SurfaceHolder mSurfaceHolder;
private Camera mCamera;
// Constructor that obtains context and camera
@SuppressWarnings("deprecation")
public CameraPreview(Context context, Camera camera) {
super(context);
this.mCamera = camera;
this.mSurfaceHolder = this.getHolder();
this.mSurfaceHolder.addCallback(this);
this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
try {
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.setDisplayOrientation(90);
mCamera.startPreview();
} catch (IOException e) {
// left blank for now
}
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
mCamera.stopPreview();
mCamera.release();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
int width, int height) {
// start preview with new settings
try {
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
} catch (Exception e) {
// intentionally left blank for a test
}
}
}
活动类别:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
public class MyCamera extends Activity {
private Camera mCamera;
private CameraPreview mCameraPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.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);
}
});
}
/**
* Helper method to access the camera returns null if it cannot get the
* camera or does not exist
*
* @return
*/
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) {
} catch (IOException e) {
}
}
};
private static File getOutputMediaFile() {
File mediaStorageDir = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"MyCameraApp");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
.format(new Date());
File mediaFile;
mediaFile = new File(mediaStorageDir.getPath() + File.separator
+ "IMG_" + timeStamp + ".jpg");
return mediaFile;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.my_camera, menu);
return true;
}
}
我还向清单文件添加了以下内容:
I have also added to the manifest file the following:
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我遇到以下问题:
我要执行以下操作:
-
按下拍摄按钮后,我希望相机使用倒数计时器每5秒自动继续拍摄一张照片.所以我添加了以下内容:
After pressing the capture button, i want the camera to automatically continue capturing pictures every 5 sec, by using a count down timer. So i have added the following :
while(true){
new CountDownTimer(5000,1000){
@Override
public void onFinish() {
mCamera.takePicture(null, null, mPicture);
}
@Override
public void onTick(long millisUntilFinished) {
}
}.start();
}
但是,我不再有照片了.我添加了while(true),使代码没有重复.我没有使用while(true)尝试过,并且按预期,图像捕获被延迟了5秒
However, I am no longer getting a picture. I added the while(true) to make the code repeat by its not. I have tried it without the while(true) and as expected the image capturing is delayed for 5 second
第二件事是:如何更改捕获的图片的质量?
Second thing is: How can I change the quality of the captured pictures?
任何帮助将不胜感激.
推荐答案
删除while(true)
,您将不需要它并创建无限的倒数计时器.
Remove the while(true)
, you don't need it and will create unlimited countdown timers.
将您的倒计时开始时间更改为此
Change your Countdown start to this
new CountDownTimer(5000,1000){
@Override
public void onFinish() {
}
@Override
public void onTick(long millisUntilFinished) {
mCamera.startPreview();
mCamera.takePicture(null, null, mPicture);
}
}.start();
在这种情况下,每1000毫秒调用一次
onTick
,并在计时器倒数结束时调用onFinish
.
onTick
is called every 1000 ms in this case, and onFinish
is called when the Timer countdown is finished.
如果您想每5秒重复一次,我认为CountDownTimer
不能满足您的需求... Timer
会更好.
If you want to repeat something every 5 seconds i don't think a CountDownTimer
fits your needs... a Timer
would be better.
Timer timer = new Timer();
timer.schedule(new TimerTask()
{
@Override
public void run()
{
mCamera.startPreview();
mCamera.takePicture(null, null, mPicture);
}
}, 0, 1000);
记住保存Timer
实例以阻止它!
Remeber to save Timer
instace to stop it!
这篇关于每5秒钟在android中拍照的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!