Фотографирование в android каждые 5 секунд
используя API камеры, я могу успешно сделать снимок и сохранить его в папку. Вот код, который я использую:
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;
}
}
Я также добавил в файл манифеста следующее:
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
у меня есть следующие проблемы:
Я хочу сделать следующее:
-
после нажатия кнопки захвата кнопка, Я хочу, чтобы камера автоматически продолжала захватывать снимки каждые 5 секунд, используя таймер обратного отсчета. Поэтому я добавил следующее :
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 секунд
второе: как я могу изменить качество отснятых фотографии?
любая помощь будет высоко оценили.
2 ответов
удалить while(true)
, вам это не нужно и создаст неограниченные таймеры обратного отсчета.
измените свой обратный отсчет до этого
new CountDownTimer(5000,1000){
@Override
public void onFinish() {
}
@Override
public void onTick(long millisUntilFinished) {
mCamera.startPreview();
mCamera.takePicture(null, null, mPicture);
}
}.start();
onTick
в этом случае вызывается каждые 1000 мс, и onFinish
вызывается, когда таймер заканчивается.
если вы хотите повторять что-то каждые 5 секунд, я не думаю, что CountDownTimer
соответствует вашим потребностям... а Timer
будет лучше.
Timer timer = new Timer();
timer.schedule(new TimerTask()
{
@Override
public void run()
{
mCamera.startPreview();
mCamera.takePicture(null, null, mPicture);
}
}, 0, 1000);
Remeber сохранить Timer
instace, чтобы остановить его!
while (true) {
new CountDownTimer(5000, 1000) {
@Override
public void onFinish() {
releaseCamera();
}
@Override
public void onTick(long millisUntilFinished) {
mCamera.takePicture(null, null, mPicture);
}
}.start();
}
вам нужно захватить изображение, когда onTick
вызывается, а не когда onFinish
называется. onTick
будет вызываться каждый раз через 10 секунд (т. е. заданном интервале), тогда как onFinish
будет вызываться один раз countDownTimer
заканчивается. Вот почему вы получаете только один образ.