人脸识别需要init初始化(FaceServer中),离开时需要unInit销毁;当一个含有人脸识别的界面A跳向另一个含有人脸识别的界面B时,由于初始化和销毁都是对FaceServer类加锁(synchronized (this) {})的,所以导致注册时为注销失败,或注册了又被注销失败。
FaceServer类中:
初始化:
public boolean init(Context context) { synchronized (this) { if (faceEngine == null && context != null) { faceEngine = new FaceEngine(); int engineCode = faceEngine.init(context, FaceEngine.ASF_DETECT_MODE_IMAGE, FaceEngine.ASF_OP_0_HIGHER_EXT, 16, 1, FaceEngine.ASF_FACE_RECOGNITION | FaceEngine.ASF_FACE_DETECT); if (engineCode == ErrorInfo.MOK) { initFaceList(context); return true; } else { faceEngine = null; Log.e(TAG, "init: failed! code = " + engineCode); return false; } } return false; } }
销毁:
public void unInit() { synchronized (this) { if (faceRegisterInfoList != null) { faceRegisterInfoList.clear(); faceRegisterInfoList = null; } if (faceEngine != null) { faceEngine.unInit(); faceEngine = null; } } }
两个人脸识别界面都是用的同一个FaceServer类,synchronized导致如果当前有其他线程正持有该类锁,那么新到的线程就必须等待,所以
①A跳转B后注销A(uninit),则会导致B中初始化(init)时已存在faceEngine对象,然后注销A时又会删除faceEngine对象,导致人脸注册失败