Tôi muốn phát hiện số lượng khuôn mặt trong khung máy ảnh phía trước. Tôi có thể phát hiện khuôn mặt khi tôi nhận được hình ảnh bằng cách sử dụng hình ảnh này: http://www.developer.com/ws/android/programming/face-detection-with-android-apis.html. Nhưng tôi không biết cách chụp ảnh bằng camera trước cứ sau 30 giây mà không có sự tương tác của người dùng. Có ai đó vui lòng giúp tôi không?Nhận diện khuôn mặt trong Android mà không cần tương tác người dùng
Trả lời
Mã sau sẽ chụp ảnh từ máy ảnh của bạn sau mỗi 5 giây.
if (TIMER_STARTED) {
multishotTimer.cancel();
multishotTimer.purge();
TIMER_STARTED = false;
} else {
multishotTimer = new Timer();
multishotTimer.schedule(new TimerTask() {
@Override
public void run() {
TIMER_STARTED = true;
Camera camera = surfaceView.getCamera();
camera.takePicture(null, null,
new HandlePictureStorage());
}
}, 1000, 5000L);
}
Ở đây, TIMER_STARTED là boolean đó cho biết timer đang chạy hay không.
Sau đây là mã cho HandlePictureStorage
private class HandlePictureStorage implements PictureCallback {
@Override
public void onPictureTaken(byte[] picture, final Camera camera) {
//do something when picture is captured...
}
}
Bạn nên được lên kế hoạch một RTC_WAKEUP
Alarm
sử dụng AlarmManager
, tại mỗi 30 giây, thiết lập một PendingIntent
đến Alarm
để khởi động một Service
và bên trong Service
bạn nên truy cập vào Camera
để chụp ảnh.
Bạn có lẽ nên xem bài đăng này: Open/Run camera from a background Service.
Bạn có thể tạo bằng tay một SurfaceView và xem trước camera vào nó như sau:
//First get a reference to the SurfaceView displaying the camera preview
cameraSurface = (SurfaceView) findViewById(R.id.cameraSurface);
cameraSurfaceHolder = cameraSurface.getHolder();
cameraSurfaceHolder.addCallback(cameraSurfaceHolderCallbacks);
.
.
.
private SurfaceHolder.Callback cameraSurfaceHolderCallbacks = new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(mCamera == null)return;
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open();
mCamera.setPreviewDisplay(holder);
} catch (Exception exception) {
if(mCamera == null)return;
mCamera.release();
mCamera = null;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Parameters cameraParameters = mCamera.getParameters();
cameraParameters.setPreviewSize(320, 240);
cameraParameters.setPictureSize(320, 240);
int avrgExposure = (cameraParameters.getMinExposureCompensation() + cameraParameters.getMaxExposureCompensation())/2;
cameraParameters.setExposureCompensation(avrgExposure);
mCamera.setParameters(cameraParameters);
mCamera.startPreview();
mCamera.takePicture(null, null, mPictureCallback);
}
};
Đừng quên thêm quyền camera thích hợp trong của bạn manifest:
<uses-permission android:name="android.permission.CAMERA"/>
Và cuối cùng nếu bạn đang sử dụng một thiết bị Android 4.0 trở lên, bạn có thể sử dụng phương pháp:
mCamera.startFaceDetection();
.
.
.
private FaceDetectionListener faceDetectionListener = new FaceDetectionListener() {
@Override
public void onFaceDetection(Face[] faces, Camera camera) {
//Faces have been detected...
}
};
.
.
.
mCamera.setFaceDetectionListener(faceDetectionListener);
Bạn có thể vào post này mà giải thích tất cả mọi thứ liên quan đến rằng chức năng cụ thể và thậm chí cung cấp một chức năng Android Source Code mà bạn có thể tải xuống để tự mình làm.
Trân trọng!
Bạn không thể sử dụng Trình xử lý như thế này: this.refreshTimer = 30 * 1000; this.handlerFaceCapture = new Handler(); this.faceCapture = new FaceCaptureScheduler(); this.handlerFaceCapture .postDelayed (this.handlerFaceCapture, this.refreshTimer); Nó sẽ được thực hiện Scheduler mà phải thực hiện Runnable trên mỗi khoảng thời gian 30 giây. – Gilson