BaiduFacePreviewActivity.java 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249
  1. package com.hanghui.senic.baiduface;
  2. import android.graphics.Bitmap;
  3. import android.hardware.Camera;
  4. import android.os.Handler;
  5. import android.os.Looper;
  6. import android.os.Message;
  7. import android.util.Log;
  8. import android.view.KeyEvent;
  9. import android.view.TextureView;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.widget.FrameLayout;
  13. import android.widget.ImageView;
  14. import androidx.annotation.NonNull;
  15. import com.baidu.idl.main.facesdk.FaceInfo;
  16. import com.baidu.idl.main.facesdk.model.BDFaceImageInstance;
  17. import com.baidu.idl.main.facesdk.model.BDFaceSDKCommon;
  18. import com.baidu.idl.main.facesdk.model.SingleBaseConfig;
  19. import com.baidu.idl.main.facesdk.utils.FaceUtils;
  20. import com.bumptech.glide.load.engine.DiskCacheStrategy;
  21. import com.bumptech.glide.request.RequestOptions;
  22. import com.example.datalibrary.callback.CameraDataCallback;
  23. import com.example.datalibrary.callback.FaceDetectCallBack;
  24. import com.example.datalibrary.gatecamera.CameraPreviewManager;
  25. import com.example.datalibrary.gl.view.GlMantleSurfacView;
  26. import com.example.datalibrary.listener.SdkInitListener;
  27. import com.example.datalibrary.manager.FaceSDKManager;
  28. import com.example.datalibrary.model.BDFaceCheckConfig;
  29. import com.example.datalibrary.model.BDFaceImageConfig;
  30. import com.example.datalibrary.model.BDLiveConfig;
  31. import com.example.datalibrary.model.LivenessModel;
  32. import com.example.datalibrary.model.User;
  33. import com.example.datalibrary.utils.BitmapUtils;
  34. import com.example.datalibrary.utils.FaceOnDrawTexturViewUtil;
  35. import com.example.datalibrary.utils.ToastUtils;
  36. import com.hanghui.senic.MyAppliction;
  37. import com.hanghui.senic.R;
  38. import com.hanghui.senic.FaceOneToOneWaitEvent;
  39. import com.hanghui.senic.activity.view.BaiDuFaceView;
  40. import com.hanghui.senic.activity.view.ClickButtonFloatView;
  41. import com.hanghui.senic.baiduface.view.BaiduPreviewTexture;
  42. import com.hanghui.senic.baiduface.view.BaiduResultView;
  43. import com.hanghui.senic.bean.FederatedPlatformsRequestBean;
  44. import com.hanghui.senic.bean.FederatedPlatformsResponseBean;
  45. import com.hanghui.senic.bean.PADQREvent;
  46. import com.hanghui.senic.common.AppHandler;
  47. import com.hanghui.senic.common.CommonUtil;
  48. import com.hanghui.senic.common.Constants;
  49. import com.hanghui.senic.common.DataManager;
  50. import com.hanghui.senic.common.DataReturns;
  51. import com.hanghui.senic.common.DeviceExpireManager;
  52. import com.hanghui.senic.common.TaskStatus;
  53. import com.hanghui.senic.common.ThreadPoolManager;
  54. import com.hanghui.senic.common.UserInfoManager;
  55. import com.hanghui.senic.controller.BlacklistManager;
  56. import com.hanghui.senic.lib_base.event.LedLightEvent;
  57. import com.hanghui.senic.network.HttpRequest;
  58. import com.hanghui.senic.service.usbserialdemo.utile.ConfigManager;
  59. import com.hanghui.senic.service.usbserialdemo.utile.StringIsNull;
  60. import com.hanghui.senic.service.usbserialdemo.utile.StringUtils;
  61. import com.hanghui.senic.service.usbserialdemo.utile.devicesUI.DeviceUtils;
  62. import com.hanghui.senic.service.usbserialdemo.utile.loacat.AppLogUtils;
  63. import com.hanghui.senic.utils.DoubClickUtils;
  64. import com.hanghui.senic.utils.ImageLoaderUtils;
  65. import org.greenrobot.eventbus.EventBus;
  66. import org.greenrobot.eventbus.Subscribe;
  67. import org.greenrobot.eventbus.ThreadMode;
  68. /**
  69. * 百度face的刷脸页面
  70. * <p>
  71. * <p>
  72. * LivenessModel:人脸检测结果存储数据类
  73. * FaceApi:人脸库管理相关操作类, 添加用户:FaceApi.userAdd(user), 人脸检索 : FaceApi.getUserListById()
  74. * <p>
  75. * <p>
  76. * 注册到人脸库:
  77. * boolean isSuccess = FaceApi.getInstance().registerUserIntoDBmanager(null, userName, imageName, null, mFeatures);
  78. * <p>
  79. * <p>
  80. * LivenessModel.faceInfo : sdk的native方法执行人脸检测后返回的数据
  81. * <p>
  82. * faceInfo.score: 人脸置信度分数
  83. * Feature.score: 1:N比对分数
  84. * <p>
  85. * 本地5w条人脸时1:n比对要多少秒
  86. */
  87. public class BaiduFacePreviewActivity extends BaiduFaceMainActivity implements BaiduResultView.BaiduFaceResultStateCallback {
  88. private static final String TAG = "BaiduFaceActivity";
  89. //相机预览页面
  90. private GlMantleSurfacView glMantleSurfacView;
  91. // rgb视频数据
  92. private BDFaceImageConfig bdFaceImageConfig;
  93. //人脸检测的配置参数, 识别阈值等
  94. private volatile BDFaceCheckConfig bdFaceCheckConfig;
  95. //活体检测的配置参数
  96. private BDLiveConfig bdLiveConfig;
  97. /*RGB摄像头图像宽和高*/ // 影响人脸宽高
  98. private static final int PREFER_WIDTH = SingleBaseConfig.getBaseConfig().getRgbAndNirWidth();
  99. private static final int PERFER_HEIGH = SingleBaseConfig.getBaseConfig().getRgbAndNirHeight();
  100. private volatile User mUser;//上一次识别到的人
  101. private int MODE_SCANFACE = 3;//纯刷脸
  102. private int MODE_PERSONCARD = 4;//人证比对
  103. /**
  104. * 是否需要处理刷脸数据,刷脸成功后,在结果页展示期间是不需要处理刷脸数据的
  105. */
  106. private volatile boolean isNeedVerify = true;
  107. private LivenessModel mCurLivenessModel = null;//最新刷到的人脸数据
  108. private BDFaceImageConfig bdNirFaceImageConfig;
  109. // RGB+IR 控件
  110. private BaiduPreviewTexture mPreview;
  111. private volatile Camera mCamera;
  112. private TextureView irPreviewView;
  113. long currentTime = System.currentTimeMillis();//检测到刷脸数据返回后,记录当前事件
  114. long startTime = 0L;//将刷脸返回时的当前时间保存,用于下次比较
  115. private final int WHAT_HIDE_LEDLIGHT = 0x22; //关闭补光灯事件
  116. private volatile boolean isOpenLighet = false; //是否已经打开补光灯
  117. private volatile boolean isBaiduFaceSucceed = false; //百度是否已经激活授权成功,防止多次调用
  118. //结果页视图
  119. private FrameLayout baiDuView_FloatingResultPageFrame;
  120. private FrameLayout baiDuView_GeneralResultPageFrame;
  121. private ImageView iv_please_scanface;
  122. Handler faceFailedHandler = new Handler(Looper.getMainLooper());//刷脸连续未通过后使用handler延时一定时间后,显示失败结果页
  123. String mDeviceModel = DeviceUtils.getDeviceModel();
  124. volatile String userIdUniqueId = "";
  125. private BaiduResultView baiduResultView;
  126. /**
  127. * 清除同人脸间隔判断保存的userID
  128. */
  129. private Runnable userIdUniqueIdRunnable = new Runnable() {
  130. @Override
  131. public void run() {
  132. userIdUniqueId = "";
  133. }
  134. };
  135. private Handler mHandler = new Handler(Looper.getMainLooper()) {
  136. @Override
  137. public void handleMessage(@NonNull Message msg) {
  138. super.handleMessage(msg);
  139. if (WHAT_HIDE_LEDLIGHT == msg.what) {
  140. CommonUtil.setLedLight(false);
  141. }
  142. }
  143. };
  144. private BaiduFaceControllerCallback mBaiduFaceControllerCallback = new BaiduFaceControllerCallback() {
  145. @Override
  146. public void invokeScanFace() {
  147. invoke_ScanFace();
  148. }
  149. @Override
  150. public void invokePersonCard(String cardName, String cardNo, String cardPhotoBase64Str) {
  151. invoke_PersonCard(cardName, cardNo, cardPhotoBase64Str);
  152. }
  153. @Override
  154. public void invokeStopVerify() {
  155. invoke_StopVerify();
  156. }
  157. @Override
  158. public void invokeResume() {
  159. invoke_Resume();
  160. }
  161. };
  162. private BaiDuFaceView.BaiDuFaceViewCallback baiDuFaceViewCallback = new BaiDuFaceView.BaiDuFaceViewCallback() {
  163. @Override
  164. public void BaiDuFaceViewCallback() {
  165. //检测到View为空,重新赋值
  166. if (ConfigManager.isFloatingPages()) {
  167. BaiDuFaceView.getInstance().setView(baiDuView_FloatingResultPageFrame);
  168. } else {
  169. BaiDuFaceView.getInstance().setView(baiDuView_GeneralResultPageFrame);
  170. }
  171. }
  172. };
  173. @Override
  174. public int getLayout() {
  175. return R.layout.activity_baiduface_preview;
  176. }
  177. @Override
  178. public void setOnCreate() {
  179. TaskStatus.setInitState();
  180. EventBus.getDefault().register(this);
  181. // 双目摄像头IR 图像预览
  182. irPreviewView = findViewById(R.id.ir_camera_preview_view);
  183. if (SingleBaseConfig.getBaseConfig().getMirrorVideoNIR() == 1) {
  184. irPreviewView.setRotationY(180);
  185. }
  186. mPreview = new BaiduPreviewTexture(this, irPreviewView);
  187. AppLogUtils.i(true, TAG, "BaiduFaceActivity, onCreate()");
  188. super.setOnCreate();
  189. mDeviceModel = DeviceUtils.getDeviceModel();
  190. }
  191. @Override
  192. public void onPause() {
  193. super.onPause();
  194. }
  195. @Override
  196. protected void onStart() {
  197. super.onStart();
  198. if (isBaiduFaceSucceed && mHandler != null) {
  199. mHandler.post(() -> {
  200. stopCameraPreview();
  201. CameraPreviewManager.getInstance().startPreview(glMantleSurfacView,
  202. SingleBaseConfig.getBaseConfig().getRgbVideoDirection(),
  203. PREFER_WIDTH, PERFER_HEIGH);
  204. startCameraPreview();
  205. });
  206. }
  207. }
  208. @Override
  209. protected void onStop() {
  210. super.onStop();
  211. if (mHandler != null) {
  212. mHandler.post(() -> stopCameraPreview());
  213. }
  214. }
  215. @Override
  216. public void onResume() {
  217. super.onResume();
  218. }
  219. //返回键监听
  220. @Override
  221. public boolean onKeyDown(int keyCode, KeyEvent event) {
  222. if(keyCode == 287 && event.getAction() == KeyEvent.ACTION_DOWN){
  223. if (DoubClickUtils.onDoubClick()) {
  224. return true;
  225. }
  226. if("PDA".equals(mDeviceModel)){ //东信手持设备
  227. EventBus.getDefault().post(new PADQREvent());
  228. return true;
  229. }
  230. }
  231. if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
  232. if ("PDA".equals(mDeviceModel) && ConfigManager.getAuthenticationBeanListBean().isHideNavigationBar()) {
  233. return super.onKeyDown(keyCode, event);
  234. }
  235. if (DoubClickUtils.onDoubClick()) {
  236. return true;
  237. }
  238. finish();
  239. return true;
  240. }
  241. return super.onKeyDown(keyCode, event);
  242. }
  243. public void OnDestoryListener() {
  244. super.OnDestoryListener();
  245. if (baiduResultView != null) {
  246. baiduResultView.onRelease();
  247. }
  248. CommonUtil.setLedLight(false);
  249. EventBus.getDefault().unregister(this);
  250. AppLogUtils.i(true, TAG, "BaiduFaceActivity, onDestroy()");
  251. AppHandler.getHandler().removeCallbacks(mPersonCardTimeoutRunnable);
  252. BaiDuFaceView.getInstance().setViewNull();
  253. removeBaiduFaceControllerCallback();
  254. HttpRequest.getInstance().destory();
  255. isBaiduFaceSucceed = false;
  256. stopCameraPreview();
  257. }
  258. @Override
  259. protected void onDestroy() {
  260. super.onDestroy();
  261. isBaiduFaceSucceed = false;
  262. isOpenLighet = false;
  263. }
  264. /**
  265. * 激活授权成功之后执行的流程
  266. */
  267. @Override
  268. public void doAfterLicenseSuccess() {
  269. if (isBaiduFaceSucceed) { //避免多次调用
  270. AppLogUtils.i(false, "doAfterLicenseSuccess", "doAfterLicenseSuccess 多次调用");
  271. return;
  272. }
  273. isBaiduFaceSucceed = true;
  274. try {
  275. //设置身份证阅读器相关
  276. HttpRequest.getInstance().setupIDCardReader(this);
  277. ThreadPoolManager.getInstance().execute(new Runnable() {
  278. @Override
  279. public void run() {
  280. //开机自启动
  281. HttpRequest.getInstance().setAutoLaunch();
  282. }
  283. });
  284. } catch (Exception e) {
  285. }
  286. initBaiduFaceControllerCallback();
  287. initListener(); // 初始化模型
  288. ThreadPoolManager.getInstance().execute(new Runnable() {
  289. @Override
  290. public void run() {
  291. FaceSDKManager.getInstance().initDataBases(MyAppliction.getContext()); //初始化人脸数据库
  292. }
  293. });
  294. FaceSDKManager.getInstance().setActiveLog(false);//百度人脸,关闭日志log, 否则sdk内部会极其高频的输出一大堆 "<line" 开头的log
  295. initViews();//初始化预览视图控件
  296. initFaceCheck();//人脸检测的配置参数
  297. stopCameraPreview();//关闭摄像头
  298. startCameraPreview();//打开摄像头图像预览
  299. // queryAllUsers();
  300. }
  301. private void initBaiduFaceControllerCallback() {
  302. BaiduFaceController.getInstance().setBaiduFaceControllerCallback(mBaiduFaceControllerCallback);
  303. }
  304. private void removeBaiduFaceControllerCallback() {
  305. BaiduFaceController.getInstance().setBaiduFaceControllerCallback(null);
  306. }
  307. private void queryAllUsers() {
  308. if (!CommonUtil.isDebug()) {
  309. return;
  310. }
  311. /* List<User> users = FaceApi.getInstance().getAllUserList();
  312. AppLogUtils.i(false, TAG, "查询人脸库, 所有用户 users.size=" + users.size());
  313. for (int i = 0; i < users.size(); i++) {
  314. User user = users.get(i);
  315. AppLogUtils.i(false, TAG, "查询人脸库, userName=" + user.getUserName());
  316. }*/
  317. }
  318. /**
  319. * 初始化模型
  320. */
  321. private void initListener() {
  322. // if (FaceSDKManager.initStatus != FaceSDKManager.SDK_MODEL_LOAD_SUCCESS) {
  323. FaceSDKManager.getInstance().initModel(mContext,
  324. FaceUtils.getInstance().getBDFaceSDKConfig(), new SdkInitListener() {
  325. @Override
  326. public void initStart() {
  327. }
  328. @Override
  329. public void initLicenseSuccess() {
  330. }
  331. @Override
  332. public void initLicenseFail(int errorCode, String msg) {
  333. }
  334. @Override
  335. public void initModelSuccess() {
  336. FaceSDKManager.initModelSuccess = true;
  337. //ToastUtils.toast(mContext, "模型加载成功,欢迎使用");
  338. AppLogUtils.i(true, TAG, "模型加载成功,欢迎使用");
  339. BaiduFaceUtil.startBaiduFaceWebsocketService();
  340. }
  341. @Override
  342. public void initModelFail(int errorCode, String msg) {
  343. FaceSDKManager.initModelSuccess = false;
  344. if (errorCode != -12) {
  345. ToastUtils.toast(mContext, "模型加载失败,请尝试重启应用");
  346. AppLogUtils.e(true, TAG, "模型加载失败,请尝试重启应用, errorCode:" + errorCode + " ,msg:" + msg);
  347. }
  348. AppLogUtils.e(true, TAG, "模型加载失败,initModelFail, errorCode:" + errorCode + " ,msg:" + msg);
  349. }
  350. });
  351. // }
  352. }
  353. private void initViews() {
  354. glMantleSurfacView = findViewById(R.id.camera_textureview_baidu);
  355. glMantleSurfacView.initSurface(SingleBaseConfig.getBaseConfig().getRgbRevert(),
  356. SingleBaseConfig.getBaseConfig().getMirrorVideoRGB(),
  357. SingleBaseConfig.getBaseConfig().isOpenGl());
  358. CameraPreviewManager.getInstance().startPreview(glMantleSurfacView,
  359. SingleBaseConfig.getBaseConfig().getRgbVideoDirection(),
  360. PREFER_WIDTH, PERFER_HEIGH);
  361. //设置结果页视图
  362. baiDuView_FloatingResultPageFrame = findViewById(R.id.baiDuView_FloatingResultPageFrame);
  363. baiDuView_GeneralResultPageFrame = findViewById(R.id.baiDuView_GeneralResultPageFrame);
  364. showResultPage();
  365. //设置监听回调
  366. BaiDuFaceView.getInstance().setListener(baiDuFaceViewCallback);
  367. //设置预览页图片
  368. iv_please_scanface = findViewById(R.id.iv_please_scanface);
  369. RequestOptions options = new RequestOptions().placeholder(R.mipmap.please_scanface).error(R.mipmap.please_scanface)
  370. .diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true);
  371. ImageLoaderUtils.loadImage(ConfigManager.getAuthenticationBeanListBean().getPreviewPageUrl(), iv_please_scanface, options);
  372. baiduResultView=findViewById(R.id.result_view);
  373. baiduResultView.setBaiduFaceResultStateCallback(this);
  374. baiduResultView.setVisibility(View.INVISIBLE);
  375. }
  376. private void showResultPage() {
  377. baiDuView_FloatingResultPageFrame.setVisibility(View.GONE);
  378. baiDuView_GeneralResultPageFrame.setVisibility(View.GONE);
  379. if (ConfigManager.isFloatingPages()) {
  380. //结果页初始化
  381. BaiDuFaceView.getInstance().ResultView(baiDuView_FloatingResultPageFrame);
  382. } else {
  383. //结果页初始化
  384. BaiDuFaceView.getInstance().ResultView(baiDuView_GeneralResultPageFrame);
  385. }
  386. }
  387. /**
  388. * 人脸检测的配置参数
  389. */
  390. private void initFaceCheck() {
  391. bdFaceCheckConfig = FaceUtils.getInstance().getBDFaceCheckConfig();
  392. bdLiveConfig = FaceUtils.getInstance().getBDLiveConfig();
  393. }
  394. private void initNirFaceConfig(int height, int width) {
  395. bdNirFaceImageConfig = new BDFaceImageConfig(height, width,
  396. SingleBaseConfig.getBaseConfig().getNirDetectDirection(),
  397. SingleBaseConfig.getBaseConfig().getMirrorDetectNIR(),
  398. BDFaceSDKCommon.BDFaceImageType.BDFACE_IMAGE_TYPE_YUV_NV21);
  399. }
  400. private void initFaceConfig(int height, int width) {
  401. bdFaceImageConfig = new BDFaceImageConfig(height, width,
  402. SingleBaseConfig.getBaseConfig().getRgbDetectDirection(),
  403. SingleBaseConfig.getBaseConfig().getMirrorDetectRGB(),
  404. BDFaceSDKCommon.BDFaceImageType.BDFACE_IMAGE_TYPE_YUV_NV21);
  405. }
  406. /**
  407. * 打开摄像头图像预览
  408. */
  409. private void startCameraPreview() {
  410. try {
  411. CameraPreviewManager.getInstance().setCameraFacing(CameraPreviewManager.CAMERA_FACING_BACK);
  412. int[] cameraSize = CameraPreviewManager.getInstance().initCamera();//initCamera()是真正的开始相机预览画面
  413. initFaceConfig(cameraSize[1], cameraSize[0]);
  414. CameraPreviewManager.getInstance().setmCameraDataCallback(new CameraDataCallback() {
  415. @Override
  416. public void onGetCameraData(byte[] data, Camera camera, int width, int height) {
  417. //AppLogUtils.i(false, TAG, "onGetCameraData(), 摄像头数据返回,data=" + data );
  418. dealRgb(data);
  419. }
  420. });
  421. int mCameraNum = Camera.getNumberOfCameras();
  422. if (mCameraNum < 2) {
  423. return;
  424. }
  425. if (!ConfigManager.getAuthenticationBeanListBean().getCameraType().equals("IR")) {
  426. return;
  427. }
  428. if (SingleBaseConfig.getBaseConfig().getRBGCameraId() != -1) {
  429. mCamera = Camera.open(Math.abs(SingleBaseConfig.getBaseConfig().getRBGCameraId() - 1));
  430. } else {
  431. mCamera = Camera.open(1);
  432. }
  433. ViewGroup.LayoutParams layoutParams = irPreviewView.getLayoutParams();
  434. int w = layoutParams.width;
  435. int h = layoutParams.height;
  436. int cameraRotation = SingleBaseConfig.getBaseConfig().getNirVideoDirection();
  437. mCamera.setDisplayOrientation(cameraRotation);
  438. if (cameraRotation == 90 || cameraRotation == 270) {
  439. layoutParams.height = w;
  440. layoutParams.width = h;
  441. // 旋转90度或者270,需要调整宽高
  442. } else {
  443. layoutParams.height = h;
  444. layoutParams.width = w;
  445. }
  446. irPreviewView.setLayoutParams(layoutParams);
  447. if (mPreview == null) {
  448. mPreview = new BaiduPreviewTexture(this, irPreviewView);
  449. }
  450. mPreview.setCamera(mCamera, PREFER_WIDTH, PERFER_HEIGH);
  451. initNirFaceConfig(PERFER_HEIGH, PREFER_WIDTH);
  452. byte[] buffer = new byte[460800];
  453. mCamera.addCallbackBuffer(buffer);
  454. mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
  455. @Override
  456. public void onPreviewFrame(byte[] data, Camera camera) {
  457. if (camera != null) {
  458. camera.addCallbackBuffer(data);
  459. dealIr(data);
  460. }
  461. }
  462. });
  463. } catch (Exception e) {
  464. AppLogUtils.e(true, TAG, "startCameraPreview:" + e.toString());
  465. }
  466. }
  467. private void dealRgb(byte[] data) {
  468. // Log.i("______456","rgb数据"+data.length);
  469. glMantleSurfacView.setFrame();
  470. bdFaceImageConfig.setData(data);
  471. checkData();
  472. }
  473. private void dealIr(byte[] data) {
  474. // Log.i("______456","---------------nir数据"+data.length);
  475. // SystemClock.sleep(30);
  476. bdNirFaceImageConfig.setData(data);
  477. checkData();
  478. }
  479. private synchronized void checkData() {
  480. FaceSDKManager.getInstance().onDetectCheck(bdFaceImageConfig, bdNirFaceImageConfig, null,
  481. bdFaceCheckConfig, new FaceDetectCallBack() {
  482. @Override
  483. public void onFaceDetectCallback(LivenessModel livenessModel) {
  484. /**
  485. 注意:onFaceDetectCallback()方法的调用线程,当画面中没有人脸(即livenessModel==null)时该方法在main线程,
  486. 当画面中有人脸(即livenessModel!=null)时该方法在子线程
  487. */
  488. //AppLogUtils.i(false, TAG, "onFaceDetectCallback(), livenessModel=" + livenessModel + " ,thread=" +Thread.currentThread() );
  489. // 设备已过期,不做任何处理
  490. if (DeviceExpireManager.getInstance().isDeviceExpire()) {
  491. return;
  492. }
  493. // livenessModel==null 即 画面中没有人脸
  494. if (livenessModel == null) {
  495. return;
  496. }
  497. mUser = livenessModel.getUser();//人脸库中匹配到人时getUser()就是非null
  498. AppLogUtils.i(false, TAG, "onFaceDetectCallback(), 刷脸结果, livenessModel=" + livenessModel + " ,isNeedVerify=" + isNeedVerify + " ,checkMode=" + bdFaceCheckConfig.getFeatureCheckMode());
  499. if (isNeedVerify) {
  500. if(ConfigManager.isNoVerificationFloatingPages()){
  501. baiduResultView.baiDuFaceNoVerificationResultPage(livenessModel,
  502. bdFaceCheckConfig.getFeatureCheckMode());
  503. return;
  504. }
  505. mCurLivenessModel = livenessModel;
  506. //AppLogUtils.i(false, TAG, "bdFaceCheckConfig.getFeatureCheckMode()=" + bdFaceCheckConfig.getFeatureCheckMode() );
  507. if (bdFaceCheckConfig.getFeatureCheckMode() == 3 && ConfigManager.getAuthenticationBeanListBean().getOpenOneToN()) {
  508. doScanFaceResult(livenessModel);
  509. } else if (bdFaceCheckConfig.getFeatureCheckMode() == 4) {
  510. doPersonCardResult(livenessModel);
  511. }
  512. } else {
  513. if (livenessModel != null && livenessModel.getBdNirFaceImageInstance() != null) {
  514. livenessModel.getBdNirFaceImageInstance().destory();
  515. }
  516. if (livenessModel != null && livenessModel.getBdFaceImageInstance() != null) {
  517. livenessModel.getBdFaceImageInstance().destory();
  518. }
  519. }
  520. }
  521. @Override
  522. public void onTip(int code, String msg) {
  523. //AppLogUtils.i(false, TAG, "onFaceDetectCallback, onTip(), code=" + code + " ,msg=" + msg);
  524. }
  525. @Override
  526. public void onFaceDetectDarwCallback(LivenessModel livenessModel) {
  527. // 绘制人脸框
  528. showFrame(livenessModel);
  529. }
  530. });
  531. }
  532. /**
  533. * 绘制人脸框
  534. *
  535. * @param livenessModel
  536. */
  537. public void showFrame(LivenessModel livenessModel) {
  538. if (livenessModel == null) {
  539. return;
  540. }
  541. if (glMantleSurfacView == null) {
  542. return;
  543. }
  544. glMantleSurfacView.onGlDraw(livenessModel.getFaceInfo(),
  545. livenessModel.getBdFaceImageInstance(),
  546. FaceOnDrawTexturViewUtil.drawFaceColor(mUser, livenessModel), ConfigManager.getAuthenticationBeanListBean().getFaceFollowBoxSwitch());
  547. }
  548. /**
  549. * 关闭摄像头
  550. */
  551. private void stopCameraPreview() {
  552. CameraPreviewManager.getInstance().stopPreview();
  553. try {
  554. if (mPreview != null) {
  555. mPreview.release();
  556. mPreview = null;
  557. }
  558. if (mCamera != null) {
  559. mCamera.stopPreview();
  560. mCamera.setPreviewCallbackWithBuffer(null);
  561. mCamera.setPreviewCallback(null);
  562. mCamera.release();
  563. mCamera = null;
  564. }
  565. } catch (Exception e) {
  566. Log.e("qing", "camera destory error");
  567. }
  568. }
  569. private void invoke_StopVerify() {
  570. AppLogUtils.i(false, TAG, "invoke_StopVerify() ");
  571. isNeedVerify = false;
  572. }
  573. /**
  574. * 恢复到初始态(即恢复到刷脸态)
  575. */
  576. private void invoke_Resume() {
  577. AppLogUtils.i(false, TAG, "invoke_Resume() ");
  578. isNeedVerify = true;
  579. invoke_ScanFace();
  580. }
  581. /**
  582. * 纯刷脸
  583. */
  584. private void invoke_ScanFace() {
  585. isNeedVerify = true;
  586. bdFaceCheckConfig = FaceUtils.getInstance().getBDFaceCheckConfig();
  587. }
  588. /**
  589. * 刷脸结果处理
  590. *
  591. * @param livenessModel
  592. */
  593. private void doScanFaceResult(LivenessModel livenessModel) {
  594. AppLogUtils.i(true, TAG, "doScanFaceResult(), livenessModel= " + livenessModel);
  595. if (livenessModel == null) {
  596. return;
  597. }
  598. FaceInfo faceInfo = livenessModel.getFaceInfo();
  599. AppLogUtils.i(false, TAG, "doScanFaceResult(), 人脸信息 faceInfo = " + faceInfo);
  600. // 比对分值,livenessModel.score只有在人证比对时sdk才设置score值,刷脸时sdk没有设置score值
  601. float compareScore = livenessModel.getFeatureScore();
  602. final float idThreshold = SingleBaseConfig.getBaseConfig().getIdThreshold();
  603. AppLogUtils.i(true, TAG, "doScanFaceResult(),刷脸结果,compareScore=" + compareScore + " ,idThreshold=" + idThreshold + " ,faceInfo.score=" + faceInfo.score);
  604. // queryAllUsers();
  605. //livenessModel.user只有在刷脸时sdk才设置user值,人证比对时sdk没有设置user值
  606. User user = livenessModel.getUser();
  607. AppLogUtils.i(true, TAG, "doScanFaceResult(),刷脸结果user=" + user);
  608. if (user == null) {//人脸库中没有找到对应的人
  609. AppLogUtils.i(true, TAG, "doScanFaceResult(), user == null " + " 抱歉 未能认出您");
  610. //1:N未通过判断是否显示提示语,不显示则不做处理
  611. if (ConfigManager.getAuthenticationBeanListBean().getOneToNFailShowTip()) {
  612. currentTime = System.currentTimeMillis();
  613. if (startTime == 0 || ((currentTime - startTime) > (ConfigManager.getAuthenticationBeanListBean().getOneToNContinueFailTime() * 1000) + 500)) {
  614. startTime = currentTime;
  615. }
  616. if ((currentTime - startTime) > (ConfigManager.getAuthenticationBeanListBean().getOneToNContinueFailTime() * 1000)) {
  617. TaskStatus.setStatus(TaskStatus.TASK_STATUS_FACE);
  618. TaskStatus.setCurrentTask(TaskStatus.CURRENT_TASSK_LOCAL_FACE);
  619. invoke_StopVerify();
  620. faceFailedHandler.removeCallbacksAndMessages(null);
  621. faceFailedHandler.post(new Runnable() {
  622. @Override
  623. public void run() {
  624. //判断失败进出记录是否开启,且类型包含1:N刷脸失败类型
  625. sendPushFailed(3,livenessModel.getBdFaceImageInstance());
  626. String failText = "";
  627. if (!StringIsNull.IsStringNull(ConfigManager.getAuthenticationBeanListBean().getFailText())) {
  628. failText = ConfigManager.getAuthenticationBeanListBean().getFailText();
  629. }
  630. doPersonCardResult_fail(failText, ConfigManager.getAuthenticationBeanListBean().getFailVoice());
  631. }
  632. });
  633. }
  634. }
  635. } else {//人脸库中找到对应的人
  636. //销毁1:N人脸连续未通过的Runnable
  637. faceFailedHandler.removeCallbacksAndMessages(null);
  638. doScanFaceResult_Success(livenessModel);
  639. AppLogUtils.i(false, TAG, "doScanFaceResult(), " + user.getUserName() + " 欢迎您");
  640. }
  641. }
  642. /**
  643. * 纯刷脸成功后执行
  644. *
  645. * @param livenessModel
  646. */
  647. private void doScanFaceResult_Success(LivenessModel livenessModel) {
  648. AppLogUtils.i(true, TAG, "doScanFaceResult_Success() ");
  649. User user = livenessModel.getUser();
  650. if (user == null) {
  651. return;
  652. }
  653. //同人脸判断是否在规定时间内
  654. if (userIdUniqueId.equals(StringIsNull.ReturnString(user.getUserId()))){
  655. return;
  656. }
  657. invoke_StopVerify();
  658. TaskStatus.setStatus(TaskStatus.TASK_STATUS_FACE);
  659. TaskStatus.setCurrentTask(TaskStatus.CURRENT_TASSK_LOCAL_FACE);
  660. String faceRequestParams = BaiduFaceUtil.getScanFaceRequestParams(user);
  661. //setAuthCodeOrVid(jsonObject,extInfoJsonObject);
  662. //重置现场照片、姓名、身份证号等用户信息
  663. setUserInformationBean(livenessModel);
  664. //销毁按钮
  665. ClickButtonFloatView.getInstance().removeClickButtonFloatView();
  666. DataReturns.getInstance().clearData();
  667. //判断用户是否在有效期内
  668. if (ConfigManager.getAuthenticationBeanListBean().getValidTimeSwitch() && isUserExpire(user)) {
  669. return;
  670. }
  671. //判断黑名单中是否存在该用户
  672. if (BlacklistManager.getInstance().isInBlacklist(user.getIdNumber(), user.getPhone())) {
  673. //展示了阻止通行结果页,直接return掉,不做后续逻辑处理
  674. AppLogUtils.e(true, TAG + " ,黑名单", "doScanFaceResult_Success(), 用户在黑名单中");
  675. return;
  676. }
  677. //判断年龄限制是否打开
  678. if (ConfigManager.isAgeLimitOpen(user.getIdNumber(), user.getUserId())) {
  679. AppLogUtils.e(true, TAG + " ,年龄限制", "doScanFaceResult_Success(), 用户年龄限制不符合");
  680. return;
  681. }
  682. //判断1:N刷脸 同人脸间隔
  683. if(ConfigManager.getAuthenticationBeanListBean().getSameFaceInterval() > 0){
  684. userIdUniqueId = StringIsNull.ReturnString(user.getUserId());
  685. //销毁延时器,重新计时
  686. AppHandler.getHandler().removeCallbacks(userIdUniqueIdRunnable);
  687. AppHandler.getHandler().postDelayed(userIdUniqueIdRunnable,
  688. ConfigManager.getAuthenticationBeanListBean().getSameFaceInterval() * 1000);
  689. }
  690. AppLogUtils.i(true, TAG, "doScanFaceResult_Success(), 请求结果页");
  691. Constants.IDCARD_TYPE = 0;
  692. //判断商户平台是否开启 - 开启后则直接通过商户平台进行请求
  693. if (ConfigManager.getAuthenticationBean().getData().get(0).getTenantSwitch()) {
  694. AppLogUtils.i(true, TAG, "刷脸成功, 商户平台开启");
  695. HttpRequest.getInstance().requestThirdPartyPlatforms(faceRequestParams, livenessModel.getUser().getUserId(), livenessModel.getFeatureScore());
  696. } else {
  697. AppLogUtils.i(true, TAG, "刷脸成功, 商户平台未开启");
  698. FederatedPlatformsRequestBean.ExtInfoDTO exInfoDTO = new FederatedPlatformsRequestBean.ExtInfoDTO();
  699. exInfoDTO.setPassRes("");
  700. //exInfoDTO.setSmileParams(faceRequestParams);
  701. exInfoDTO.setHhfaceParams(faceRequestParams);
  702. exInfoDTO.setIdcardContent("");
  703. ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE,
  704. UserInfoManager.getInstance().getUserInformationBean().getIdNumber(),
  705. UserInfoManager.getInstance().getUserInformationBean().getName(),
  706. UserInfoManager.getInstance().getUserInformationBean().getMobile(),
  707. "check", "", "", "", exInfoDTO, "", "",
  708. UserInfoManager.getInstance().getUserInformationBean().getCardIdEx());
  709. if (ConfigManager.isPreCheck()) {//预检查模式
  710. DataReturns.getInstance().doDataReturns(null, faceRequestParams);
  711. HttpRequest.getInstance().requestFederatedPlatformsCheck(true);
  712. } else {//通用模式
  713. HttpRequest.getInstance().requestFederatedPlatforms();
  714. }
  715. }
  716. //BaiduFaceUtil.testShowWindowManagerView();
  717. }
  718. /**
  719. * 判断用户是否过期
  720. *
  721. * @param user 用户
  722. * @return 是否过期
  723. */
  724. private boolean isUserExpire(User user) {
  725. if (user == null) {
  726. return false;
  727. }
  728. long startTime = user.getStartTime();
  729. long endTime = user.getEndTime();
  730. long curTime = System.currentTimeMillis();
  731. if (curTime <= startTime){
  732. AppLogUtils.e(true, TAG + " ,用户是否过期", "doScanFaceResult_Success(), 用户未到有效时间");
  733. FederatedPlatformsResponseBean federatedPlatformsResponseBean = DataManager.getInstance().getErrorOutcome("LocalError_B", "未到有效时间", 500, "未到有效时间");
  734. BaiDuFaceView.getInstance().getPlatformsCod(federatedPlatformsResponseBean);
  735. return true;
  736. }
  737. if (curTime >= endTime){
  738. AppLogUtils.e(true, TAG + " ,用户是否过期", "doScanFaceResult_Success(), 用户已过期");
  739. FederatedPlatformsResponseBean federatedPlatformsResponseBean = DataManager.getInstance().getErrorOutcome("LocalError_B", "已过期", 500, "已过期");
  740. BaiDuFaceView.getInstance().getPlatformsCod(federatedPlatformsResponseBean);
  741. return true;
  742. }
  743. // //已过期
  744. // if (curTime <= startTime || curTime >= endTime) {
  745. //
  746. // FederatedPlatformsResponseBean federatedPlatformsResponseBean = DataManager.getInstance().getErrorOutcome("LocalError_B", "不在有效期", 500, "不在有效期");
  747. // BaiDuFaceView.getInstance().getPlatformsCod(federatedPlatformsResponseBean);
  748. //
  749. // return true;
  750. // }
  751. return false;
  752. }
  753. private void setUserInformationBean(LivenessModel livenessModel) {
  754. if (livenessModel == null) {
  755. return;
  756. }
  757. User user = livenessModel.getUser();
  758. if (user == null) {
  759. return;
  760. }
  761. String userName = user.getUserName();
  762. String idNumber = user.getIdNumber();
  763. String phone = user.getPhone();
  764. String photo = user.getPhoto();
  765. String cardIdEx = user.getCardIdEx();
  766. String userId = user.getUserId();
  767. String scenePhotoUrl = user.getPhoto();
  768. UserInfoManager.getInstance().setUserInformationBean(userName, idNumber, "", photo, phone, cardIdEx, userId, livenessModel.getFeatureScore(), scenePhotoUrl);
  769. //人脸图片
  770. BDFaceImageInstance rgbImage = livenessModel.getBdFaceImageInstance();
  771. if (rgbImage != null) {
  772. Bitmap bitmap = BitmapUtils.getInstaceBmp(rgbImage);
  773. // Log.e("","-------------重置现场照片6");
  774. // byte[] photoByteArray = BitmapUtils.bitmapToBytes(bitmap);
  775. // String photoBase64Str = CommonUtil.byteArrayToBase64String(photoByteArray);
  776. // String photoBase64Str = CommonUtil.bitmapToString(bitmap);
  777. String photoBase64 = ConfigManager.bitmapToString(bitmap);
  778. UserInfoManager.getInstance().setUserInformationBean(userName, idNumber, "", photoBase64, phone, bitmap, cardIdEx, userId, livenessModel.getFeatureScore(), scenePhotoUrl);
  779. } else {
  780. AppLogUtils.e(true, TAG, "updateScenePhoto(), bdFaceImageInstance == null, 结果页无法显示现场照片");
  781. }
  782. }
  783. /**
  784. * 更新现场照片
  785. *
  786. * @param livenessModel
  787. */
  788. private void updateUserInformationBean_ScenePhoto(LivenessModel livenessModel) {
  789. /* String avatarBase64 = "";
  790. if (s1JsonObject.containsKey(SMILE_AVATAR_BASE64)) {
  791. //端上透出的⼈脸图,可⽤于展示。
  792. avatarBase64 = s1JsonObject.getString(SMILE_AVATAR_BASE64);
  793. }
  794. //更新本地数据中的现场照片
  795. UserInfoManager.getInstance().updateUserInformationBean_ScenePhoto(avatarBase64);*/
  796. if (livenessModel == null) {
  797. return;
  798. }
  799. //人脸图片
  800. BDFaceImageInstance faceImage = livenessModel.getBdFaceImageInstance();
  801. if (faceImage != null) {
  802. Bitmap bitmap = BitmapUtils.getInstaceBmp(faceImage);
  803. byte[] photoByteArray = BitmapUtils.bitmapToBytes(bitmap);
  804. String photoBase64Str = CommonUtil.byteArrayToBase64String(photoByteArray);
  805. UserInfoManager.getInstance().updateUserInformationBean_ScenePhoto(photoBase64Str);
  806. } else {
  807. AppLogUtils.e(true, TAG, "updateScenePhoto(), bdFaceImageInstance == null, 结果页无法显示现场照片");
  808. }
  809. }
  810. /********** 人证比对相关逻辑 **********/
  811. /**
  812. * 人证比对的时间,PERSONCARD_TIMEOUT 的时间内只要有一次人证比对成功则本次人证比对就是成功,
  813. * 否则在 PERSONCARD_TIMEOUT 的时间内如果都是比对失败则本次人证比对失败
  814. */
  815. private final Runnable mPersonCardTimeoutRunnable = new Runnable() {
  816. @Override
  817. public void run() {
  818. doPersonCardResult_fail("比对超时", "比对超时");
  819. }
  820. };
  821. //判断1:1人脸连续未通过的runnable是否启动
  822. boolean isCreatedRunnable = false;
  823. /**
  824. * 1:N、1:1 刷脸失败进出记录推送
  825. * @param type
  826. */
  827. private void sendPushFailed(int type, BDFaceImageInstance rgbImage) {
  828. if (!ConfigManager.getAuthenticationBeanListBean().isPushFailedRecordSwitch()){
  829. AppLogUtils.e(false,"刷脸失败记录推送","刷脸失败记录推送 - 检测到未开启失败记录推送,直接return");
  830. return;
  831. }
  832. if (!ConfigManager.getAuthenticationBeanListBean().getPushFailedRecordType().contains(type)){
  833. AppLogUtils.e(false,"刷脸失败记录推送","刷脸失败记录推送 - 检测到失败类型中不包含当前类型,直接return type = "+type);
  834. return;
  835. }
  836. String base64 = "";
  837. if (rgbImage != null) {
  838. Bitmap bitmap = BitmapUtils.getInstaceBmp(rgbImage);
  839. base64 = ConfigManager.bitmapToString(bitmap);
  840. }
  841. HttpRequest.getInstance().setEventRecords(TaskStatus.currentTask,
  842. UserInfoManager.getInstance().getUserInformationBean().getName(),
  843. UserInfoManager.getInstance().getUserInformationBean().getIdNumber(),
  844. base64, "", UserInfoManager.getInstance().getUserInformationBean().getMobile(),
  845. false, type, UserInfoManager.getInstance().getUserInformationBean().getCardIdEx(), "",null);
  846. }
  847. //1:N人脸连续未通过
  848. private final Runnable FaceErrorRunnable = new Runnable() {
  849. @Override
  850. public void run() {
  851. String failText = "";
  852. if (!StringIsNull.IsStringNull(ConfigManager.getAuthenticationBeanListBean().getFailText())) {
  853. failText = ConfigManager.getAuthenticationBeanListBean().getFailText();
  854. }
  855. doPersonCardResult_fail(failText, ConfigManager.getAuthenticationBeanListBean().getFailVoice());
  856. }
  857. };
  858. //1:1人脸连续未通过
  859. private final Runnable personCardFaceErrorRunnable = new Runnable() {
  860. @Override
  861. public void run() {
  862. String failText = "比对失败";
  863. doPersonCardResult_fail(failText, failText);
  864. }
  865. };
  866. /**
  867. * 人证比对
  868. */
  869. public void invoke_PersonCard(String cardName, String cardNo, String cardPhotoBase64Str) {
  870. AppLogUtils.e(true, TAG, "invoke_PersonCard()");
  871. if (StringUtils.isEmpty(cardPhotoBase64Str)) {
  872. AppLogUtils.e(true, TAG, "invoke_PersonCard(), 证件照片为空,无法人证比对");
  873. String msg = "证件照片为空,无法人证比对";
  874. doPersonCardResult_fail(msg, msg);
  875. return;
  876. }
  877. Bitmap cardPhotoBitmap = ConfigManager.stringToBitmap(cardPhotoBase64Str);
  878. if (cardPhotoBitmap == null) {
  879. AppLogUtils.e(true, TAG, "invoke_PersonCard(), cardPhotoBitmap == null,无法人证比对");
  880. String msg = "证件照片cardPhotoBitmap == null,无法人证比对";
  881. doPersonCardResult_fail(msg, msg);
  882. return;
  883. }
  884. byte[] secondFeature = new byte[512];
  885. // 提取特征值, 图片特征值提取成功的ret值是128
  886. /* float ret = FaceSDKManager.getInstance().personDetect(cardPhotoBitmap, secondFeature,
  887. com.baidu.idl.main.facesdk.identifylibrary.utils.FaceUtils.getInstance().getBDFaceCheckConfig(), this);*/
  888. float ret = FaceSDKManager.getInstance().personDetect(cardPhotoBitmap, secondFeature, bdFaceCheckConfig, this);
  889. if (ret != 128) {
  890. AppLogUtils.e(true, TAG, "invoke_PersonCard(), 照片特征提取失败,无法人证比对,ret=" + ret);
  891. String msg = "证件照片特征提取失败,无法人证比对";
  892. doPersonCardResult_fail(msg, msg);
  893. return;
  894. }
  895. invoke_PersonCard(secondFeature);
  896. }
  897. public void invoke_PersonCard(byte[] secondFeature) {
  898. AppLogUtils.e(true, TAG, "invoke_PersonCard(), secondFeature=" + secondFeature);
  899. AppHandler.getHandler().removeCallbacks(mPersonCardTimeoutRunnable);
  900. //立刻发送人证比对超时的Runnable
  901. AppHandler.getHandler().postDelayed(mPersonCardTimeoutRunnable, ConfigManager.getAuthenticationBean().getData().get(0).getOneToOneTimeout() * 1000);
  902. isNeedVerify = true;
  903. bdFaceCheckConfig.setSecondFeature(secondFeature);
  904. bdFaceCheckConfig.setFeatureCheckMode(4);
  905. }
  906. /**
  907. * 人证比对结果处理
  908. *
  909. * @param livenessModel
  910. */
  911. private void doPersonCardResult(LivenessModel livenessModel) {
  912. AppLogUtils.i(true, TAG, "doPersonCardResult(), livenessModel=" + livenessModel);
  913. if (livenessModel == null) {
  914. return;
  915. }
  916. // 人脸识别阈值判断
  917. // 比对分值,相似度分数
  918. float compareScore = livenessModel.getScore();
  919. float idThreshold = SingleBaseConfig.getBaseConfig().getIdThreshold();
  920. if (!ConfigManager.getAuthenticationBeanListBean().getLivingControl()) { //活体检测未开启
  921. doPersonCardComparison(compareScore, idThreshold, livenessModel);
  922. } else { //活体检测开启
  923. //活体阈值判断显示
  924. float rgbLivenessScore = livenessModel.getRgbLivenessScore();
  925. float rgbLivenessThreshold = bdLiveConfig.rgbLiveScore;//rgb活体阈值
  926. AppLogUtils.i(false, TAG, "doPersonCardResult(), 人证比对,rgbLivenessScore=" + rgbLivenessScore + " ,rgbLivenessThreshold=" + rgbLivenessThreshold
  927. + " ,compareScore=" + compareScore + " ,idThreshold=" + idThreshold);
  928. if (rgbLivenessScore >= rgbLivenessThreshold) {
  929. doPersonCardComparison(compareScore, idThreshold, livenessModel);
  930. } else {
  931. AppLogUtils.i(true, TAG, "doPersonCardResult(), 人证比对失败,活体检测未通过");
  932. }
  933. }
  934. }
  935. private void doPersonCardComparison(float compareScore, float idThreshold, LivenessModel livenessModel) {
  936. if (compareScore >= idThreshold) {
  937. AppLogUtils.i(true, TAG, "doPersonCardResult(), 人证比对成功");
  938. //销毁1:1人脸连续未通过的Runnable
  939. faceFailedHandler.removeCallbacksAndMessages(null);
  940. UserInfoManager.getInstance().updateUserInformationBean_VerifyScore(compareScore);
  941. AppHandler.getHandler().post(new Runnable() {
  942. @Override
  943. public void run() {
  944. doPersonCardResult_Success(livenessModel);
  945. }
  946. });
  947. } else {
  948. AppLogUtils.i(true, TAG, "doPersonCardResult(), 人证比对失败,人脸比对阈值未达到");
  949. if (!isCreatedRunnable) {
  950. isCreatedRunnable = true;
  951. faceFailedHandler.removeCallbacksAndMessages(null);
  952. faceFailedHandler.postDelayed(new Runnable() {
  953. @Override
  954. public void run() {
  955. //判断失败进出记录是否开启,且类型包含1:1刷脸失败类型
  956. UserInfoManager.getInstance().updateUserInformationBean_VerifyScore(compareScore);
  957. sendPushFailed(4,livenessModel.getBdFaceImageInstance());
  958. String failText = "比对失败";
  959. doPersonCardResult_fail(failText, failText);
  960. }
  961. }, ConfigManager.getAuthenticationBeanListBean().getOneToOneContinueFailTime() * 1000);
  962. }
  963. }
  964. }
  965. private void doPersonCardResult_Success(LivenessModel livenessModel) {
  966. AppLogUtils.i(true, TAG, "doPersonCardResult_Success()");
  967. AppHandler.getHandler().removeCallbacks(mPersonCardTimeoutRunnable);
  968. invoke_StopVerify();
  969. //更新现场照片
  970. updateUserInformationBean_ScenePhoto(livenessModel);
  971. String faceRequestParams = BaiduFaceUtil.getPersonCardRequestParams();
  972. //ConfigManager.updateFederatedPlatformsRequestBean_SmileParams(s1);
  973. ConfigManager.updateFederatedPlatformsRequestBean_hhfaceParams(faceRequestParams);
  974. if (ConfigManager.isPreCheck()) {//预检查模式
  975. AppLogUtils.i(true, TAG, "开启人证比对,开启预检查:人证比对成功,通知调度中心处理");
  976. DataReturns.getInstance().doDataReturns(null, faceRequestParams);
  977. } else {//通用模式
  978. HttpRequest.getInstance().requestFederatedPlatforms();
  979. }
  980. }
  981. private void doPersonCardResult_fail(String msg, String openVoiceMsg) {
  982. AppLogUtils.i(true, TAG, "doPersonCardResult_fail(), msg=" + msg);
  983. AppHandler.getHandler().removeCallbacks(mPersonCardTimeoutRunnable);
  984. invoke_StopVerify();
  985. if (StringIsNull.IsStringNull(openVoiceMsg)) {
  986. openVoiceMsg = msg;
  987. }
  988. FederatedPlatformsResponseBean federatedPlatformsResponseBean = DataManager.getInstance().getErrorOutcome("LocalError_B", msg, 500, openVoiceMsg, true);
  989. isCreatedRunnable = false;
  990. startTime = 0L;
  991. if (baiduResultView != null && ConfigManager.isNoVerificationFloatingPages()) {
  992. baiduResultView.showFailUI(msg, openVoiceMsg);
  993. return;
  994. }
  995. if (ConfigManager.isPreCheck()) {
  996. AppLogUtils.i(false, TAG, "doPersonCardResult_fail(), 预检查");
  997. DataReturns.getInstance().doDataReturns(federatedPlatformsResponseBean, DataReturns.FACE_DATA_VIRTUAL);
  998. } else {
  999. AppLogUtils.i(false, TAG, "doPersonCardResult_fail(), 通用模式");
  1000. BaiDuFaceView.getInstance().getPlatformsCod(federatedPlatformsResponseBean);
  1001. }
  1002. }
  1003. /**
  1004. * @author xwh
  1005. * Time 2024/10/19
  1006. * Description: 补光灯
  1007. **/
  1008. @Subscribe(threadMode = ThreadMode.MAIN)
  1009. public void ledLight(LedLightEvent event) {
  1010. if (event == null || mHandler == null) {
  1011. return;
  1012. }
  1013. if (event.isOpenLedLight()) { //
  1014. isOpenLighet = true;
  1015. mHandler.removeMessages(WHAT_HIDE_LEDLIGHT);
  1016. CommonUtil.setLedLight(true);
  1017. } else if (isOpenLighet) {
  1018. isOpenLighet = false;
  1019. mHandler.removeMessages(WHAT_HIDE_LEDLIGHT);
  1020. mHandler.sendEmptyMessageDelayed(WHAT_HIDE_LEDLIGHT, event.getDelay());
  1021. }
  1022. }
  1023. @Subscribe(threadMode = ThreadMode.MAIN)
  1024. public void showOneToOneUIEvent(FaceOneToOneWaitEvent event) {
  1025. if (event == null || baiduResultView == null) {
  1026. return;
  1027. }
  1028. baiduResultView.showOneToOneComparisonWaitUi(event.getMsgStrString(),event.getVoiceStr());
  1029. }
  1030. @Override
  1031. public void invokeStopVerify() {
  1032. AppHandler.getHandler().removeCallbacks(mPersonCardTimeoutRunnable);
  1033. invoke_StopVerify();
  1034. }
  1035. @Override
  1036. public void invokeResume() {
  1037. isNeedVerify = true;
  1038. if(bdFaceCheckConfig==null){
  1039. bdFaceCheckConfig=FaceUtils.getInstance().getBDFaceCheckConfig();
  1040. }
  1041. bdFaceCheckConfig.setFeatureCheckMode(3);
  1042. AppHandler.getHandler().removeCallbacks(mPersonCardTimeoutRunnable);
  1043. }
  1044. }