人脸识别是android 4.0提供的新属性,具体表现是启动camera后就可以识别人脸的位置并且在识别到人脸后进行人脸对焦。首先分析人脸识别功能的启动过程。
Camera.java
onCreate();
// don't setmSurfaceHolder here. We have it set ONLY within
//surfaceChanged / surfaceDestroyed, other parts of the code
// assumethat when it is set, the surface is also set.
SurfaceViewpreview = (SurfaceView) findViewById(R.id.camera_preview);
SurfaceHolder holder = preview.getHolder();
holder.addCallback(this);
设置preview回调接口, 当preview创建成功后调用SurfaceHolder.Callback中的surfaceChanged方法。
public voidsurfaceChanged(SurfaceHolder holder, int format, int w, int h)
// Setpreview display if the surface is being created. Preview was
// alreadystarted. Also restart the preview if display rotation has
// changed.Sometimes this happens when the device is held in portrait
// andcamera app is opened. Rotation animation takes some time and
// displayrotation in onCreate may not be what we want.
if(mCameraState == PREVIEW_STOPPED) {
startPreview();
startFaceDetection();
} else {
if(Util.getDisplayRotation(this) != mDisplayRotation) {
setDisplayOrientation();
}
if (holder.isCreating()){
//Set preview display if the surface is being created and preview
//was already started. That means preview display was set to null
//and we need to set it now.
setPreviewDisplay(holder);
}
}
然后调用startFaceDetection()
@Override
public voidstartFaceDetection() {
if(mFaceDetectionStarted || mCameraState != IDLE) return;
if(mParameters.getMaxNumDetectedFaces() > 0) {
mFaceDetectionStarted = true;
mFaceView = (FaceView) findViewById(R.id.face_view);
mFaceView.clear();
mFaceView.setVisibility(View.VISIBLE);
mFaceView.setDisplayOrientation(mDisplayOrientation);
CameraInfo info =CameraHolder.instance().getCameraInfo()[mCameraId];
mFaceView.setMirror(info.facing == CameraInfo.CAMERA_FACING_FRONT);
mFaceView.resume();
mCameraDevice.setFaceDetectionListener(this);
mCameraDevice.startFaceDetection();
}
}
在startFaceDetection()中设定人脸识别监听,并且调用frameworks方法启动人脸识别。
------〉设定人脸识别监听
mCameraDevice.setFaceDetectionListener(this);
@Override
public voidonFaceDetection(Face[] faces, android.hardware.Camera camera) {
mFaceView.setFaces(faces);
}
------〉调用frameworks方法启动人脸识别
mCameraDevice.startFaceDetection();
public finalvoid startFaceDetection() {
if(mFaceDetectionRunning) {
thrownew RuntimeException("Face detection is already running");
}
_startFaceDetection(getCurrentFaceDetectionType());
mFaceDetectionRunning = true;
}