节后回来刚好比较空,今天总结一下camera的人脸识别流程,老样子拿原生camera2源码来分析,但是这里有一个非常严峻的问题是系统人脸识别依赖的framework接口,在Camera_api2中原生接口是没有回调函数的,APK的流程在高通和MTK平台是显示不出人脸框的,只有展讯平台对此做了支持,所以要使用此功能需要用API1。这里说明下我所说的google原生API接口可以在http://androidxref.com中查询的。
人脸识别是camera的功能所以只有在打开camera之后才能开启人脸识别,所以源码是在onCameraAvailable中的startPreview()函数开启人脸识别。onCameraAvailable我们前面讲到过是camera open之后的回调函数,下面直接上源码
PhotoModule.java
private CameraProxy mCameraDevice;
@Override
public void onCameraAvailable(CameraProxy cameraProxy) {
mCameraDevice = cameraProxy;
.........
startPreview();
onCameraOpened();
}
private void startPreview() {
.........
CameraAgent.CameraStartPreviewCallback startPreviewCallback =
new CameraAgent.CameraStartPreviewCallback() {
@Override
public void onPreviewStarted() {
mFocusManager.onPreviewStarted();
PhotoModule.this.onPreviewStarted();
SessionStatsCollector.instance().previewActive(true);
if (mSnapshotOnIdle) {
mHandler.post(mDoSnapRunnable);
}
}
};
if (GservicesHelper.useCamera2ApiThroughPortabilityLayer(mActivity)) {
mCameraDevice.startPreview();
//这里调用onPreviewStarted
startPreviewCallback.onPreviewStarted();
} else {
mCameraDevice.startPreviewWithCallback(new Handler(Looper.getMainLooper()),
startPreviewCallback);
}
}
private void onPreviewStarted() {
mAppController.onPreviewStarted();
mAppController.setShutterEnabled(true);
setCameraState(IDLE);
//这里startFaceDetection
startFaceDetection();
settingsFirstRun();
}
//这里startFaceDetection()继承自FocusOverlayManager.Listener
@Override
public void startFaceDetection() {
if (mFaceDetectionStarted || mCameraDevice == null) {
return;
}
if (mCameraCapabilities.getMaxNumOfFacesSupported() > 0) {
mFaceDetectionStarted = true;
//这里mUI是PhotoUI.java
mUI.onStartFaceDetection(mDisplayOrientation, isCameraFrontFacing());
/*这里2个参数分别是Handler和CameraFaceDetectionCallback,这里我们着重讲解camera_api2,而在API2中setFaceDetectionCallback啥事都不干。
所以你将得不到回调,在UI中也无法显示人脸框,所以这里我们用的API1也就是AndroidCameraAgentImpl.java。*/
mCameraDevice.setFaceDetectionCallback(mHandler, mUI);
//这里调用的是CameraAgent.java的startFaceDetection,上一句设置人脸识别的callback函数这句启动人脸识别,这两句的framework流程后面再分析。
mCameraDevice.startFaceDetection();
SessionStatsCollector.instance().faceScanActive(true);
}
}
上面讲到mUI是PhotoUI,下面来看下PhotoUI.java
public class PhotoUI implements PreviewStatusListener,
CameraAgent.CameraFaceDetectionCallback, PreviewStatusListener.PreviewAreaChangedListener {
//这里FaceView就是显示人脸识别的那个框
private final FaceView mFaceView;
public void onStartFaceDetection(int orientation, boolean mirror) {
if (mFaceView != null) {
mFaceView.clear();
mFaceView.setVisibility(View.VISIBLE);
mFaceView.setDisplayOrientation(orientation);
mFaceView.setMirror(mirror);
mFaceView.resume();
}
}
/