Chcę wykryć liczby twarzy w przedniej ramie aparatu. Po wykryciu obrazu mogę wykryć twarz: http://www.developer.com/ws/android/programming/face-detection-with-android-apis.html. Ale nie wiem, jak zrobić zdjęcie za pomocą przedniego aparatu co 30 sekund bez interakcji użytkownika. Czy ktoś może mi pomóc?Wykrywanie twarzy w Androidzie bez interakcji użytkownika
Odpowiedz
Poniższy kod będzie rejestrować zdjęcie z aparatu po każdych 5 sekundach.
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);
}
Tutaj TIMER_STARTED jest logiczna, która wskazuje, czy zegar jest uruchomiony czy nie.
Poniżej kod HandlePictureStorage
private class HandlePictureStorage implements PictureCallback {
@Override
public void onPictureTaken(byte[] picture, final Camera camera) {
//do something when picture is captured...
}
}
Powinieneś zaplanujesz RTC_WAKEUP
Alarm
pomocą AlarmManager
, co 30 sekund, ustawić PendingIntent
do Alarm
uruchomienie Service
i wewnątrz Service
należy otworzyć Camera
do przechwytywania obrazu.
Powinieneś prawdopodobnie spojrzeć na ten post: Open/Run camera from a background Service.
Można utworzyć ręcznie do SurfaceView i podglądu kamery na nim następująco:
//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);
}
};
Nie zapomnij dodać odpowiednią zgodę kamerę w manifest:
<uses-permission android:name="android.permission.CAMERA"/>
I wreszcie, jeśli używasz urządzenia z Androidem 4.0 lub powyżej można użyć metody:
mCamera.startFaceDetection();
.
.
.
private FaceDetectionListener faceDetectionListener = new FaceDetectionListener() {
@Override
public void onFaceDetection(Face[] faces, Camera camera) {
//Faces have been detected...
}
};
.
.
.
mCamera.setFaceDetectionListener(faceDetectionListener);
Można pójść do tej post który wyjaśnia wszystko związane z tą funkcją, a nawet zapewnia funkcjonalny Android kod źródłowy, który można pobrać, aby zrobić to sam.
Pozdrawiam!
Nie można użyć programu obsługi w następujący sposób: this.refreshTimer = 30 * 1000; this.handlerFaceCapture = new Handler(); this.faceCapture = new FaceCaptureScheduler(); this.handlerFaceCapture .postDelayed (this.handlerFaceCapture, this.refreshTimer); Będzie wykonywał Harmonogram, który musi implementować Runnable w odstępach co 30 sekund. – Gilson