Browse Source

Merge branch 'FaceScenic_V2_baiduface' into FaceScenic_V2_baiduface_x5

# Conflicts:
#	app/src/main/java/com/hanghui/senic/service/InternetCheckService.java
#	datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
xwh 4 months ago
parent
commit
3deeb572a1
52 changed files with 1666 additions and 313 deletions
  1. 5 3
      app/build.gradle
  2. 20 51
      app/src/main/AndroidManifest.xml
  3. 0 8
      app/src/main/java/com/hanghui/senic/MyAppliction.java
  4. 1 1
      app/src/main/java/com/hanghui/senic/activity/PassWordActivity.java
  5. 13 4
      app/src/main/java/com/hanghui/senic/activity/SetUpActivity.java
  6. 20 12
      app/src/main/java/com/hanghui/senic/activity/setup/BlackListActivity.java
  7. 285 0
      app/src/main/java/com/hanghui/senic/activity/setup/PersonnelDataActivity.java
  8. 13 3
      app/src/main/java/com/hanghui/senic/activity/setup/ResultConfigurationActivity.java
  9. 45 23
      app/src/main/java/com/hanghui/senic/activity/view/BaiDuFaceView.java
  10. 11 7
      app/src/main/java/com/hanghui/senic/activity/view/ResultViewManager.java
  11. 96 0
      app/src/main/java/com/hanghui/senic/adapter/PersonnelDataAdapter.java
  12. 5 4
      app/src/main/java/com/hanghui/senic/baiduface/BaiduFaceMainActivity.java
  13. 90 18
      app/src/main/java/com/hanghui/senic/baiduface/BaiduFacePreviewActivity.java
  14. 7 3
      app/src/main/java/com/hanghui/senic/baiduface/BaiduFaceUtil.java
  15. 48 45
      app/src/main/java/com/hanghui/senic/baiduface/WebsocketService.java
  16. 10 0
      app/src/main/java/com/hanghui/senic/bean/FederatedPlatformsRequestBean.java
  17. 10 0
      app/src/main/java/com/hanghui/senic/bean/FederatedPlatformsResponseBean.java
  18. 88 0
      app/src/main/java/com/hanghui/senic/bean/UserInfoBean.java
  19. 9 0
      app/src/main/java/com/hanghui/senic/bean/UserInformationBean.java
  20. 2 1
      app/src/main/java/com/hanghui/senic/common/DataReturns.java
  21. 1 1
      app/src/main/java/com/hanghui/senic/common/MTTSManager.java
  22. 5 2
      app/src/main/java/com/hanghui/senic/common/UserInfoManager.java
  23. 4 4
      app/src/main/java/com/hanghui/senic/controller/IDCardController.java
  24. 2 2
      app/src/main/java/com/hanghui/senic/controller/PassportController.java
  25. 1 1
      app/src/main/java/com/hanghui/senic/controller/QRCodeController.java
  26. 2 2
      app/src/main/java/com/hanghui/senic/controller/SmileController.java
  27. 1 1
      app/src/main/java/com/hanghui/senic/model/MyModel.java
  28. 19 16
      app/src/main/java/com/hanghui/senic/network/HttpRequest.java
  29. 1 2
      app/src/main/java/com/hanghui/senic/presenter/MyPresenter.java
  30. 17 5
      app/src/main/java/com/hanghui/senic/receiver/NetBroadcastReceiver.java
  31. 11 7
      app/src/main/java/com/hanghui/senic/service/InternetCheckService.java
  32. 1 1
      app/src/main/java/com/hanghui/senic/service/RegularReportingService.java
  33. 83 0
      app/src/main/java/com/hanghui/senic/service/keep/JobUtils.kt
  34. 118 0
      app/src/main/java/com/hanghui/senic/service/keep/MyJobService.kt
  35. 163 0
      app/src/main/java/com/hanghui/senic/service/keep/ThreadPoolManager.java
  36. 1 1
      app/src/main/java/com/hanghui/senic/service/usbserialdemo/AppDns.java
  37. 2 1
      app/src/main/java/com/hanghui/senic/service/usbserialdemo/utile/ConfigManager.java
  38. 3 3
      app/src/main/java/com/hanghui/senic/service/usbserialdemo/utile/NetWorkUtils.java
  39. 30 0
      app/src/main/java/com/hanghui/senic/utils/GetJsonDataUtil.java
  40. 3 0
      app/src/main/java/com/hanghui/senic/utils/ImageLoaderUtils.java
  41. 208 0
      app/src/main/res/layout/activity_personnel_data.xml
  42. 126 0
      app/src/main/res/layout/personneldata_adapter.xml
  43. 15 6
      app/src/main/res/layout/window_outcome_floating_pages.xml
  44. BIN
      app/src/main/res/mipmap-xhdpi/personneldata_image.png
  45. BIN
      app/src/main/res/mipmap-xhdpi/personneldataadapter_title.png
  46. 2 2
      app/src/main/res/values/strings.xml
  47. 1 0
      build.gradle
  48. 1 1
      datalibrary/src/main/java/com/example/datalibrary/factory/specific/FeatureBuilder.java
  49. 2 15
      datalibrary/src/main/java/com/example/datalibrary/gatecamera/CameraPreviewManager.java
  50. 60 55
      datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java
  51. 4 1
      lib_base/src/main/java/com/hanghui/senic/lib_base/event/LedLightEvent.java
  52. 1 1
      lib_base/src/main/java/com/hanghui/senic/lib_base/glide/MyAppGlideModule.java

+ 5 - 3
app/build.gradle

@@ -1,5 +1,7 @@
 plugins {
     id 'com.android.application'
+    id 'kotlin-android'
+    id 'kotlin-android-extensions'
 }
 
 android {
@@ -14,8 +16,8 @@ android {
         applicationId "com.hanghui.senic"
         minSdkVersion 22
         targetSdkVersion 22
-        versionCode 121//115
-        versionName "1.1.10.241025" //1.1.5.241003
+        versionCode 123//115
+        versionName "1.1.11.24101105" //1.1.5.241003
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         ndk {
             abiFilters "armeabi-v7a"   //armeabi-v7a 'arm64-v8a'
@@ -89,7 +91,7 @@ android {
     def appName = "HHLocal"
     applicationVariants.all { variant ->
         variant.outputs.all {
-            outputFileName = "${appName}_${defaultConfig.versionName}_${"V2"}.apk"
+            outputFileName = "${appName}_${defaultConfig.versionName}_${"ScenicCommon"}.apk"
         }
     }
 

+ 20 - 51
app/src/main/AndroidManifest.xml

@@ -8,7 +8,7 @@
     <uses-permission android:name="android.permission.NFC" />
     <uses-permission android:name="android.permission.SET_TIME" />
     <uses-permission android:name="android.permission.SET_TIME_ZONE" />
-    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 
     <uses-feature
         android:name="android.hardware.nfc"
@@ -16,8 +16,8 @@
     <uses-feature
         android:name="android.hardware.usb.host"
         android:required="true" />
-    <uses-permission android:name="android.permission.USB_PERMISSION" />
 
+    <uses-permission android:name="android.permission.USB_PERMISSION" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission
         android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
@@ -57,41 +57,12 @@
         </intent>
     </queries>
 
-
-    <!--
-
-           丽江版本的标签
-        <application
-            android:name="com.hanghui.senic.MyAppliction"
-            android:allowBackup="true"
-            android:icon="@mipmap/app_icon"
-            android:label="@string/app_name"
-            android:roundIcon="@mipmap/app_icon"
-            android:supportsRtl="true"
-            android:theme="@style/Theme.Facescenic"
-            tools:replace="android:icon,android:roundIcon,android:theme">
-
-            未添加NFC的标签
-     <application
-            android:name="com.hanghui.senic.MyAppliction"
-            android:allowBackup="false"
-            android:icon="@mipmap/app_icon"
-            android:label="@string/app_name"
-            android:networkSecurityConfig="@xml/network_security_config"
-            android:roundIcon="@mipmap/app_icon"
-            android:supportsRtl="true"
-            android:theme="@style/Theme.Facescenic"
-            tools:node="replace"
-            android:requestLegacyExternalStorage="true">
-    -->
-
-    <!-- 添加NFC后的 application 标签  -->
-
     <application
         android:name=".MyAppliction"
         android:allowBackup="false"
         android:icon="@mipmap/app_icon"
         android:label="@string/app_name"
+        android:largeHeap="true"
         android:networkSecurityConfig="@xml/network_security_config"
         android:requestLegacyExternalStorage="true"
         android:roundIcon="@mipmap/app_icon"
@@ -99,9 +70,11 @@
         android:theme="@style/Theme.Facescenic"
         android:usesCleartextTraffic="true"
         tools:ignore="UnusedAttribute"
-        android:largeHeap="true"
         tools:node="merge"
         tools:replace="android:allowBackup">
+        <activity
+            android:name=".activity.setup.PersonnelDataActivity"
+            android:exported="false" />
         <activity
             android:name=".activity.setup.BlackListActivity"
             android:exported="false" />
@@ -143,10 +116,7 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
-
-
-        <activity android:name=".activity.DevelopActivity"/>
-
+        <activity android:name=".activity.DevelopActivity" />
 
         <service
             android:name=".service.usbserialdemo.UsbService"
@@ -155,9 +125,9 @@
             android:name=".service.HideService"
             android:process=":pointread" />
         <service android:name=".service.RegularReportingService" />
-        <service android:name=".service.InternetCheckService"/>
-        <service android:name=".service.FilterRepeatDataService"/>
-        <service android:name=".service.ClearDataService"/>
+        <service android:name=".service.InternetCheckService" />
+        <service android:name=".service.FilterRepeatDataService" />
+        <service android:name=".service.ClearDataService" />
         <service
             android:name=".service.CheckExitService"
             android:enabled="true" />
@@ -206,18 +176,17 @@
 
         <service
             android:name="com.synjones.idcard.RemoteDecodeService"
-            android:process=":remote" />
-
-
-        <!-- 百度人脸 -->
-        <!--<activity android:name=".baiduface.BaiduFacePreviewActivity"/>-->
-        <activity android:name=".baiduface.FaceRegisterNewActivity"/>
-        <activity android:name=".baiduface.FaceRGBPersonActivity"/>
-
-        <activity android:name=".baiduface.OnePxActivity"/>
-
-        <service android:name="com.hanghui.senic.baiduface.WebsocketService"/>
+            android:process=":remote" /> <!-- 百度人脸 -->
+        <!-- <activity android:name=".baiduface.BaiduFacePreviewActivity"/> -->
+        <activity android:name=".baiduface.FaceRegisterNewActivity" />
+        <activity android:name=".baiduface.FaceRGBPersonActivity" />
+        <activity android:name=".baiduface.OnePxActivity" />
 
+        <service android:name=".baiduface.WebsocketService" />
+        <service
+            android:name=".service.keep.MyJobService"
+            android:process=":remote"
+            android:permission="android.permission.BIND_JOB_SERVICE" /> <!-- 保活service end -->
     </application>
 
 </manifest>

+ 0 - 8
app/src/main/java/com/hanghui/senic/MyAppliction.java

@@ -40,7 +40,6 @@ public class MyAppliction extends BaseApplication {
     public static BlackListDao blackListDao;
     public static RecentAppsReceiver recentAppsReceiver;
     ArrayList<Activity> list = new ArrayList<Activity>();
-    private static volatile  long appHeartbeatTime=0; //上次上报心跳时间
 
     public static Context getContext() {
         return context;
@@ -250,11 +249,4 @@ public class MyAppliction extends BaseApplication {
         }
     };
 
-    public static long getAppHeartbeatTime() {
-        return appHeartbeatTime;
-    }
-
-    public static void setAppHeartbeatTime(long appHeartbeatTime) {
-        MyAppliction.appHeartbeatTime = appHeartbeatTime;
-    }
 }

+ 1 - 1
app/src/main/java/com/hanghui/senic/activity/PassWordActivity.java

@@ -133,7 +133,7 @@ public class PassWordActivity extends BaseActivity {
     private void setUpConfig() {
         Intent intent = new Intent(PassWordActivity.this, SetUpActivity.class);
         startActivity(intent);
-        finish();
+       // finish();
     }
 
     //进入设置页面自动启动白补光灯(3秒后关闭)

+ 13 - 4
app/src/main/java/com/hanghui/senic/activity/SetUpActivity.java

@@ -26,6 +26,7 @@ import com.hanghui.senic.activity.setup.ConcerningActivity;
 import com.hanghui.senic.activity.setup.FunctionalConfigurationActivity;
 import com.hanghui.senic.activity.setup.LinkagePlatformActivity;
 import com.hanghui.senic.activity.setup.PageBackgroundActivity;
+import com.hanghui.senic.activity.setup.PersonnelDataActivity;
 import com.hanghui.senic.activity.setup.ResultConfigurationActivity;
 import com.hanghui.senic.activity.setup.SystemConfigurationActivity;
 import com.hanghui.senic.activity.setup.ZFBBrushFaceActivity;
@@ -36,6 +37,7 @@ import com.hanghui.senic.baiduface.BaiduFaceUtil;
 import com.hanghui.senic.common.AppHandler;
 import com.hanghui.senic.common.CommonUtil;
 import com.hanghui.senic.service.CheckExitService;
+import com.hanghui.senic.service.keep.MyJobService;
 import com.hanghui.senic.service.usbserialdemo.utile.ConfigManager;
 import com.hanghui.senic.bean.SetUpBean;
 import com.hanghui.senic.R;
@@ -65,12 +67,13 @@ public class SetUpActivity extends BaseActivity {
     private PopupWindow popupWindow;
     //数据配置
     String[] TextString = new String[]{"基本信息", "采集配置", "支付宝刷脸配置", "结果页配置", "页面背景配置",
-            "功能配置", "系统配置", "zoloConfig摄像头配置", "黑名单", "退出应用", "重启系统"};
+            "功能配置", "系统配置", "zoloConfig摄像头配置", "人员数据","黑名单", "退出应用", "重启系统"};
     int[] integers = new int[]{R.mipmap.basic_information_image,
             R.mipmap.acquisition_image, R.mipmap.zfb_brushface_image,
             R.mipmap.resultconfiguration_image, R.mipmap.pagebackground_image,
             R.mipmap.functionalconfiguration_image, R.mipmap.systemconfiguration_image,
-            R.mipmap.zoloconfigcamera_image,R.mipmap.blacklist_image,
+            R.mipmap.zoloconfigcamera_image,R.mipmap.personneldata_image,
+            R.mipmap.blacklist_image,
             R.mipmap.exit_system, R.mipmap.reboot_system};
 
     @Override
@@ -176,6 +179,10 @@ public class SetUpActivity extends BaseActivity {
                 Intent zoloConfigCameraIntent = new Intent(activity, zoloConfigCameraActivity.class);
                 startActivity(zoloConfigCameraIntent);
                 break;
+            case "人员数据":
+                Intent personnelDataIntent = new Intent(activity, PersonnelDataActivity.class);
+                startActivity(personnelDataIntent);
+                break;
             case "黑名单":
                 Intent blacklistIntent = new Intent(activity, BlackListActivity.class);
                 startActivity(blacklistIntent);
@@ -234,12 +241,14 @@ public class SetUpActivity extends BaseActivity {
                     if (MyAppliction.recentAppsReceiver != null) {
                         MyAppliction.getContext().unregisterReceiver(MyAppliction.recentAppsReceiver);
                     }
-                    Intent intent = new Intent(SetUpActivity.this, CheckExitService.class);
-                    stopService(intent);
+                    MyJobService.Companion.stopJob(MyAppliction.getContext());
                     AppHandler.getHandler().postDelayed(new Runnable() {
                         @Override
                         public void run() {
                             ConfigManager.mSessionId = "";
+                            if(MyAppliction.getContext() instanceof MyAppliction){
+                                ((MyAppliction) MyAppliction.getContext()).finishActivity();
+                            }
                             finish();
                             android.os.Process.killProcess(android.os.Process.myPid());
                             System.exit(0);

+ 20 - 12
app/src/main/java/com/hanghui/senic/activity/setup/BlackListActivity.java

@@ -85,21 +85,29 @@ public class BlackListActivity extends BaseActivity implements View.OnClickListe
         // 添加RecyclerView的滚动监听来实现上拉加载
         blacklist_RecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
             @Override
-            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
-                super.onScrolled(recyclerView, dx, dy);
-                AppHandler.getHandler().post(new Runnable() {
-                    @Override
-                    public void run() {
-                        if (list.size() > 0){
-                            boolean reachedEnd = !recyclerView.canScrollVertically(1);
-                            if (reachedEnd) {
-                                // 上拉加载数据的逻辑
-                                loadMoreData();
+            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+                super.onScrollStateChanged(recyclerView, newState);
+                // 在这里处理滑动状态改变,如停止滑动
+                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
+                    AppHandler.getHandler().post(new Runnable() {
+                        @Override
+                        public void run() {
+                            if (list.size() > 0){
+                                boolean reachedEnd = !recyclerView.canScrollVertically(1);
+                                if (reachedEnd) {
+                                    // 上拉加载数据的逻辑
+                                    loadMoreData();
+                                }
                             }
                         }
-                    }
-                });
+                    });
+                }
+
+            }
 
+            @Override
+            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+                super.onScrolled(recyclerView, dx, dy);
             }
         });
     }

+ 285 - 0
app/src/main/java/com/hanghui/senic/activity/setup/PersonnelDataActivity.java

@@ -0,0 +1,285 @@
+package com.hanghui.senic.activity.setup;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.example.datalibrary.api.FaceApi;
+import com.example.datalibrary.model.User;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+import com.hanghui.senic.R;
+import com.hanghui.senic.activity.BaseActivity;
+import com.hanghui.senic.adapter.PersonnelDataAdapter;
+import com.hanghui.senic.baiduface.UserFaceData;
+import com.hanghui.senic.bean.UserInfoBean;
+import com.hanghui.senic.common.AppHandler;
+import com.hanghui.senic.common.CommonUtil;
+import com.hanghui.senic.controller.DXAllInOneIDCardNewController;
+import com.hanghui.senic.service.usbserialdemo.utile.ConfigManager;
+import com.hanghui.senic.service.usbserialdemo.utile.StringIsNull;
+import com.hanghui.senic.service.usbserialdemo.utile.loacat.AppLogUtils;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class PersonnelDataActivity extends BaseActivity implements View.OnClickListener {
+
+    private TextView setUPIncloud_title;
+    private LinearLayout setUPIncloud_finish;
+    
+    private LinearLayout personnelData_inquire;
+    private ImageView personnelData_inquireImage;
+    private TextView personnelData_inquireText;
+    private LinearLayout personnelData_queryCondition_Linear;
+    private RecyclerView personnelData_RecyclerView;
+    private PersonnelDataAdapter personnelDataAdapter;
+    private List<UserFaceData.Data.Item> list = new ArrayList<>();
+    private int page = 1;
+    private boolean isShow = false;//是否显示筛选条件
+    private EditText personnelData_inputID;
+    private EditText queryCondition_inputName;
+    private EditText personnelData_inputCardNumber;
+    private EditText queryCondition_inputIdNumber;
+    private EditText queryCondition_inputPhone;
+    private TextView personnelData_input_empty;//清空按钮
+    private TextView personnelData_input_search;//搜索按钮
+    private List<User> userList = new ArrayList<>();
+    private AddListDataThread addListDataThread;
+
+    @Override
+    public int getLayout() {
+        return R.layout.activity_personnel_data;
+    }
+
+    @Override
+    public void setOnCreate() {
+        addListDataThread = new AddListDataThread();
+        addListDataThread.start();
+        initView();
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (addListDataThread != null) {
+            addListDataThread.interrupt();
+            addListDataThread = null;
+        }
+    }
+
+    private void initView() {
+        setUPIncloud_title = findViewById(R.id.setUPIncloud_title);
+        setUPIncloud_title.setText("人员数据");
+        setUPIncloud_finish = findViewById(R.id.setUPIncloud_finish);
+        setUPIncloud_finish.setOnClickListener(this);
+        personnelData_inquire = findViewById(R.id.personnelData_inquire);
+        personnelData_inquire.setOnClickListener(this);
+        personnelData_inquireImage = findViewById(R.id.personnelData_inquireImage);
+        personnelData_inquireText = findViewById(R.id.personnelData_inquireText);
+        personnelData_queryCondition_Linear = findViewById(R.id.personnelData_queryCondition_Linear);
+        personnelData_RecyclerView = findViewById(R.id.personnelData_RecyclerView);
+        personnelData_inputID = findViewById(R.id.personnelData_inputID);
+        queryCondition_inputName = findViewById(R.id.personnelData_inputName);
+        personnelData_inputCardNumber = findViewById(R.id.personnelData_inputCardNumber);
+        queryCondition_inputIdNumber = findViewById(R.id.personnelData_inputIdNumber);
+        queryCondition_inputPhone = findViewById(R.id.personnelData_inputPhone);
+        personnelData_input_empty = findViewById(R.id.personnelData_input_empty);
+        personnelData_input_empty.setOnClickListener(this);
+        personnelData_input_search = findViewById(R.id.personnelData_input_search);
+        personnelData_input_search.setOnClickListener(this);
+        LinearLayoutManager manager = new LinearLayoutManager(CommonUtil.getCurrentActivity());
+        manager.setOrientation(LinearLayoutManager.VERTICAL);
+        personnelData_RecyclerView.setLayoutManager(manager);
+        //list赋值
+        addList(page);
+        personnelDataAdapter = new PersonnelDataAdapter(list, PersonnelDataActivity.this);
+        personnelData_RecyclerView.setAdapter(personnelDataAdapter);
+        // 添加RecyclerView的滚动监听来实现上拉加载
+        personnelData_RecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            @Override
+            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+                super.onScrollStateChanged(recyclerView, newState);
+                // 在这里处理滑动状态改变,如停止滑动
+                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
+                    AppHandler.getHandler().post(new Runnable() {
+                        @Override
+                        public void run() {
+                            if (list.size() > 0){
+                                boolean reachedEnd = !recyclerView.canScrollVertically(1);
+                                if (reachedEnd) {
+                                    // 上拉加载数据的逻辑
+                                    loadMoreData();
+                                }
+                            }
+                        }
+                    });
+                }
+
+            }
+
+            @Override
+            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+                super.onScrolled(recyclerView, dx, dy);
+            }
+        });
+    }
+
+    private void addList(int page) {
+        int size;
+        if (userList.size() <= 20){
+            size = userList.size();
+        }else {
+            size = page * 20;
+        }
+        for (int i = 0; i < size; i++) {
+            UserFaceData.Data.Item item = new UserFaceData.Data.Item();
+            UserInfoBean userInfoBean = ConfigManager.getGson().fromJson(userList.get(i).getUserInfo(), UserInfoBean.class);
+            item.setUserName(userInfoBean.getUserName());
+            item.setPhoto(userInfoBean.getPhoto());
+            item.setPhone(userInfoBean.getPhone());
+            item.setIdNumber(userInfoBean.getIdNumber());
+            item.setCardIdEx(userInfoBean.getCardIdEx());
+            item.setUserId(userInfoBean.getUserId());
+            list.add(item);
+        }
+    }
+
+    private void loadMoreData() {//加载更多
+        String id = personnelData_inputID.getText().toString();
+        String cardNumber = personnelData_inputCardNumber.getText().toString();
+        String name = queryCondition_inputName.getText().toString();
+        String idNumber = queryCondition_inputIdNumber.getText().toString();
+        String phone = queryCondition_inputPhone.getText().toString();
+        if (StringIsNull.IsStringNull(id) && StringIsNull.IsStringNull(cardNumber) && StringIsNull.IsStringNull(name)
+                && StringIsNull.IsStringNull(idNumber) && StringIsNull.IsStringNull(phone)){
+            page++;
+            //list赋值
+            addList(page);
+            //数据去重
+            for (UserFaceData.Data.Item element : list) {
+                if (!list.contains(element)) {
+                    list.add(element);
+                }
+            }
+        }
+        personnelDataAdapter.notifyDataSetChanged();
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.setUPIncloud_finish:
+                finish();
+                break;
+            case R.id.personnelData_inquire://点击后展示搜索条件或隐藏搜索条件
+                if (isShow){
+                    isShow = false;
+                    personnelData_queryCondition_Linear.setVisibility(View.GONE);
+                    personnelData_inquireText.setVisibility(View.VISIBLE);
+                    personnelData_inquireImage.setBackgroundResource(R.mipmap.blacklist_inquireimage_down_arrow);
+                }else {
+                    isShow = true;
+                    personnelData_queryCondition_Linear.setVisibility(View.VISIBLE);
+                    personnelData_inquireText.setVisibility(View.GONE);
+                    personnelData_inquireImage.setBackgroundResource(R.mipmap.blacklist_inquireimage_up_arrow);
+                }
+                break;
+            case R.id.personnelData_input_empty://清空按钮
+                queryCondition_inputName.setText("");
+                queryCondition_inputIdNumber.setText("");
+                queryCondition_inputPhone.setText("");
+                break;
+            case R.id.personnelData_input_search://搜索按钮
+                //去数据库搜索
+                String id = personnelData_inputID.getText().toString();
+                String cardNumber = personnelData_inputCardNumber.getText().toString();
+                String name = queryCondition_inputName.getText().toString();
+                String idNumber = queryCondition_inputIdNumber.getText().toString();
+                String phone = queryCondition_inputPhone.getText().toString();
+                page = 0;
+                List<UserFaceData.Data.Item> personnelDataDaoBeanList  = new ArrayList<>();
+                personnelDataDaoBeanList.addAll(searchList(id,cardNumber,name,idNumber,phone));
+                if (personnelDataDaoBeanList.size() == 0){
+                    AppLogUtils.i(false,"黑名单条件搜索","黑名单条件搜索返回数据长度为0 name "+name+ " idNumber "+idNumber + " phone "+phone);
+                }
+                list.clear();
+                list.addAll(personnelDataDaoBeanList);
+                personnelDataAdapter.notifyDataSetChanged();
+                break;
+        }
+    }
+
+    private List<UserFaceData.Data.Item> searchList(String id, String cardNumber, String name, String idNumber, String phone){
+        List<UserFaceData.Data.Item> itemList = new ArrayList<>();
+        //当搜索条件为空时,重新添加数据
+        if (StringIsNull.IsStringNull(id) && StringIsNull.IsStringNull(cardNumber) && StringIsNull.IsStringNull(name)
+                && StringIsNull.IsStringNull(idNumber) && StringIsNull.IsStringNull(phone)){
+            for (User item : userList) {
+                UserFaceData.Data.Item userInfoBean = ConfigManager.getGson().fromJson(item.getUserInfo(), UserFaceData.Data.Item.class);
+                itemList.add(userInfoBean);
+            }
+            return itemList;
+        }
+
+        for (User item : userList) {
+            UserFaceData.Data.Item userInfoBean = ConfigManager.getGson().fromJson(item.getUserInfo(), UserFaceData.Data.Item.class);
+            // 比较当前元素是否等于 "Apple"
+            String userId = String.valueOf(userInfoBean.getUserId());
+            if (!StringIsNull.IsStringNull(id) && !StringIsNull.IsStringNull(userId)
+                    && userId.contains(id)) {
+                itemList.add(userInfoBean);
+            }
+            if (!StringIsNull.IsStringNull(cardNumber) && !StringIsNull.IsStringNull(userInfoBean.getCardIdEx())
+                    && userInfoBean.getCardIdEx().contains(cardNumber)) {
+                itemList.add(userInfoBean);
+            }
+            if (!StringIsNull.IsStringNull(name) && !StringIsNull.IsStringNull(userInfoBean.getUserName())
+                    && userInfoBean.getUserName().contains(name)) {
+                itemList.add(userInfoBean);
+            }
+            if (!StringIsNull.IsStringNull(idNumber) && !StringIsNull.IsStringNull(userInfoBean.getIdNumber())
+                    && userInfoBean.getIdNumber().contains(idNumber)) {
+                itemList.add(userInfoBean);
+            }
+            if (!StringIsNull.IsStringNull(phone) && !StringIsNull.IsStringNull(userInfoBean.getPhone())
+                    && userInfoBean.getPhone().contains(phone)) {
+                itemList.add(userInfoBean);
+            }
+
+        }
+        return itemList;
+    }
+
+    private class AddListDataThread extends Thread {
+        @Override
+        public void run() {
+            super.run();
+            //添加数据
+            Map<String,User> userMap = FaceApi.getInstance().getUsers();
+            // 获取Map转换为List时的泛型类型
+            Type listType = new TypeToken<List<User>>() {}.getType();
+            // 将Map转换为List
+            userList = new Gson().fromJson(ConfigManager.getGson().toJson(userMap.values()), listType);
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    if (list.size() == 0){
+                        addList(page);
+                    }
+                    if (personnelDataAdapter != null ){
+                        personnelDataAdapter.notifyDataSetChanged();
+                    }
+                }
+            });
+        }
+    }
+}

+ 13 - 3
app/src/main/java/com/hanghui/senic/activity/setup/ResultConfigurationActivity.java

@@ -111,6 +111,16 @@ public class ResultConfigurationActivity extends BaseActivity implements View.On
             openORClosingTimeSignal = dataDTO.getSignalInterval();
             openORClosingTimeInterval = dataDTO.getOpenCloseInterval();
             doorSerialPort = dataDTO.getDoorSerialPort();
+            if (openORClosingTimeInterval >= 1000){
+                openORClosingTimeInterval = openORClosingTimeInterval/1000;
+            } else {
+                openORClosingTimeInterval = 1;
+            }
+            if (openORClosingTimeSignal >= 1000){
+                openORClosingTimeSignal = openORClosingTimeSignal/1000;
+            } else {
+                openORClosingTimeInterval = 1;
+            }
         }
 
         initFind();
@@ -263,7 +273,7 @@ public class ResultConfigurationActivity extends BaseActivity implements View.On
             @Override  //当滑块进度改变时,会执行该方法下的代码
             public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                 openORClosingTimeInterval = i;
-                resultConfigurationActivity_ResultConfigurationActivity_OpenORClosingTimeIntervalText.setText(i);
+                resultConfigurationActivity_ResultConfigurationActivity_OpenORClosingTimeIntervalText.setText(String.valueOf(i));
             }
 
             @Override  //当开始滑动滑块时,会执行该方法下的代码
@@ -437,8 +447,8 @@ public class ResultConfigurationActivity extends BaseActivity implements View.On
         ConfigManager.getAuthenticationBean().getData().get(0).setRightTopBarText(rightTopBarText);
         ConfigManager.getAuthenticationBean().getData().get(0).setRelayOpenModel(relayOpenModel);
         ConfigManager.getAuthenticationBean().getData().get(0).setGateTimeOut(openDoorMagnetClosingTimeOut);
-        ConfigManager.getAuthenticationBean().getData().get(0).setSignalInterval(openORClosingTimeSignal);
-        ConfigManager.getAuthenticationBean().getData().get(0).setOpenCloseInterval(openORClosingTimeInterval);
+        ConfigManager.getAuthenticationBean().getData().get(0).setSignalInterval(openORClosingTimeSignal * 1000);
+        ConfigManager.getAuthenticationBean().getData().get(0).setOpenCloseInterval(openORClosingTimeInterval * 1000);
         ConfigManager.getAuthenticationBean().getData().get(0).setDoorSerialPort(doorSerialPort);
     }
 

+ 45 - 23
app/src/main/java/com/hanghui/senic/activity/view/BaiDuFaceView.java

@@ -26,6 +26,7 @@ import com.bumptech.glide.Glide;
 import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
 import com.bumptech.glide.request.RequestOptions;
 import com.example.lib.QRCodeUtil.GenerateQRCodeUtil;
+import com.google.gson.Gson;
 import com.hanghui.senic.MyAppliction;
 import com.hanghui.senic.R;
 import com.hanghui.senic.adapter.OutcomeAdapter;
@@ -40,6 +41,7 @@ import com.hanghui.senic.bean.CheckNumBean;
 import com.hanghui.senic.bean.FederatedPlatformsRequestBean;
 import com.hanghui.senic.bean.FederatedPlatformsResponseBean;
 import com.hanghui.senic.bean.PortBeanB;
+import com.hanghui.senic.bean.UserInformationBean;
 import com.hanghui.senic.common.AppHandler;
 import com.hanghui.senic.common.CommonUtil;
 import com.hanghui.senic.common.Constants;
@@ -136,6 +138,8 @@ public class BaiDuFaceView {
     TextView outcomeActivity_OneLabel;
     TextView outcomeActivity_OneVaule;
     TextView outcomeActivity_eTwoLabel;
+    LinearLayout OutcomeActivity_OutcomeButtonLinear;
+    View OutcomeActivity_OutcomeButtonViewBg;
     TextView outcomeActivity_TwoValue;
     TextView loadingLocally_ThrLabel;
     ImageView loadingLocally_ThrValue;
@@ -382,6 +386,10 @@ public class BaiDuFaceView {
         outcomeActivity_OutcomeSecond = view.findViewById(R.id.OutcomeActivity_OutcomeSecond);
         OutcomeActivity_Phone = view.findViewById(R.id.OutcomeActivity_Phone);
         outcomeActivity_OneLabel = view.findViewById(R.id.OutcomeActivity_OneLabel);
+        if (ConfigManager.isFloatingPages()) {
+            OutcomeActivity_OutcomeButtonLinear = view.findViewById(R.id.OutcomeActivity_OutcomeButtonLinear);
+            OutcomeActivity_OutcomeButtonViewBg = view.findViewById(R.id.OutcomeActivity_OutcomeButtonViewBg);
+        }
         outcomeActivity_OneVaule = view.findViewById(R.id.OutcomeActivity_OneVaule);
         outcomeActivity_eTwoLabel = view.findViewById(R.id.OutcomeActivity_eTwoLabel);
         outcomeActivity_TwoValue = view.findViewById(R.id.OutcomeActivity_TwoValue);
@@ -457,7 +465,8 @@ public class BaiDuFaceView {
                                     federatedPlatformsRequestBean.getData().getPhoto()
                                     , exInfoDTO,
                                     federatedPlatformsRequestBean.getData().getQrcode(),
-                                    federatedPlatformsRequestBean.getData().getIcNumber());
+                                    federatedPlatformsRequestBean.getData().getIcNumber(),
+                                    federatedPlatformsRequestBean.getData().getCardIdEx());
                             //发送默认一比一通过的数据到预检查调度中心
                             DataReturns.getInstance().doDataReturns(null, DataReturns.FACE_DATA_VIRTUAL);
                             HttpRequest.getInstance().requestFederatedPlatformsCheck(true);
@@ -522,7 +531,8 @@ public class BaiDuFaceView {
                                     federatedPlatformsRequestBean.getData().getPhoto()
                                     , exInfoDTO,
                                     federatedPlatformsRequestBean.getData().getQrcode(),
-                                    federatedPlatformsRequestBean.getData().getIcNumber());
+                                    federatedPlatformsRequestBean.getData().getIcNumber(),
+                                    federatedPlatformsRequestBean.getData().getCardIdEx());
                             ConfigManager.CheckList.clear();
                             HttpRequest.getInstance().requestFederatedPlatforms();
                             //加载中
@@ -724,7 +734,7 @@ public class BaiDuFaceView {
                     } else {
                         outcomeActivity_edit.setTextColor(CommonUtil.getCurrentActivity().getResources().getColor(R.color.black));
                         UserInfoManager.getInstance().setUserInformationBean("",
-                                outcomeActivity_edit.getText().toString(), "", "", "");
+                                outcomeActivity_edit.getText().toString(), "", "", "", "");
                         long now = System.currentTimeMillis();
                         if (now - lastClickTime > 1000) {
                             lastClickTime = now;
@@ -777,7 +787,7 @@ public class BaiDuFaceView {
         portBean.setBusinessType(PAGE_TYPE_ENTERIDNUMBER);
         String idNumber = "";
         idNumber = outcomeActivity_edit.getText().toString();
-        UserInfoManager.getInstance().setUserInformationBean(idNumber, "", "", "", "");
+        UserInfoManager.getInstance().setUserInformationBean(idNumber, "", "", "", "", "");
         //判断黑名单中是否存在该用户
         if (BlacklistManager.getInstance().isInBlacklist(idNumber, "")) {
             //展示了阻止通行结果页,直接return掉,不做后续逻辑处理
@@ -797,7 +807,7 @@ public class BaiDuFaceView {
         exInfoDTO.setIdcardContent("");
         ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, idNumber,
                 "", "", "check", "", "",
-                "", exInfoDTO, "", "");
+                "", exInfoDTO, "", "","");
         //当核验接口未开启则直接return,无法做后续处理
         if (!ConfigManager.getAuthenticationBean().getData().get(0).isUseLinkage()) {
             FederatedPlatformsResponseBean federatedPlatformsResponseBean = DataManager.getInstance().getErrorOutcome("LocalError_B", "未开启相关配置,禁止使用手输证件号", 500, "未开启相关配置,禁止使用手输证件号");
@@ -930,7 +940,7 @@ public class BaiDuFaceView {
         //顶部标题栏
         topTitleBar(federatedPlatformsResponseBean);
         //开门时上报进出记录及入库
-        recordOfAccessOrPutInStorage(federatedPlatformsResponseBean);
+        recordOfAccessOrPutInStorage(federatedPlatformsResponseBean,UserInfoManager.getInstance().getUserInformationBean());
         StateExecution(federatedPlatformsResponseBean, ScenePhoto, IDPhoto,bitmap);
         setIsEnd(federatedPlatformsResponseBean);
     }
@@ -978,7 +988,7 @@ public class BaiDuFaceView {
      *
      * @param federatedPlatformsResponseBean
      */
-    private void recordOfAccessOrPutInStorage(FederatedPlatformsResponseBean federatedPlatformsResponseBean) {
+    private void recordOfAccessOrPutInStorage(FederatedPlatformsResponseBean federatedPlatformsResponseBean, UserInformationBean userInformationBean) {
         if (federatedPlatformsResponseBean.getData().getIsOpen() != 0) {
             return;
         }
@@ -988,30 +998,34 @@ public class BaiDuFaceView {
         }
         AppLogUtils.i(true, "结果页展示-进出记录推送", "推送设备刷卡记录");
         //推送进出记录(刷脸刷卡记录)
-        String Photo = UserInfoManager.getInstance().getUserInformationBean().getScenePhoto();
+        String Photo = userInformationBean.getScenePhoto();
+        if (StringIsNull.IsStringNull(Photo)) {
+            Photo = userInformationBean.getIdPhoto();
+        }
         if (StringIsNull.IsStringNull(Photo)) {
-            Photo = UserInfoManager.getInstance().getUserInformationBean().getIdPhoto();
+            Photo = ConfigManager.bitmapToString(userInformationBean.getBitmap());
         }
         HttpRequest.getInstance().setEventRecords(TaskStatus.taskStatus,
-                UserInfoManager.getInstance().getUserInformationBean().getName(),
-                UserInfoManager.getInstance().getUserInformationBean().getIdNumber(),
-                Photo, "",
-                UserInfoManager.getInstance().getUserInformationBean().getMobile(), true, 0);
+                userInformationBean.getName(), userInformationBean.getIdNumber(), Photo, "",
+                userInformationBean.getMobile(), true, 0);
         //用户入库
         if (ConfigManager.getAuthenticationBean().getData().get(0).isAuthVerifiedFacein() && TaskStatus.taskStatus.equals(TaskStatus.TASK_STATUS_PERSONCARD)) {
             AppLogUtils.i(true, "结果页展示-用户匿名入库", "满足入库条件:开启用户入库功能及完成一比一比对");
-            String image = UserInfoManager.getInstance().getUserInformationBean().getScenePhoto();
-            if (StringIsNull.IsStringNull(Photo)) {
-                image = UserInfoManager.getInstance().getUserInformationBean().getIdPhoto();
+            String image = userInformationBean.getScenePhoto();
+            if (StringIsNull.IsStringNull(image)) {
+                image = userInformationBean.getIdPhoto();
+            }
+            if (StringIsNull.IsStringNull(image)) {
+                image = ConfigManager.bitmapToString(userInformationBean.getBitmap());
             }
             if (!StringIsNull.IsStringNull(image) &&
-                    !StringIsNull.IsStringNull(UserInfoManager.getInstance().getUserInformationBean().getIdNumber()) &&
-                    !StringIsNull.IsStringNull(UserInfoManager.getInstance().getUserInformationBean().getName())) {
+                    !StringIsNull.IsStringNull(userInformationBean.getIdNumber()) &&
+                    !StringIsNull.IsStringNull(userInformationBean.getName())) {
                 Map<String, Object> map = new HashMap<>();
                 map.put("appId", ConfigManager.serviceAppId);
                 map.put("image", image);
-                map.put("certNo", UserInfoManager.getInstance().getUserInformationBean().getIdNumber());
-                map.put("certName", UserInfoManager.getInstance().getUserInformationBean().getName());
+                map.put("certNo", userInformationBean.getIdNumber());
+                map.put("certName", userInformationBean.getName());
                 HttpRequest.getInstance().requestUserwithftoken(map);
             } else {
                 AppLogUtils.e(true, "用户匿名入库", "用户匿名入库 姓名、照片、身份证号存在空值,无法满足入库要求");
@@ -1546,7 +1560,7 @@ public class BaiDuFaceView {
             outcomeActivity_PAGE_TYPE_CLOSING_PENDING_MULTIPLE.setVisibility(View.GONE);
         }
         outcomeActivity_LocalError.setVisibility(View.VISIBLE);
-        loadingLocally_bottom_LinearLayout.setVisibility(View.GONE);
+        loadingLocally_bottom_LinearLayout.setVisibility(View.VISIBLE);
         generalOutCome_Background.setVisibility(View.GONE);
         outcomeActivity_statusPending.setVisibility(View.GONE);
         outcomeActivity_MultipleVotes.setVisibility(View.GONE);
@@ -1752,7 +1766,8 @@ public class BaiDuFaceView {
                                 federatedPlatformsResponseBean.getData().getPhoto()
                                 , exInfoDTO,
                                 federatedPlatformsResponseBean.getData().getQrcodeText(),
-                                federatedPlatformsRequestBean.getData().getIcNumber());
+                                federatedPlatformsRequestBean.getData().getIcNumber(),
+                                federatedPlatformsRequestBean.getData().getCardIdEx());
                         //发送默认一比一通过的数据到预检查调度中心
                         DataReturns.getInstance().doDataReturns(null, DataReturns.FACE_DATA_VIRTUAL);
                         HttpRequest.getInstance().requestFederatedPlatformsCheck(true);
@@ -2248,6 +2263,9 @@ public class BaiDuFaceView {
         outcomeActivity_LocalError.setVisibility(View.GONE);
         generalOutCome_Background.setVisibility(View.GONE);
         if (ConfigManager.isFloatingPages()) {
+            loadingLocally_bottom_LinearLayout.setVisibility(View.VISIBLE);
+            OutcomeActivity_OutcomeButtonLinear.setVisibility(View.GONE);
+            OutcomeActivity_OutcomeButtonViewBg.setVisibility(View.VISIBLE);
 //            outcomeActivity_LocalError_idNumberLinear2.setVisibility(View.GONE);
             outcomeActivity_PAGE_TYPE_CLOSING_PENDING_MULTIPLE.setVisibility(View.GONE);
             loadingLocally_TopLinearLayout.setVisibility(View.VISIBLE);
@@ -2347,6 +2365,7 @@ public class BaiDuFaceView {
             } else {
                 OutcomeActivity_Phone.setVisibility(View.GONE);
             }
+
             //隐藏本地加载的gif图
             outcomeActivity_loadingLocally.setVisibility(View.GONE);
             //显示结果页面
@@ -2578,8 +2597,9 @@ public class BaiDuFaceView {
                     String photo = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getPhoto());
                     String qrCode = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getQrcodeText());
                     String icNumber = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getIcNumber());
+                    String cardIdEx = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getCardIdEx());
                     ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE,
-                            idNumber, name, phone, "check", taskId, "", photo, exInfoDTO, qrCode, icNumber);
+                            idNumber, name, phone, "check", taskId, "", photo, exInfoDTO, qrCode, icNumber, cardIdEx);
                 }
                 AppHandler.getHandler().post(new Runnable() {
                     @Override
@@ -2739,6 +2759,8 @@ public class BaiDuFaceView {
         outcomeActivity_LocalError.setVisibility(View.GONE);
         generalOutCome_Background.setVisibility(View.GONE);
         if (ConfigManager.isFloatingPages()) {
+            OutcomeActivity_OutcomeButtonLinear.setVisibility(View.VISIBLE);
+            OutcomeActivity_OutcomeButtonViewBg.setVisibility(View.GONE);
             outcomeActivity_LocalError_idNumberLinear.setVisibility(View.GONE);
             outcomeActivity_PAGE_TYPE_CLOSING_PENDING_MULTIPLE.setVisibility(View.GONE);
             RequestOptions options = new RequestOptions().bitmapTransform(new RoundedCorners(10));

+ 11 - 7
app/src/main/java/com/hanghui/senic/activity/view/ResultViewManager.java

@@ -580,7 +580,8 @@ public class ResultViewManager {
                                     federatedPlatformsRequestBean.getData().getPhoto()
                                     , exInfoDTO,
                                     federatedPlatformsRequestBean.getData().getQrcode(),
-                                    federatedPlatformsRequestBean.getData().getIcNumber());
+                                    federatedPlatformsRequestBean.getData().getIcNumber(),
+                                    federatedPlatformsRequestBean.getData().getCardIdEx());
                             //发送默认一比一通过的数据到预检查调度中心
                             DataReturns.getInstance().doDataReturns(null, DataReturns.FACE_DATA_VIRTUAL);
                             HttpRequest.getInstance().requestFederatedPlatformsCheck(true);
@@ -645,7 +646,8 @@ public class ResultViewManager {
                                     federatedPlatformsRequestBean.getData().getPhoto()
                                     , exInfoDTO,
                                     federatedPlatformsRequestBean.getData().getQrcode(),
-                                    federatedPlatformsRequestBean.getData().getIcNumber());
+                                    federatedPlatformsRequestBean.getData().getIcNumber(),
+                                    federatedPlatformsRequestBean.getData().getCardIdEx());
                             ConfigManager.CheckList.clear();
                             HttpRequest.getInstance().requestFederatedPlatforms();
                             //加载中
@@ -848,7 +850,7 @@ public class ResultViewManager {
                     } else {
                         outcomeActivity_edit.setTextColor(CommonUtil.getCurrentActivity().getResources().getColor(R.color.black));
                         UserInfoManager.getInstance().setUserInformationBean("",
-                                outcomeActivity_edit.getText().toString(), "", "", "");
+                                outcomeActivity_edit.getText().toString(), "", "", "", "");
                         long now = System.currentTimeMillis();
                         if (now - lastClickTime > 1000) {
                             lastClickTime = now;
@@ -904,7 +906,7 @@ public class ResultViewManager {
         portBean.setBusinessType(PAGE_TYPE_ENTERIDNUMBER);
         String idNumber = "";
         idNumber = outcomeActivity_edit.getText().toString();
-        UserInfoManager.getInstance().setUserInformationBean(idNumber, "", "", "", "");
+        UserInfoManager.getInstance().setUserInformationBean(idNumber, "", "", "", "", "");
         //判断黑名单中是否存在该用户
         if (BlacklistManager.getInstance().isInBlacklist(idNumber, "")) {
             //展示了阻止通行结果页,直接return掉,不做后续逻辑处理
@@ -924,7 +926,7 @@ public class ResultViewManager {
         exInfoDTO.setIdcardContent("");
         ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, idNumber,
                 "", "", "check", "", "",
-                "", exInfoDTO, "", "");
+                "", exInfoDTO, "", "","");
 //        if (ConfigManager.isPreCheck()) {
 //            if (!ConfigManager.getAuthenticationBean().getData().get(0).isUsePersonCard()) {
 //                AppLogUtils.i(true, TAG, "手输证件号_不开启人证比对,开启预检查:默认人证比对成功(虚拟)");
@@ -1867,7 +1869,8 @@ public class ResultViewManager {
                                 federatedPlatformsResponseBean.getData().getPhoto()
                                 , exInfoDTO,
                                 federatedPlatformsResponseBean.getData().getQrcodeText(),
-                                federatedPlatformsRequestBean.getData().getIcNumber());
+                                federatedPlatformsRequestBean.getData().getIcNumber(),
+                                federatedPlatformsRequestBean.getData().getCardIdEx());
                         //发送默认一比一通过的数据到预检查调度中心
                         DataReturns.getInstance().doDataReturns(null, DataReturns.FACE_DATA_VIRTUAL);
                         HttpRequest.getInstance().requestFederatedPlatformsCheck(true);
@@ -2688,8 +2691,9 @@ public class ResultViewManager {
                     String photo = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getPhoto());
                     String qrCode = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getQrcodeText());
                     String icNumber = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getIcNumber());
+                    String cardIdEx = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getCardIdEx());
                     ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE,
-                            idNumber, name, phone, "check", taskId, "", photo, exInfoDTO, qrCode, icNumber);
+                            idNumber, name, phone, "check", taskId, "", photo, exInfoDTO, qrCode, icNumber,cardIdEx);
                 }
                 AppHandler.getHandler().post(new Runnable() {
                     @Override

+ 96 - 0
app/src/main/java/com/hanghui/senic/adapter/PersonnelDataAdapter.java

@@ -0,0 +1,96 @@
+package com.hanghui.senic.adapter;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
+import com.bumptech.glide.request.RequestOptions;
+import com.example.datalibrary.model.User;
+import com.hanghui.senic.R;
+import com.hanghui.senic.baiduface.UserFaceData;
+import com.hanghui.senic.service.usbserialdemo.utile.StringIsNull;
+import com.hanghui.senic.service.usbserialdemo.utile.StringUtils;
+import com.hanghui.senic.utils.ImageLoaderUtils;
+
+import java.util.List;
+
+public class PersonnelDataAdapter extends RecyclerView.Adapter<PersonnelDataAdapter.Holder> {
+
+    List<UserFaceData.Data.Item> list;
+    Context context;
+    PersonnelDataAdapter.OnItemClickListener listener;
+    PersonnelDataAdapter.Holder viewHolder;
+
+    public PersonnelDataAdapter(List<UserFaceData.Data.Item> mList, Context context) {
+        this.context = context;
+        this.list = mList;
+    }
+
+    @NonNull
+    @Override
+    public Holder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+        View view = LayoutInflater.from(context).inflate(R.layout.personneldata_adapter, viewGroup, false);
+        return new Holder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull final Holder holder, final int i) {
+        this.viewHolder = holder;
+        holder.personnelDataAdapter_ID.setText(StringIsNull.ReturnString(list.get(i).getUserId()+""));
+        holder.personnelDataAdapter_name.setText(StringIsNull.ReturnString(list.get(i).getUserName()));
+        String cardIdEx = list.get(i).getCardIdEx();
+        if (StringIsNull.IsStringNull(cardIdEx)){
+            cardIdEx = " -";
+        }
+        holder.personnelDataAdapter_cardNumber.setText(cardIdEx);
+        //脱敏
+        String idNumber = StringUtils.idCardNum(StringIsNull.ReturnString(list.get(i).getIdNumber()));
+        holder.personnelDataAdapter_idNumber.setText(idNumber);
+        String phone = StringUtils.getMobilePhone(StringIsNull.ReturnString(list.get(i).getPhone()));
+        holder.personnelDataAdapter_phone.setText(phone);
+        //照片添加
+        //设置图片圆角角度
+        RequestOptions options = new RequestOptions().bitmapTransform(new RoundedCorners(99))
+                .placeholder(R.mipmap.personneldataadapter_title);
+        ImageLoaderUtils.loadImage(list.get(i).getPhoto(),holder.personnelDataAdapter_titleImage,options);
+    }
+
+    @Override
+    public int getItemCount() {
+        return list.size();
+    }
+
+    public class Holder extends RecyclerView.ViewHolder {
+        ImageView personnelDataAdapter_titleImage;
+        TextView personnelDataAdapter_ID;
+        TextView personnelDataAdapter_name;
+        TextView personnelDataAdapter_cardNumber;
+        TextView personnelDataAdapter_idNumber;
+        TextView personnelDataAdapter_phone;
+
+        public Holder(@NonNull View itemView) {
+            super(itemView);
+            personnelDataAdapter_titleImage = itemView.findViewById(R.id.personnelDataAdapter_titleImage);
+            personnelDataAdapter_ID = itemView.findViewById(R.id.personnelDataAdapter_ID);
+            personnelDataAdapter_name = itemView.findViewById(R.id.personnelDataAdapter_name);
+            personnelDataAdapter_cardNumber = itemView.findViewById(R.id.personnelDataAdapter_cardNumber);
+            personnelDataAdapter_idNumber = itemView.findViewById(R.id.personnelDataAdapter_idNumber);
+            personnelDataAdapter_phone = itemView.findViewById(R.id.personnelDataAdapter_phone);
+        }
+    }
+
+    public void setListener(OnItemClickListener listener) {
+        this.listener = listener;
+    }
+
+    public interface OnItemClickListener {
+        void onItemClick(int position);
+    }
+}

+ 5 - 4
app/src/main/java/com/hanghui/senic/baiduface/BaiduFaceMainActivity.java

@@ -358,7 +358,6 @@ public class BaiduFaceMainActivity extends BaseActivity {
         BroadcastManager.getInstance().registerNetworkChangeReceiver(netNetworkCallback);
         BroadcastManager.getInstance().registerUSBroadcastReceiver(usBroadcastCallback);
         PosManager.getInstance().init();
-        MyAppliction.setAppHeartbeatTime(0L);
         //启动应用状态定时上报服务
         RegularReportingService.start(this);
         //ping百度,判断网络连接是否正常
@@ -436,7 +435,7 @@ public class BaiduFaceMainActivity extends BaseActivity {
 
     private void initLog() {
         boolean isScreenLogOpen = (boolean) SharedPreferencesUtils.getParam(MyAppliction.getContext(), "is_screen_log_open", DevelopUtil.isScreenLogOpen);
-        DevelopUtil.setScreenLogOpen(isScreenLogOpen);
+        DevelopUtil.setScreenLogOpen(false);
     }
 
 
@@ -483,17 +482,19 @@ public class BaiduFaceMainActivity extends BaseActivity {
      * 更新网络类型 iv_networkType
      */
     private void updateNetworkTypeView() {
-        if (NetWorkUtils.getNetworkType() != -1){
+        if (NetWorkUtils.getNetworkType() != 0){
             ViewGroup.LayoutParams layoutParams = iv_networkType.getLayoutParams();
             layoutParams.width = (int) getResources().getDimension(R.dimen.dp_32);
             layoutParams.height =  (int) getResources().getDimension(R.dimen.dp_32);
-            iv_networkType.setImageResource(NetWorkUtils.getNetworkType());
+            ImageLoaderUtils.loadImage(NetWorkUtils.getNetworkType(),iv_networkType);
         } else {//无网络
             ViewGroup.LayoutParams layoutParams = iv_networkType.getLayoutParams();
             layoutParams.width = (int) getResources().getDimension(R.dimen.dp_72);
             layoutParams.height =  (int) getResources().getDimension(R.dimen.dp_32);
             iv_networkType.setImageResource(R.mipmap.network_icon_no);
+            ImageLoaderUtils.loadImage(R.mipmap.network_icon_no,iv_networkType);
         }
+
     }
 
     /**

+ 90 - 18
app/src/main/java/com/hanghui/senic/baiduface/BaiduFacePreviewActivity.java

@@ -1,6 +1,7 @@
 package com.hanghui.senic.baiduface;
 
 
+import android.content.Intent;
 import android.graphics.Bitmap;
 import android.hardware.Camera;
 import android.os.Handler;
@@ -33,6 +34,7 @@ import com.example.datalibrary.model.User;
 import com.example.datalibrary.utils.BitmapUtils;
 import com.example.datalibrary.utils.FaceOnDrawTexturViewUtil;
 import com.example.datalibrary.utils.ToastUtils;
+import com.google.gson.Gson;
 import com.hanghui.senic.MyAppliction;
 import com.hanghui.senic.R;
 import com.hanghui.senic.activity.view.BaiDuFaceView;
@@ -58,10 +60,15 @@ import com.hanghui.senic.service.usbserialdemo.utile.ConfigManager;
 import com.hanghui.senic.service.usbserialdemo.utile.StringIsNull;
 import com.hanghui.senic.service.usbserialdemo.utile.StringUtils;
 import com.hanghui.senic.service.usbserialdemo.utile.loacat.AppLogUtils;
+import com.hanghui.senic.service.keep.MyJobService;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
+import org.json.JSONArray;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * 百度face的刷脸页面
@@ -126,11 +133,13 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
     long startTime = 0L;//将刷脸返回时的当前时间保存,用于下次比较
 
     private final int WHAT_HIDE_LEDLIGHT=0x22; //关闭补光灯事件
-    private boolean  lastOpenLedLightState=false; //是否已经打开补光灯
+    private volatile boolean  isOpenLighet=false; //是否已经打开补光灯
+    private volatile boolean isBaiduFaceSucceed = false;  //百度是否已经激活授权成功,防止多次调用
     //结果页视图
     private FrameLayout baiDuView_FloatingResultPageFrame;
     private FrameLayout baiDuView_GeneralResultPageFrame;
 
+
     private Handler mHandler=new Handler(Looper.getMainLooper()){
         @Override
         public void handleMessage(@NonNull Message msg) {
@@ -204,7 +213,6 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
         super.setOnCreate();
     }
 
-
     @Override
     public void onPause() {
         super.onPause();
@@ -247,6 +255,7 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
 
     public void OnDestoryListener() {
         super.OnDestoryListener();
+        CommonUtil.setLedLight(false);
         EventBus.getDefault().unregister(this);
         AppLogUtils.i(true, TAG, "BaiduFaceActivity, onDestroy()");
         AppHandler.getHandler().removeCallbacks(mPersonCardTimeoutRunnable);
@@ -268,7 +277,10 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
      */
     @Override
     public void doAfterLicenseSuccess() {
-
+        if (isBaiduFaceSucceed) { //避免多次调用
+            return;
+        }
+        isBaiduFaceSucceed = true;
         initBaiduFaceControllerCallback();
 
         initListener(); // 初始化模型
@@ -287,6 +299,20 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
         //todo 必須放在最底下,onResume会启动预览,这个时候如果初始设置未初始化完成,后面会报空指针
         initBaiduFaceAuthState=true;
     }
+    public List<LivenessModel> parseData(String result) {//Gson 解析
+        List<LivenessModel> detail = new ArrayList<>();
+        try {
+            JSONArray data = new JSONArray(result);
+            Gson gson = new Gson();
+            for (int i = 0; i < data.length(); i++) {
+                LivenessModel entity = gson.fromJson(data.optJSONObject(i).toString(), LivenessModel.class);
+                detail.add(entity);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return detail;
+    }
 
     private void initBaiduFaceControllerCallback() {
         BaiduFaceController.getInstance().setBaiduFaceControllerCallback(mBaiduFaceControllerCallback);
@@ -339,6 +365,7 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
                             FaceSDKManager.initModelSuccess = true;
                             //ToastUtils.toast(mContext, "模型加载成功,欢迎使用");
                             AppLogUtils.i(true, TAG, "模型加载成功,欢迎使用");
+
                         }
 
                         @Override
@@ -478,7 +505,7 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
     }
 
     private void dealRgb(byte[] data) {
-        //  Log.i("______456","rgb数据"+data.length);
+//          Log.i("______456","rgb数据"+data.length);
 
         glMantleSurfacView.setFrame();
 
@@ -488,9 +515,8 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
     }
 
     private void dealIr(byte[] data) {
-        //  Log.i("______456","nir数据"+data.length);
+//          Log.i("______456","---------------nir数据"+data.length);
 //        SystemClock.sleep(30);
-
         bdNirFaceImageConfig.setData(data);
         checkData();
 
@@ -521,7 +547,6 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
                         }
 
                         mUser = livenessModel.getUser();//人脸库中匹配到人时getUser()就是非null
-
                         AppLogUtils.i(false, TAG, "onFaceDetectCallback(), 刷脸结果, livenessModel=" + livenessModel + "  ,isNeedVerify=" + isNeedVerify + " ,checkMode=" + bdFaceCheckConfig.getFeatureCheckMode());
 
                         if (isNeedVerify) {
@@ -577,6 +602,50 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
                 });
     }
 
+    private synchronized void checkData(LivenessModel livenessModel){
+
+
+        mUser = livenessModel.getUser();//人脸库中匹配到人时getUser()就是非null
+
+        AppLogUtils.i(false, TAG, "onFaceDetectCallback(), 刷脸结果, livenessModel=" + livenessModel + "  ,isNeedVerify=" + isNeedVerify + " ,checkMode=" + bdFaceCheckConfig.getFeatureCheckMode());
+        if (isNeedVerify) {
+
+     /*                               AppHandler.getHandler().post(new Runnable() {
+                                        @Override
+                                        public void run() {
+                                            mCurLivenessModel = livenessModel;
+
+                                            //AppLogUtils.i(false, TAG, "bdFaceCheckConfig.getFeatureCheckMode()=" + bdFaceCheckConfig.getFeatureCheckMode() );
+
+                                            if (bdFaceCheckConfig.getFeatureCheckMode() == 3) {
+                                                doScanFaceResult(livenessModel);
+                                            } else if (bdFaceCheckConfig.getFeatureCheckMode() == 4) {
+                                                doPersonCardResult(livenessModel);
+                                            }
+                                        }
+                                    });*/
+
+
+            mCurLivenessModel = livenessModel;
+
+            //AppLogUtils.i(false, TAG, "bdFaceCheckConfig.getFeatureCheckMode()=" + bdFaceCheckConfig.getFeatureCheckMode() );
+
+            if (bdFaceCheckConfig.getFeatureCheckMode() == 3 && ConfigManager.getAuthenticationBeanListBean().getOpenOneToN()) {
+                doScanFaceResult(livenessModel);
+            } else if (bdFaceCheckConfig.getFeatureCheckMode() == 4) {
+                doPersonCardResult(livenessModel);
+            }
+
+        }else{
+            if (livenessModel != null && livenessModel.getBdNirFaceImageInstance() != null) {
+                livenessModel.getBdNirFaceImageInstance().destory();
+            }
+            if (livenessModel != null && livenessModel.getBdFaceImageInstance() != null) {
+                livenessModel.getBdFaceImageInstance().destory();
+            }
+        }
+    }
+
     /**
      * 绘制人脸框
      *
@@ -778,9 +847,12 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
             //exInfoDTO.setSmileParams(faceRequestParams);
             exInfoDTO.setHhfaceParams(faceRequestParams);
             exInfoDTO.setIdcardContent("");
-            ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, "",
-                    "", "", "check", "", "",
-                    "", exInfoDTO, "", "");
+            ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE,
+                    UserInfoManager.getInstance().getUserInformationBean().getIdNumber(),
+                    UserInfoManager.getInstance().getUserInformationBean().getName(),
+                    UserInfoManager.getInstance().getUserInformationBean().getMobile(),
+                    "check", "", "", "", exInfoDTO, "", "",
+                    UserInfoManager.getInstance().getUserInformationBean().getCardIdEx());
             if (ConfigManager.isPreCheck()) {//预检查模式
                 DataReturns.getInstance().doDataReturns(null, faceRequestParams);
                 HttpRequest.getInstance().requestFederatedPlatformsCheck(true);
@@ -824,13 +896,13 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
             return;
         }
         User user = livenessModel.getUser();
-
         UserInfoItem userInfoItem = BaiduFaceUtil.getUserInfo(user);
         String userName = userInfoItem.getUserName();
         String idNumber = userInfoItem.getIdNumber();
         String phone = userInfoItem.getPhone();
         String photo = userInfoItem.getPhoto();
-        UserInfoManager.getInstance().setUserInformationBean(userName, idNumber, "", photo, phone);
+        String cardIdEx = userInfoItem.getCardIdEx();
+        UserInfoManager.getInstance().setUserInformationBean(userName, idNumber, "", photo, phone,cardIdEx);
         //人脸图片
         BDFaceImageInstance rgbImage = livenessModel.getBdFaceImageInstance();
         if (rgbImage != null) {
@@ -839,7 +911,7 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
 //            byte[] photoByteArray = BitmapUtils.bitmapToBytes(bitmap);
 //            String photoBase64Str = CommonUtil.byteArrayToBase64String(photoByteArray);
 //            String photoBase64Str = CommonUtil.bitmapToString(bitmap);
-            UserInfoManager.getInstance().setUserInformationBean(userName, idNumber, "", "", phone,bitmap);
+            UserInfoManager.getInstance().setUserInformationBean(userName, idNumber, "", "", phone,bitmap,cardIdEx);
 
         } else {
             AppLogUtils.e(true, TAG, "updateScenePhoto(), bdFaceImageInstance == null, 结果页无法显示现场照片");
@@ -941,6 +1013,7 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
         }
 
         byte[] secondFeature = new byte[512];
+        AppLogUtils.e(false,"","-------特征值打印   "+new Gson().toJson(secondFeature));
         // 提取特征值, 图片特征值提取成功的ret值是128
 /*        float ret = FaceSDKManager.getInstance().personDetect(cardPhotoBitmap, secondFeature,
                 com.baidu.idl.main.facesdk.identifylibrary.utils.FaceUtils.getInstance().getBDFaceCheckConfig(), this);*/
@@ -1086,17 +1159,16 @@ public class BaiduFacePreviewActivity extends BaiduFaceMainActivity {
         if (event == null||mHandler==null) {
             return;
         }
-        if(event.isOpenLedLight()){
-            lastOpenLedLightState=true;
+        if(event.isOpenLedLight()){  //
+            isOpenLighet = true;
             mHandler.removeMessages(WHAT_HIDE_LEDLIGHT);
             CommonUtil.setLedLight(true);
-        }else if(lastOpenLedLightState){
-            lastOpenLedLightState=false;
+        }else if(isOpenLighet){
+            isOpenLighet = false;
             mHandler.removeMessages(WHAT_HIDE_LEDLIGHT);
             mHandler.sendEmptyMessageDelayed(WHAT_HIDE_LEDLIGHT,event.getDelay());
         }
 
-
     }
 
 }

+ 7 - 3
app/src/main/java/com/hanghui/senic/baiduface/BaiduFaceUtil.java

@@ -184,10 +184,14 @@ public class BaiduFaceUtil {
     }
     public static void stopBaiduFaceWebsocketService() {
         AppLogUtils.i(true, TAG, "stopBaiduFaceWebsocketService()" );
+        try {
+            Context context = MyAppliction.getContext();
+            Intent intent = new Intent(context, WebsocketService.class);
+            context.stopService(intent);
+        }catch (Exception e){
+
+        }
 
-        Context context = MyAppliction.getContext();
-        Intent intent = new Intent(context, WebsocketService.class);
-        context.stopService(intent);
 
 
     }

+ 48 - 45
app/src/main/java/com/hanghui/senic/baiduface/WebsocketService.java

@@ -65,7 +65,9 @@ public class WebsocketService extends Service {
         @Override
         public void run() {
             sendMessage_userinfoReport();
-            mHandlerThreadHandler.postDelayed(this, 30 * 1000);//每隔30秒上报一次设备上的人员信息
+            if(mHandlerThreadHandler!=null) {
+                mHandlerThreadHandler.postDelayed(this, 30 * 1000);
+            }//每隔30秒上报一次设备上的人员信息
         }
     };
 
@@ -86,8 +88,6 @@ public class WebsocketService extends Service {
         public void run() {
             sendMessage_heartbeat();
             mHandlerThreadHandler.postDelayed(this, HEART_BEAT_INTERVAL);
-            rebortApp();
-
         }
     };
 
@@ -104,7 +104,7 @@ public class WebsocketService extends Service {
     @Override
     public void onCreate() {
         super.onCreate();
-        initHandlerThread();
+
 
     }
 
@@ -113,9 +113,9 @@ public class WebsocketService extends Service {
     public int onStartCommand(Intent intent, int flags, int startId) {
         AppLogUtils.i(true, TAG + " ,onStartCommand", "onStartCommand()");
 
-        //test_processUserData_delete();
         isOnDestory=false;
         cleanFaceQueue(); //清除刷脸队列
+        initHandlerThread();
         initWebSocket();
 
         return START_STICKY;
@@ -152,18 +152,41 @@ public class WebsocketService extends Service {
      *
     **/
     private void cleanFaceQueue(){
-        if(webSocketTaskMap!=null) {
-            for (String key : webSocketTaskMap.keySet()) {
-                WebSocketTask webSocketTask = webSocketTaskMap.get(key);
-                if (webSocketTask == null) {
-                    continue;
+        if(mHandlerThreadHandler!=null) {
+            mHandlerThreadHandler.removeCallbacks(mUserInfoReportRunnable);
+            mHandlerThreadHandler.removeCallbacks(mHeartbeatRunnable);
+            mHandlerThreadHandler.removeCallbacks(mHeartbeatTimeOutRunnable);
+            mHandlerThreadHandler.removeCallbacksAndMessages(null);
+            mHandlerThreadHandler.getLooper().quitSafely();
+        }
+        if(mHandlerThread!=null) {
+            mHandlerThread.interrupt();
+        }
+        mHandlerThread=null;
+        mHandlerThreadHandler=null;
+
+
+        if(mFaceDataHandlerThreadHandler!=null) {
+            if (webSocketTaskMap != null) {
+                for (String key : webSocketTaskMap.keySet()) {
+                    WebSocketTask webSocketTask = webSocketTaskMap.get(key);
+                    if (webSocketTask == null) {
+                        continue;
+                    }
+                    webSocketTask.setWebSocketTaskEnum(WebSocketTaskEnum.CANCEL);
+                    webSocketTaskMap.put(key, webSocketTask);
+                    mFaceDataHandlerThreadHandler.removeCallbacks(webSocketTask.getRunnable());
                 }
-                webSocketTask.setWebSocketTaskEnum(WebSocketTaskEnum.CANCEL);
-                webSocketTaskMap.put(key,webSocketTask);
-                mFaceDataHandlerThreadHandler.removeCallbacks(webSocketTask.getRunnable());
+                webSocketTaskMap.clear();
             }
-            webSocketTaskMap.clear();
+            mFaceDataHandlerThreadHandler.removeCallbacksAndMessages(null);
+            mFaceDataHandlerThreadHandler.getLooper().quitSafely();
         }
+        if(mFaceDataHandlerThread!=null) {
+            mFaceDataHandlerThread.interrupt();
+        }
+        mFaceDataHandlerThreadHandler =null;
+        mFaceDataHandlerThread = null;
     }
 
 
@@ -280,7 +303,9 @@ public class WebsocketService extends Service {
             //onMessage()方法在子线程被调用
 
             //有消息返回就代表和服务端连接正常,就可以直接remove掉mHeartbeatTimeOutRunnable
-            mHandlerThreadHandler.removeCallbacks(mHeartbeatTimeOutRunnable);
+            if(mHandlerThreadHandler!=null) {
+                mHandlerThreadHandler.removeCallbacks(mHeartbeatTimeOutRunnable);
+            }
 
             //下发1万8千条数据时,AppLogUtils.i()里面调用toJson()时会调用toString()的new String(toStringCache, 0, count) 会报错:java.lang.OutOfMemoryError: Failed to allocate a 39218584 byte allocation with 16504232 free bytes
             //输出到文件时AppLogUtils的print2File()方法也会报错: java.lang.OutOfMemoryError
@@ -309,6 +334,12 @@ public class WebsocketService extends Service {
                 processUserData_Cancel(userFaceData.getData());
                 return;
 
+            }
+            if (userFaceData.getOp().equals(BaiduFaceConstant.OP_HHFACE_HEART_TRACKING)) { //心跳包的响应
+                //心跳包的响应不需要处理
+                //心跳包的响应没有Data字段
+                return;
+
             }
             //todo 接收到下发的消息,依次放进队列按照顺序执行
             executeAddFacetasks(userFaceData);
@@ -587,7 +618,7 @@ public class WebsocketService extends Service {
      * @param data
      */
     public synchronized void processUserData_issue(UserFaceData.Data data) {
-        AppLogUtils.i(true, TAG + " ,processUserData_issue", "processUserData_issue(), item.size=" + data.getItems().size());
+        AppLogUtils.i(true, TAG + " ,processUserData_issue", "processUserData_issue(),本次需下发总人数: item.size=" + data.getItems().size());
         if(isOnDestory){
             return;
         }
@@ -690,7 +721,7 @@ public class WebsocketService extends Service {
 
 
                 if (isSuccess) {
-                    AppLogUtils.i(true, TAG + " ,processUserData_issue", "processUserData_issue(), 人脸注册成功, userId=" + userId + " ,userName=" + userName);
+                    AppLogUtils.i(false, TAG + " ,processUserData_issue", "processUserData_issue(), 人脸注册成功, userId=" + userId + " ,userName=" + userName);
 
                     code = CODE_success;
                     msg = "下发成功";
@@ -1153,32 +1184,4 @@ public class WebsocketService extends Service {
         return webSocketTaskMap;
     }
 
-    private void rebortApp(){
-        try {
-
-            long currentTime=System.currentTimeMillis();
-            long appHeartTime=MyAppliction.getAppHeartbeatTime();
-            if (appHeartTime > 0 && currentTime - appHeartTime >= 75 * 1000) { //两个心跳时间,多出15秒是心跳通信耗时
-  /*              AppLogUtils.e(true,"WebSocketService","重启应用,app业务心跳停止   ");
-                Log.i("____789","WebSocketService:"+"重启应用,app业务心跳停止   ");
-                Intent intent = new Intent( MyAppliction.getContext().getApplicationContext(), BaiduFacePreviewActivity.class);
-                @SuppressLint("WrongConstant")
-                PendingIntent restartIntent = PendingIntent.getActivity( MyAppliction.getContext().getApplicationContext(), 0, intent,
-                        Intent.FLAG_ACTIVITY_NEW_TASK);
-                //退出程序
-                AlarmManager mgr = (AlarmManager) MyAppliction.getContext().getSystemService(Context.ALARM_SERVICE);
-                mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); //1秒钟后重启应用
-                if( MyAppliction.getContext() instanceof MyAppliction){
-                    ((MyAppliction) MyAppliction.getContext()).finishActivity();
-                    System.exit(0);
-                }else{
-                    System.exit(0);
-                }*/
-
-            }
-        }catch (Exception e){
-
-        }
-
-    }
 }

+ 10 - 0
app/src/main/java/com/hanghui/senic/bean/FederatedPlatformsRequestBean.java

@@ -53,9 +53,19 @@ public class FederatedPlatformsRequestBean {
         private String photo;//现场照片 base64
         @SerializedName("icNumber")
         private String icNumber;//IC卡
+        @SerializedName("cardIdEx")
+        private String cardIdEx;//物理卡号
         @SerializedName("extInfo")
         private ExtInfoDTO exInfo;
 
+        public String getCardIdEx() {
+            return cardIdEx;
+        }
+
+        public void setCardIdEx(String cardIdEx) {
+            this.cardIdEx = cardIdEx;
+        }
+
         public String getIcNumber() {
             return icNumber;
         }

+ 10 - 0
app/src/main/java/com/hanghui/senic/bean/FederatedPlatformsResponseBean.java

@@ -175,6 +175,16 @@ public class FederatedPlatformsResponseBean {
         private String icNumber;
         @SerializedName("isSmileResult")
         private boolean isSmileResult;
+        @SerializedName("cardIdEx")
+        private String cardIdEx;
+
+        public String getCardIdEx() {
+            return cardIdEx;
+        }
+
+        public void setCardIdEx(String cardIdEx) {
+            this.cardIdEx = cardIdEx;
+        }
 
         public boolean isSmileResult() {
             return isSmileResult;

+ 88 - 0
app/src/main/java/com/hanghui/senic/bean/UserInfoBean.java

@@ -0,0 +1,88 @@
+package com.hanghui.senic.bean;
+
+public class UserInfoBean {
+
+    /**
+     * cardIdEx :
+     * endTime : 1761126505000
+     * idNumber : 410922199611150054
+     * phone : 18625196127
+     * photo : https://test.hz-hanghui.com:18890/ywjl_fyzd/file/upload/images/20241022/564983634281365504.jpg
+     * startTime : 1729590475000
+     * userId : 360198
+     * userName : 尚义鹏
+     */
+
+    private String cardIdEx;
+    private long endTime;
+    private String idNumber;
+    private String phone;
+    private String photo;
+    private long startTime;
+    private int userId;
+    private String userName;
+
+    public String getCardIdEx() {
+        return cardIdEx;
+    }
+
+    public void setCardIdEx(String cardIdEx) {
+        this.cardIdEx = cardIdEx;
+    }
+
+    public long getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(long endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getIdNumber() {
+        return idNumber;
+    }
+
+    public void setIdNumber(String idNumber) {
+        this.idNumber = idNumber;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public long getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(long startTime) {
+        this.startTime = startTime;
+    }
+
+    public int getUserId() {
+        return userId;
+    }
+
+    public void setUserId(int userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+}

+ 9 - 0
app/src/main/java/com/hanghui/senic/bean/UserInformationBean.java

@@ -9,6 +9,15 @@ public class UserInformationBean {
     private String scenePhoto;
     private String mobile;
     private Bitmap bitmap;
+    private String cardIdEx;
+
+    public String getCardIdEx() {
+        return cardIdEx;
+    }
+
+    public void setCardIdEx(String cardIdEx) {
+        this.cardIdEx = cardIdEx;
+    }
 
     public Bitmap getBitmap() {
         return bitmap;

+ 2 - 1
app/src/main/java/com/hanghui/senic/common/DataReturns.java

@@ -134,7 +134,8 @@ public class DataReturns {
                         federatedPlatformsRequestBean.getData().getPhoto()
                         , exInfoDTO,
                         federatedPlatformsRequestBean.getData().getQrcode(),
-                        federatedPlatformsRequestBean.getData().getIcNumber());
+                        federatedPlatformsRequestBean.getData().getIcNumber(),
+                        federatedPlatformsRequestBean.getData().getCardIdEx());
                 HttpRequest.getInstance().requestFederatedPlatformsVerify();
             } else {
                 AppLogUtils.e(false, "预检查调度中心-解析完成", "不满足开门条件,isOpen参数不为0,或者数据格式不正确");

+ 1 - 1
app/src/main/java/com/hanghui/senic/common/MTTSManager.java

@@ -116,7 +116,7 @@ public class MTTSManager implements TextToSpeech.OnInitListener {
     @Override
     public void onInit(int status) {
         if (mTTS == null) {
-            mTTS = new TextToSpeech(MyAppliction.getContext(), this);
+            return;
         }
 
         //判断是否转化成功

+ 5 - 2
app/src/main/java/com/hanghui/senic/common/UserInfoManager.java

@@ -36,6 +36,7 @@ public class UserInfoManager {
             userInformationBean.setScenePhoto("");
             userInformationBean.setMobile("");
             userInformationBean.setBitmap(null);
+            userInformationBean.setCardIdEx("");
         }
         return userInformationBean;
     }
@@ -47,16 +48,17 @@ public class UserInfoManager {
         userInformationBean = null;
     }
 
-    public void setUserInformationBean(String name, String idNumber, String IDPhoto, String ScenePhoto, String mobile) {
+    public void setUserInformationBean(String name, String idNumber, String IDPhoto, String ScenePhoto, String mobile,String cardIdEx) {
         userInformationBean = new UserInformationBean();
         userInformationBean.setScenePhoto(ScenePhoto);
         userInformationBean.setName(name);
         userInformationBean.setIdPhoto(IDPhoto);
         userInformationBean.setIdNumber(idNumber);
         userInformationBean.setMobile(mobile);
+        userInformationBean.setCardIdEx(cardIdEx);
     }
 
-    public void setUserInformationBean(String name, String idNumber, String IDPhoto, String ScenePhoto, String mobile, Bitmap bitmap) {
+    public void setUserInformationBean(String name, String idNumber, String IDPhoto, String ScenePhoto, String mobile, Bitmap bitmap,String cardIdEx) {
         userInformationBean = new UserInformationBean();
         userInformationBean.setScenePhoto(ScenePhoto);
         userInformationBean.setName(name);
@@ -64,6 +66,7 @@ public class UserInfoManager {
         userInformationBean.setIdNumber(idNumber);
         userInformationBean.setMobile(mobile);
         userInformationBean.setBitmap(bitmap);
+        userInformationBean.setCardIdEx(cardIdEx);
     }
     /**
      * 更新UserInformationBean的ScenePhoto字段(现场照片)

+ 4 - 4
app/src/main/java/com/hanghui/senic/controller/IDCardController.java

@@ -90,7 +90,7 @@ public abstract class IDCardController extends BaseController {
         String base64Str = idCard.getPhotoBase64();
         String name = idCard.getName();
         String idNumber = idCard.getIdNumber();
-        UserInfoManager.getInstance().setUserInformationBean(name, idNumber, base64Str, "", "");
+        UserInfoManager.getInstance().setUserInformationBean(name, idNumber, base64Str, "", "", "");
         //判断黑名单中是否存在该用户
         if (BlacklistManager.getInstance().isInBlacklist(idNumber,"")){
             //展示了阻止通行结果页,直接return掉,不做后续逻辑处理
@@ -113,7 +113,7 @@ public abstract class IDCardController extends BaseController {
         exInfoDTO.setIdcardContent(ConfigManager.getGson().toJson(idCard));
         //核验接口入参赋值
         ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, idNumber,
-                name, "", "check", "", "", idCard.getPhotoBase64(), exInfoDTO, "", "");
+                name, "", "check", "", "", idCard.getPhotoBase64(), exInfoDTO, "", "", "");
         //SmileController.getInstance().invokeStopVerify();//打断当次刷脸
         BaiduFaceController.getInstance().invokeStopVerify();
         ClickButtonFloatView.getInstance().removeClickButtonFloatView();
@@ -170,7 +170,7 @@ public abstract class IDCardController extends BaseController {
         //保存uid
         AppLogUtils.i(true, "身份证数据处理中心 - 保存东信IC卡", "旧值为:" + idcardUniqueId + " 当前保存值 " + icNumber);
         idcardUniqueId = icNumber;
-        UserInfoManager.getInstance().setUserInformationBean("", icNumber, "", "", "");
+        UserInfoManager.getInstance().setUserInformationBean("", icNumber, "", "", "", "");
         if (sourceid != -1){
             //播放音频,第二个参数为左声道音量;第三个参数为右声道音量;第四个参数为优先级;第五个参数为循环次数,0不循环,-1循环;第六个参数为速率,速率最低0.5最高为2,1代表正常速度
             pool.play(sourceid, 1, 1, 0, 0, 1);
@@ -182,7 +182,7 @@ public abstract class IDCardController extends BaseController {
         exInfoDTO.setIdcardContent("");
         //核验接口入参赋值
         ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, "",
-                "", "", "check", "", "", "", exInfoDTO, "", icNumber);
+                "", "", "check", "", "", "", exInfoDTO, "", icNumber, "");
         //SmileController.getInstance().invokeStopVerify();//打断当次刷脸
         BaiduFaceController.getInstance().invokeStopVerify();
         ClickButtonFloatView.getInstance().removeClickButtonFloatView();

+ 2 - 2
app/src/main/java/com/hanghui/senic/controller/PassportController.java

@@ -260,14 +260,14 @@ public class PassportController extends BaseController {
         if (!StringIsNull.IsStringNull(idCardPassport)) {
             idCard = idCardPassport;
         }
-        UserInfoManager.getInstance().setUserInformationBean(name, idCard, base64Str, "", "");
+        UserInfoManager.getInstance().setUserInformationBean(name, idCard, base64Str, "", "", "");
         FederatedPlatformsRequestBean.ExtInfoDTO exInfoDTO = new FederatedPlatformsRequestBean.ExtInfoDTO();
         exInfoDTO.setPassRes("");
         exInfoDTO.setSmileParams("");
         exInfoDTO.setIdcardContent(obj);
         ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, idCard,
                 name, "", "check", "", "",
-                base64Str, exInfoDTO, "", "");
+                base64Str, exInfoDTO, "", "","");
         ClickButtonFloatView.getInstance().removeClickButtonFloatView();
         SmileController.getInstance().invokeStopVerify();//打断当次刷脸
 

+ 1 - 1
app/src/main/java/com/hanghui/senic/controller/QRCodeController.java

@@ -275,7 +275,7 @@ public class QRCodeController extends BaseController {
         exInfoDTO.setIdcardContent("");
         ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, "",
                 "", "", "check", "", "",
-                "", exInfoDTO, data, "");
+                "", exInfoDTO, data, "","");
         ClickButtonFloatView.getInstance().removeClickButtonFloatView();
         //SmileController.getInstance().invokeStopVerify();
         BaiduFaceController.getInstance().invokeStopVerify();

+ 2 - 2
app/src/main/java/com/hanghui/senic/controller/SmileController.java

@@ -418,7 +418,7 @@ public class SmileController extends BaseController {
                                     exInfoDTO.setIdcardContent("");
                                     ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, "",
                                             "", "", "check", "", "",
-                                            "", exInfoDTO, "", "");
+                                            "", exInfoDTO, "", "","");
                                     if (ConfigManager.isPreCheck()) {//预检查模式
                                         DataReturns.getInstance().doDataReturns(null, s1);
                                         HttpRequest.getInstance().requestFederatedPlatformsCheck(true);
@@ -724,7 +724,7 @@ public class SmileController extends BaseController {
             avatarBase64 = s1JsonObject.getString(SMILE_AVATAR_BASE64);
         }
         //重置UserInformationBean
-        UserInfoManager.getInstance().setUserInformationBean("", "", "", avatarBase64, "");
+        UserInfoManager.getInstance().setUserInformationBean("", "", "", avatarBase64, "", "");
     }
 
     /**

+ 1 - 1
app/src/main/java/com/hanghui/senic/model/MyModel.java

@@ -347,7 +347,7 @@ public class MyModel {
                     @Override
                     public void onError(Throwable e) {
 //                        LogUtils.e(e.toString());
-                        MyAppliction.setAppHeartbeatTime(System.currentTimeMillis());
+                        AppLogUtils.e(false, " 设备状态上报接口 - SetDeviceStateReport", "打印错误信息 " + e.toString());
                     }
 
                     @Override

+ 19 - 16
app/src/main/java/com/hanghui/senic/network/HttpRequest.java

@@ -51,6 +51,7 @@ import com.hanghui.senic.presenter.MyPresenter;
 import com.hanghui.senic.receiver.RebootReceiver;
 import com.hanghui.senic.service.CheckExitService;
 import com.hanghui.senic.service.FilterRepeatDataService;
+import com.hanghui.senic.service.keep.MyJobService;
 import com.hanghui.senic.service.usbserialdemo.utile.ConfigManager;
 import com.hanghui.senic.service.usbserialdemo.utile.DateUtil;
 import com.hanghui.senic.service.usbserialdemo.utile.PopupWindowManager;
@@ -324,7 +325,7 @@ public class HttpRequest {
         baseConfig.setMirrorVideoNIR(ConfigManager.getAuthenticationBeanListBean().getMirrorVideoNIR());
         baseConfig.setMirrorDetectRGB(ConfigManager.getAuthenticationBeanListBean().getMirrorDetectRGB());
         baseConfig.setMirrorDetectNIR(ConfigManager.getAuthenticationBeanListBean().getMirrorDetectNIR());
-        //设置人脸跟随框
+        //设置人脸跟随框是否镜像
         if (ConfigManager.getAuthenticationBeanListBean().getFaceFollowBoxSwitch()){
             baseConfig.setRgbRevert(ConfigManager.getAuthenticationBeanListBean().getRgbRevert());
         }
@@ -645,11 +646,9 @@ public class HttpRequest {
         boolean AutoLaunch = ConfigManager.getAuthenticationBeanListBean().getAutoLaunch();
         SharedPreferencesUtils.setParam(CommonUtil.getCurrentActivity(), "autoLaunch", AutoLaunch);
         if (ConfigManager.getAuthenticationBeanListBean().getAutoLaunch()) {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-                MyAppliction.getContext().startForegroundService(new Intent(MyAppliction.getContext(), CheckExitService.class));
-            } else {
-                MyAppliction.getContext().startService(new Intent(MyAppliction.getContext(), CheckExitService.class));
-            }
+            MyJobService.Companion.StartJob(MyAppliction.getContext());
+        }else{
+            MyJobService.Companion.stopJob(MyAppliction.getContext());
         }
     }
 
@@ -844,7 +843,8 @@ public class HttpRequest {
                 String name = federatedPlatformsResponseBean.getData().getName();
                 String idNumber = federatedPlatformsResponseBean.getData().getIdNumber();
                 String cardPhoto = federatedPlatformsResponseBean.getData().getPhoto();
-                UserInfoManager.getInstance().setUserInformationBean(name, idNumber, cardPhoto, "", "");
+                String cardIdEx = federatedPlatformsResponseBean.getData().getCardIdEx();
+                UserInfoManager.getInstance().setUserInformationBean(name, idNumber, cardPhoto, "", "",cardIdEx);
 
                 FederatedPlatformsRequestBean.ExtInfoDTO exInfoDTO = new FederatedPlatformsRequestBean.ExtInfoDTO();
                 exInfoDTO.setPassRes("");
@@ -853,7 +853,8 @@ public class HttpRequest {
                 ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, idNumber,
                         name, "", "check", "", "",
                         cardPhoto, exInfoDTO, ConfigManager.getFederatedPlatformsRequestBean().getData().getQrcode(),
-                        ConfigManager.getFederatedPlatformsRequestBean().getData().getIcNumber());
+                        ConfigManager.getFederatedPlatformsRequestBean().getData().getIcNumber(),
+                        ConfigManager.getFederatedPlatformsRequestBean().getData().getCardIdEx());
 
                 if (isUsePersonCard()) {
 
@@ -1085,7 +1086,8 @@ public class HttpRequest {
                 String name = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getName());
                 String idNumber = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getIdNumber());
                 String cardPhoto = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getPhoto());
-                UserInfoManager.getInstance().setUserInformationBean(name, idNumber, cardPhoto, "", "");
+                String cardIdEx = StringIsNull.ReturnString(federatedPlatformsResponseBean.getData().getCardIdEx());
+                UserInfoManager.getInstance().setUserInformationBean(name, idNumber, cardPhoto, "", "",cardIdEx);
 
                 FederatedPlatformsRequestBean.ExtInfoDTO exInfoDTO = new FederatedPlatformsRequestBean.ExtInfoDTO();
                 exInfoDTO.setPassRes("");
@@ -1094,7 +1096,8 @@ public class HttpRequest {
                 ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, idNumber,
                         name, "", "check", "", "",
                         cardPhoto, exInfoDTO, ConfigManager.getFederatedPlatformsRequestBean().getData().getQrcode(),
-                        ConfigManager.getFederatedPlatformsRequestBean().getData().getIcNumber());
+                        ConfigManager.getFederatedPlatformsRequestBean().getData().getIcNumber(),
+                        ConfigManager.getFederatedPlatformsRequestBean().getData().getCardIdEx());
 
                 if (isUsePersonCard()) {
 
@@ -1256,7 +1259,7 @@ public class HttpRequest {
                 }
                 UserInfoManager.getInstance().setUserInformationBean(alipayUserInfoBean.getData().getUserName(),
                         alipayUserInfoBean.getData().getCertNo(), "",
-                        Base64, alipayUserInfoBean.getData().getMobile());
+                        Base64, alipayUserInfoBean.getData().getMobile(),"");
                 //判断年龄限制是否打开
                 if (ConfigManager.isAgeLimitOpen(StringIsNull.ReturnString(alipayUserInfoBean.getData().getCertNo()))) {
                     return;
@@ -1274,7 +1277,7 @@ public class HttpRequest {
                         StringIsNull.ReturnString(alipayUserInfoBean.getData().getUserName()),
                         StringIsNull.ReturnString(alipayUserInfoBean.getData().getMobile()),
                         "", "", "",
-                        alipayUserInfoBean.getData().getPhotoBase64(), exInfoDTO, "", "");
+                        alipayUserInfoBean.getData().getPhotoBase64(), exInfoDTO, "", "","");
                 //判断核验接口是否开启
                 if (ConfigManager.isLinkagePlatformClose()) {
                     return;
@@ -1355,7 +1358,7 @@ public class HttpRequest {
                 }
                 UserInfoManager.getInstance().setUserInformationBean(alipayUserInfoBean.getData().getUserName(),
                         alipayUserInfoBean.getData().getCertNo(), alipayUserInfoBean.getData().getPhotoBase64(),
-                        Base64, alipayUserInfoBean.getData().getMobile());
+                        Base64, alipayUserInfoBean.getData().getMobile(),"");
 
 //                //判断年龄限制是否打开
 //                if (ConfigManager.isAgeLimitOpen(StringIsNull.ReturnString(alipayUserInfoBean.getData().getCertNo()))) {
@@ -1374,7 +1377,7 @@ public class HttpRequest {
                         StringIsNull.ReturnString(alipayUserInfoBean.getData().getUserName()),
                         StringIsNull.ReturnString(alipayUserInfoBean.getData().getMobile()),
                         "", "", "",
-                        alipayUserInfoBean.getData().getPhotoBase64(), exInfoDTO, "", "");
+                        alipayUserInfoBean.getData().getPhotoBase64(), exInfoDTO, "", "","");
                 //记录上报
                 String Photo = UserInfoManager.getInstance().getUserInformationBean().getScenePhoto();
                 if (StringIsNull.IsStringNull(Photo)) {
@@ -1463,7 +1466,7 @@ public class HttpRequest {
                 String cardPhoto = StringIsNull.ReturnString(specialCodeTradeThreeElementsBean.getData().getPhotoBase64());
                 String phone = StringIsNull.ReturnString(specialCodeTradeThreeElementsBean.getData().getPhone());
                 //保存用户信息
-                UserInfoManager.getInstance().setUserInformationBean(name, idNumber, cardPhoto, "", phone);
+                UserInfoManager.getInstance().setUserInformationBean(name, idNumber, cardPhoto, "", phone,"");
 
                 //判断黑名单中是否存在该用户
                 if (BlacklistManager.getInstance().isInBlacklist(idNumber, phone)) {
@@ -1483,7 +1486,7 @@ public class HttpRequest {
                 exInfoDTO.setPassRes("");
                 exInfoDTO.setSmileParams("");
                 exInfoDTO.setIdcardContent("");
-                ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, idNumber, name, phone, "", "", "", cardPhoto, exInfoDTO, qrCode, "");
+                ConfigManager.setFederatedPlatformsRequestBean(ConfigManager.SN, Constants.IDCARD_TYPE, idNumber, name, phone, "", "", "", cardPhoto, exInfoDTO, qrCode, "","");
 
                 //核验接口请求
                 if (ConfigManager.isPreCheck()) {//预检查模式下,同时去请求核验接口结果页数据

+ 1 - 2
app/src/main/java/com/hanghui/senic/presenter/MyPresenter.java

@@ -30,12 +30,11 @@ import java.util.Map;
 
 public class MyPresenter<T> implements ContractInterface.PAuthentication, ContractInterface.PParameterConfiguration,
         ContractInterface.PDevice, ContractInterface.PLogUploads, ContractInterface.PUserwithftoken {
-    T tt;
+
     MyModel myModel;
 
     public MyPresenter(T t) {
         myModel = new MyModel();
-        this.tt = t;
     }
 
     @Override

+ 17 - 5
app/src/main/java/com/hanghui/senic/receiver/NetBroadcastReceiver.java

@@ -6,6 +6,7 @@ import android.content.Intent;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 
+import com.hanghui.senic.common.AppHandler;
 import com.hanghui.senic.common.Constants;
 import com.hanghui.senic.network.HttpRequest;
 import com.hanghui.senic.service.usbserialdemo.utile.ConfigManager;
@@ -20,17 +21,28 @@ public class NetBroadcastReceiver extends BroadcastReceiver {
         AppLogUtils.i(false, "NetBroadcastReceiver", "networkInfo=" + networkInfo);
         if (networkInfo != null) {
             AppLogUtils.e(false, "", "广播返回网络正常后销毁悬浮框 ");
-            PopupWindowManager.getInstance().dismissNetWorkpopupWindow();
-            netNetworkCallback.updateView(Constants.Code_internetAvailable, "网络恢复");
+            AppHandler.getHandler().post(new Runnable() {
+                @Override
+                public void run() {
+                    PopupWindowManager.getInstance().dismissNetWorkpopupWindow();
+                    netNetworkCallback.updateView(Constants.Code_internetAvailable, "网络恢复");
+                }
+            });
+
             if (!ConfigManager.isConfigRequestSuccess) {
                 HttpRequest.getInstance().postRequestConfigRunnable(2 * 1000);
             }
         } else {
             AppLogUtils.e(false, "", "广播获取到网络异常 悬浮框展示");
-            PopupWindowManager.showFloatIfNoNetwork();
-            ConfigManager.isUpdateConfig = true;
-            netNetworkCallback.updateView(Constants.Code_internetUnAvailable, "网络异常");
 
+            AppHandler.getHandler().post(new Runnable() {
+                @Override
+                public void run() {
+                    PopupWindowManager.showFloatIfNoNetwork();
+                    ConfigManager.isUpdateConfig = true;
+                    netNetworkCallback.updateView(Constants.Code_internetUnAvailable, "网络异常");
+                }
+            });
         }
 
     }

+ 11 - 7
app/src/main/java/com/hanghui/senic/service/InternetCheckService.java

@@ -11,7 +11,6 @@ import com.hanghui.senic.common.AppHandler;
 import com.hanghui.senic.common.Constants;
 import com.hanghui.senic.common.ThreadPoolManager;
 import com.hanghui.senic.service.usbserialdemo.utile.NetWorkUtils;
-import com.hanghui.senic.service.usbserialdemo.utile.PopupWindowManager;
 
 
 /**
@@ -27,12 +26,17 @@ public class InternetCheckService extends Service {
                     @Override
                     public void run() {
                         boolean isNetwork = NetWorkUtils.isNetwork();
-                        if (isNetwork){
-                            PopupWindowManager.getInstance().dismissNetWorkpopupWindow();
-                            internetCheckServiceCallback.updateView(Constants.Code_internetAvailable,"网络正常");
-                        }else {
-                            internetCheckServiceCallback.updateView(Constants.Code_internetUnAvailable,"网络异常");
-                        }
+                        AppHandler.getHandler().post(new Runnable() {
+                            @Override
+                            public void run() {
+                                if (isNetwork){
+                                    internetCheckServiceCallback.updateView(Constants.Code_internetAvailable,"网络正常");
+                                }else {
+                                    internetCheckServiceCallback.updateView(Constants.Code_internetUnAvailable,"网络异常");
+                                }
+                            }
+                        });
+
                     }
                 });
             } catch (Exception e) {

+ 1 - 1
app/src/main/java/com/hanghui/senic/service/RegularReportingService.java

@@ -56,7 +56,7 @@ public class RegularReportingService extends Service {
             // TODO Auto-generated method stub
             //要做的事情,这里再次调用此Runnable对象,以实现每两秒实现一次的定时器操作
             RegularReporting();
-            AppHandler.getHandler().postDelayed(this, 30 * 1000);//30s上报一次设备状态
+            AppHandler.getHandler().postDelayed(this, 15 * 1000);//30s上报一次设备状态
         }
     };
 

+ 83 - 0
app/src/main/java/com/hanghui/senic/service/keep/JobUtils.kt

@@ -0,0 +1,83 @@
+package com.hh.arome.services.keeplive
+
+import android.app.ActivityManager
+import android.content.Context
+import android.text.TextUtils
+import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.Lifecycle
+import com.hanghui.senic.service.usbserialdemo.utile.loacat.AppLogUtils
+
+
+class JobUtils{
+    companion object{
+
+        fun isRunningService(context: Context, name: String?): Boolean {
+            val am =
+                context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+            val runningServices =
+                am.getRunningServices(100)
+            for (info in runningServices) {
+                if (TextUtils.equals(info.service.className, name)) {
+                    return true
+                }
+            }
+            return false
+        }
+
+
+        fun isActivityDestroyed(context: Context, isRunningActivityName: String?): Boolean {
+
+            val activityNames = getRunningActivities(context)
+            for (activityName in activityNames) {
+                // 获取Activity的类名
+                if (TextUtils.equals(activityName, isRunningActivityName)) {
+                    return false
+                }
+            }
+            return true
+
+        }
+
+
+        fun getRunningActivities(context: Context): List<String?> {
+            val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
+            // getRunningTasks()方法在Android Lollipop(API 21)以后已经弃用
+            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
+                // (API 21)及以后
+                // 注意:此方法需要`android.permission.GET_TASKS`权限
+                val tasks = activityManager.getAppTasks()
+                val activityNames = tasks.map { task ->
+                    task.taskInfo.baseActivity?.className
+                }
+
+                return activityNames
+            } else {
+                // 对于Android Lollipop以前的版本
+                val tasks = activityManager.getRunningTasks(Integer.MAX_VALUE)
+                val activityNames = tasks.map { task ->
+                    task.topActivity?.className
+                }
+
+                for (activityName in activityNames) {
+                    // 获取Activity的类名
+                    AppLogUtils.i(false,"getRunningActivities","activityName--"+activityName.toString())
+                }
+
+                return activityNames
+            }
+        }
+
+
+
+        fun isActivityDestroyed(activity: AppCompatActivity): Boolean {
+            val currentState = activity.lifecycle.currentState
+            if(currentState == Lifecycle.State.DESTROYED){
+                return true
+            }else{
+                return false
+            }
+        }
+
+    }
+
+}

+ 118 - 0
app/src/main/java/com/hanghui/senic/service/keep/MyJobService.kt

@@ -0,0 +1,118 @@
+package com.hanghui.senic.service.keep
+
+import android.app.job.JobInfo
+import android.app.job.JobParameters
+import android.app.job.JobScheduler
+import android.app.job.JobService
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
+import android.os.Build
+import androidx.annotation.RequiresApi
+import com.hanghui.senic.activity.PassWordActivity
+import com.hanghui.senic.baiduface.BaiduFacePreviewActivity
+import com.hanghui.senic.service.usbserialdemo.utile.loacat.AppLogUtils
+import com.hh.arome.services.keeplive.JobUtils
+import java.util.concurrent.Future
+
+
+@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
+class MyJobService :JobService(){
+    
+    private var future: Future<*>? = null
+    
+    companion object{
+        val TAG = "MyJobService"
+
+        @Volatile
+        var  isWorking=false;
+
+        fun StartJob(context: Context) {
+            isWorking=true
+            val jobScheduler =
+                context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
+            //        setPersisted 在设备重启依然执行
+            val builder = JobInfo.Builder(
+                10, ComponentName(
+                    context
+                        .getPackageName(), MyJobService::class.java
+                        .name
+                )
+            ).setPersisted(true)
+            //小于7.0
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
+                // 每隔1s 执行一次 job
+                builder.setPeriodic(1000)
+            } else {
+                //延迟执行任务
+                //大于7.0的机型发现定时无效果,所需需要进行延时轮询
+                builder.setMinimumLatency(1000)
+            }
+            jobScheduler.schedule(builder.build())
+        }
+        
+        /**
+         *
+         * @author xwh
+         * Time 2024/11/4
+         * Description: 停止任务
+         *
+        **/
+        fun stopJob(context: Context) {
+            isWorking = false
+            val jobScheduler =
+                context.getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
+            jobScheduler.cancelAll()
+            ThreadPoolManager.getInstance().shutdownExecutor()
+
+        }
+    }
+
+
+    override fun onStopJob(params: JobParameters?): Boolean {
+        return false
+    }
+
+    override fun onStartJob(params: JobParameters?): Boolean {
+        if (future != null && !future!!.isDone) {
+            return false
+        }
+        future = ThreadPoolManager.getInstance().cpuSubmit {
+            //如果7.0以上 轮训
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                StartJob(this)
+            }
+
+            val isActivityDestroyed: Boolean = JobUtils.isActivityDestroyed(
+                this,
+                BaiduFacePreviewActivity::class.java.name
+            )
+
+            val isPassWordActivityDestroyed: Boolean = JobUtils.isActivityDestroyed(
+                this,
+                PassWordActivity::class.java.name
+            )
+            if(!isPassWordActivityDestroyed){
+                return@cpuSubmit
+            }
+            if (isActivityDestroyed && isWorking) {
+                AppLogUtils.i(true,"onStartJob","onStartJob->重启 BaiduFacePreviewActivity")
+                val intent = Intent(this, BaiduFacePreviewActivity::class.java)
+                intent.addFlags(FLAG_ACTIVITY_NEW_TASK)
+                startActivity(intent)
+            }
+
+        }
+
+
+
+
+        return false
+    }
+
+
+    override fun onDestroy() {
+        super.onDestroy()
+    }
+}

+ 163 - 0
app/src/main/java/com/hanghui/senic/service/keep/ThreadPoolManager.java

@@ -0,0 +1,163 @@
+package com.hanghui.senic.service.keep;
+
+import android.os.Process;
+
+import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Date: 2022/5/17 0017 10:22
+ * Description:
+ */
+public class ThreadPoolManager {
+
+    // CPU核心数
+    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
+    /**
+     * 核心线程数
+     * -1 是考虑到某一个核心线程数出现意外不可用
+     * Math.max保证最少核心线程数有2个
+     */
+    private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
+//    private static final int CORE_POOL_SIZE =  CPU_COUNT + 1;
+    /**
+     * 最大线程数
+     * 理论上来说不需要+1或者-1,一个核心对应一个线程最好,但是实际上会有种种原因导致核心的利用不是那么完全,比如有任务被挂起,那这个核心就会空闲下来,所以设置+1,是为了提高核心的利用率
+     * 如果设置成-1会怎么样,假如只有一个核心呢?那-1就成0了,很显然无论如何也不应该-1
+     */
+    private static final int MAX_POOL_SIZE = CPU_COUNT * 2 + 1;
+    // 阻塞任务队列容量
+    private static final int QUEUE_CAPACITY = 64;
+    // 等待时间
+    private static final int KEEP_ALIVE_TIME = 30;
+
+    // CPU型线程池
+    private ThreadPoolExecutor cpuExecutor = new ThreadPoolExecutor(
+            CPU_COUNT,
+            CPU_COUNT,
+            KEEP_ALIVE_TIME,
+            TimeUnit.SECONDS,
+            new LinkedBlockingDeque<Runnable>(QUEUE_CAPACITY),
+            mThreadFactory);
+
+    // IO型线程池
+    private ThreadPoolExecutor iOExecutor = new ThreadPoolExecutor(
+            CORE_POOL_SIZE,
+            MAX_POOL_SIZE,
+            KEEP_ALIVE_TIME,
+            TimeUnit.SECONDS,
+            new LinkedBlockingDeque<Runnable>(QUEUE_CAPACITY),
+            mThreadFactory);
+
+    // 线程工厂
+    private static final ThreadFactory mThreadFactory = new ThreadFactory() {
+        private final AtomicInteger mCount = new AtomicInteger(1);
+
+        @Override
+        public Thread newThread(Runnable r) {
+            // 设置线程名字
+            Thread thread = new Thread(r, "ThreadPoolManager #" + mCount.getAndIncrement());
+            // 设置线程优先级
+            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+            return thread;
+        }
+    };
+
+
+    /**
+     * 单例设计模式(饿汉式)
+     * 单例首先私有化构造方法,然后饿汉式一开始就开始创建,并提供get方法
+     */
+    private static ThreadPoolManager mInstance = new ThreadPoolManager();
+
+    public static ThreadPoolManager getInstance() {
+        return mInstance;
+    }
+
+    /**
+     * 执行IO任务
+     */
+    public void executeIOTask(Runnable runnable) {
+        if (runnable == null) {
+            return;
+        }
+        iOExecutor.execute(runnable);
+    }
+
+    /**
+     * 移除IO任务
+     */
+    public void removeIOTask(Runnable runnable) {
+        if (runnable == null) {
+            return;
+        }
+        iOExecutor.remove(runnable);
+    }
+
+    /**
+     * 执行CPU任务
+     */
+    public void executeCpuTask(Runnable runnable) {
+        if (runnable == null) {
+            return;
+        }
+        cpuExecutor.execute(runnable);
+    }
+
+    /**
+     * 移除CPU任务
+     */
+    public void removeCpuTask(Runnable runnable) {
+        if (runnable == null) {
+            return;
+        }
+        cpuExecutor.remove(runnable);
+    }
+
+    /**
+     *
+     * @author xwh
+     * Time 2024/11/4
+     * Description: 提交CPU任務
+     *
+    **/
+    public Future<?> cpuSubmit(Runnable task) {
+        if (cpuExecutor == null || task == null) {
+            return null;
+        }
+        return cpuExecutor.submit(task);
+    }
+
+    /**
+     *
+     * @author xwh
+     * Time 2024/11/4
+     * Description: 提交IO任務
+     *
+    **/
+    public Future<?> ioSubmit(Runnable task) {
+        if (iOExecutor == null || task == null) {
+            return null;
+        }
+        return iOExecutor.submit(task);
+    }
+    /**
+     * 停止线程池
+     */
+    public void shutdownExecutor() {
+        if (cpuExecutor != null) {
+            cpuExecutor.shutdown();
+            cpuExecutor.shutdownNow();
+        }
+        if (iOExecutor != null) {
+            iOExecutor.shutdown();
+            iOExecutor.shutdownNow();
+        }
+    }
+
+}
+

+ 1 - 1
app/src/main/java/com/hanghui/senic/service/usbserialdemo/AppDns.java

@@ -42,7 +42,7 @@ public class AppDns implements Dns {
                         new UnknownHostException("Broken system behaviour for dns lookup of " + hostname);
                 unknownHostException.initCause(e);
 
-                AppLogUtils.e(true, "域名解析异常", "dns 域名解析异常, hostname: " + hostname + " ,error:" + e.getMessage());
+                AppLogUtils.e(false, "域名解析异常", "dns 域名解析异常, hostname: " + hostname + " ,error:" + e.getMessage());
 
                 throw unknownHostException;
             }

+ 2 - 1
app/src/main/java/com/hanghui/senic/service/usbserialdemo/utile/ConfigManager.java

@@ -801,7 +801,7 @@ public class ConfigManager {
     }
 
     public static FederatedPlatformsRequestBean setFederatedPlatformsRequestBean(String sn, int Verifytype, String Cardid, String Name, String Phone, String Action
-            , String TaskId, String Value, String photo, FederatedPlatformsRequestBean.ExtInfoDTO exInfoDTO, String Qrcode, String icNumber) {
+            , String TaskId, String Value, String photo, FederatedPlatformsRequestBean.ExtInfoDTO exInfoDTO, String Qrcode, String icNumber,String cardIdEx) {
         if (!ConfigManager.isPreCheck()) {//通用模式下action为checkVerify
             Action = "checkVerify";
         }
@@ -840,6 +840,7 @@ public class ConfigManager {
         dataDTO.setPhoto(photo);
         dataDTO.setExInfo(exInfoDTO);
         dataDTO.setIcNumber(icNumber);
+        dataDTO.setCardIdEx(cardIdEx);
         federatedPlatformsRequestBean.setData(dataDTO);
         return federatedPlatformsRequestBean;
     }

+ 3 - 3
app/src/main/java/com/hanghui/senic/service/usbserialdemo/utile/NetWorkUtils.java

@@ -45,9 +45,9 @@ public class NetWorkUtils {
      */
     public static boolean isNetwork(){
         try {
-            URL url = new URL("https://www.baidu.com");
+            URL url = new URL("http://www.baidu.com");
             HttpURLConnection connection = (HttpURLConnection) url.openConnection();
-            connection.setRequestMethod("HEAD");
+            connection.setRequestMethod("GET");
             connection.setConnectTimeout(3 * 1000);
             int responseCode = connection.getResponseCode();
             return responseCode == HttpURLConnection.HTTP_OK;
@@ -75,7 +75,7 @@ public class NetWorkUtils {
                 return R.mipmap.network_icon_mobile;
             }
         }
-        return -1;
+        return 0;
     }
 
 }

+ 30 - 0
app/src/main/java/com/hanghui/senic/utils/GetJsonDataUtil.java

@@ -0,0 +1,30 @@
+package com.hanghui.senic.utils;
+
+import android.content.Context;
+import android.content.res.AssetManager;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class GetJsonDataUtil {
+
+
+    public String getJson(Context context, String fileName) {
+
+        StringBuilder stringBuilder = new StringBuilder();
+        try {
+            AssetManager assetManager = context.getAssets();
+            BufferedReader bf = new BufferedReader(new InputStreamReader(
+                    assetManager.open(fileName)));
+            String line;
+            while ((line = bf.readLine()) != null) {
+                stringBuilder.append(line);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return stringBuilder.toString();
+    }
+
+}

+ 3 - 0
app/src/main/java/com/hanghui/senic/utils/ImageLoaderUtils.java

@@ -28,6 +28,9 @@ public class ImageLoaderUtils {
         if(imageView ==null){
             return;
         }
+        if(imageView.getContext() instanceof Activity && ((Activity) imageView.getContext()).isFinishing()){
+            return;
+        }
         Glide.with(imageView.getContext()).load(colorResId).into(imageView);
     }
     public static void loadImage(Object imageUrl, ImageView imageView, BaseRequestOptions requestOptions ){

+ 208 - 0
app/src/main/res/layout/activity_personnel_data.xml

@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    tools:context=".activity.setup.PersonnelDataActivity">
+
+    <include layout="@layout/setup_incloud" />
+    <!--查询条件-->
+    <LinearLayout
+        android:id="@+id/personnelData_queryCondition_Linear"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_244"
+        android:layout_marginLeft="@dimen/dp_32"
+        android:layout_marginRight="@dimen/dp_32"
+        android:layout_marginTop="@dimen/dp_24"
+        android:orientation="vertical"
+        android:visibility="gone">
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:orientation="horizontal">
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_weight="1"
+                android:layout_height="match_parent"
+                android:orientation="vertical">
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="ID:"
+                    android:textSize="@dimen/dp_26"
+                    android:layout_marginLeft="@dimen/dp_16"
+                    android:textColor="@color/f233554"/>
+                <EditText
+                    android:id="@+id/personnelData_inputID"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:hint="输入ID"
+                    android:textSize="@dimen/dp_26"
+                    android:paddingLeft="@dimen/dp_16"
+                    android:background="@drawable/backlist_input_bg"/>
+            </LinearLayout>
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_weight="1"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="@dimen/dp_36"
+                android:orientation="vertical">
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="姓名:"
+                    android:textSize="@dimen/dp_26"
+                    android:layout_marginLeft="@dimen/dp_16"
+                    android:textColor="@color/f233554"/>
+                <EditText
+                    android:id="@+id/personnelData_inputName"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:hint="输入姓名"
+                    android:textSize="@dimen/dp_26"
+                    android:paddingLeft="@dimen/dp_16"
+                    android:background="@drawable/backlist_input_bg"/>
+            </LinearLayout>
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:orientation="horizontal">
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_weight="1"
+                android:layout_height="match_parent"
+                android:orientation="vertical">
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="卡号:"
+                    android:textSize="@dimen/dp_26"
+                    android:layout_marginLeft="@dimen/dp_16"
+                    android:textColor="@color/f233554"/>
+                <EditText
+                    android:id="@+id/personnelData_inputCardNumber"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:hint="输入卡号"
+                    android:textSize="@dimen/dp_26"
+                    android:paddingLeft="@dimen/dp_16"
+                    android:background="@drawable/backlist_input_bg"/>
+            </LinearLayout>
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_weight="1"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="@dimen/dp_36"
+                android:orientation="vertical">
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="证件号:"
+                    android:layout_marginLeft="@dimen/dp_16"
+                    android:textSize="@dimen/dp_26"
+                    android:textColor="@color/f233554"/>
+                <EditText
+                    android:id="@+id/personnelData_inputIdNumber"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:hint="输入证件号"
+                    android:textSize="@dimen/dp_26"
+                    android:paddingLeft="@dimen/dp_16"
+                    android:background="@drawable/backlist_input_bg"/>
+            </LinearLayout>
+        </LinearLayout>
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:layout_marginTop="@dimen/dp_16"
+            android:orientation="horizontal">
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_weight="1"
+                android:layout_height="match_parent"
+                android:orientation="vertical">
+                <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="手机号:"
+                    android:layout_marginLeft="@dimen/dp_16"
+                    android:textSize="@dimen/dp_26"
+                    android:textColor="@color/f233554"/>
+                <EditText
+                    android:id="@+id/personnelData_inputPhone"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:hint="输入手机号"
+                    android:textSize="@dimen/dp_26"
+                    android:paddingLeft="@dimen/dp_16"
+                    android:background="@drawable/backlist_input_bg"/>
+            </LinearLayout>
+            <LinearLayout
+                android:layout_width="0dp"
+                android:layout_weight="1"
+                android:layout_height="match_parent"
+                android:layout_marginLeft="@dimen/dp_36"
+                android:orientation="horizontal">
+                <TextView
+                    android:id="@+id/personnelData_input_empty"
+                    android:layout_width="0dp"
+                    android:layout_weight="1"
+                    android:layout_height="match_parent"
+                    android:layout_marginTop="@dimen/dp_39"
+                    android:text="清空"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/dp_26"
+                    android:gravity="center"
+                    android:background="@drawable/backlist_input_empty"/>
+                <TextView
+                    android:id="@+id/personnelData_input_search"
+                    android:layout_width="0dp"
+                    android:layout_weight="1"
+                    android:layout_height="match_parent"
+                    android:layout_marginTop="@dimen/dp_39"
+                    android:text="搜索"
+                    android:layout_marginLeft="@dimen/dp_30"
+                    android:textSize="@dimen/dp_26"
+                    android:gravity="center"
+                    android:textColor="@color/white"
+                    android:background="@drawable/backlist_input_search"/>
+            </LinearLayout>
+        </LinearLayout>
+    </LinearLayout>
+    <!--点击后展示查询条件页面-->
+    <LinearLayout
+        android:id="@+id/personnelData_inquire"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_75"
+        android:orientation="horizontal"
+        android:gravity="center">
+        <ImageView
+            android:id="@+id/personnelData_inquireImage"
+            android:layout_width="@dimen/dp_23"
+            android:layout_height="@dimen/dp_23"
+            android:background="@mipmap/blacklist_inquireimage_down_arrow"/>
+        <TextView
+            android:id="@+id/personnelData_inquireText"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="查询"
+            android:padding="@dimen/dp_5"
+            android:textSize="@dimen/dp_26"
+            android:textColor="@color/fF3F4F6" />
+    </LinearLayout>
+    <!--列表展示-->
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/personnelData_RecyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginLeft="@dimen/dp_20"
+        android:layout_marginRight="@dimen/dp_20"/>
+
+</LinearLayout>

+ 126 - 0
app/src/main/res/layout/personneldata_adapter.xml

@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/dp_208"
+    android:orientation="vertical">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="horizontal"
+        android:layout_marginTop="@dimen/dp_24"
+        android:layout_marginBottom="@dimen/dp_24"
+        android:layout_marginLeft="@dimen/dp_32"
+        android:layout_marginRight="@dimen/dp_32">
+        <ImageView
+            android:id="@+id/personnelDataAdapter_titleImage"
+            android:layout_width="@dimen/dp_160"
+            android:layout_height="@dimen/dp_160"
+            android:src="@mipmap/personneldataadapter_title"/>
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:orientation="vertical"
+            android:gravity="center_vertical"
+            android:layout_toRightOf="@+id/personnelDataAdapter_titleImage"
+            android:layout_marginLeft="@dimen/dp_28">
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="   I D: "
+                    android:textSize="@dimen/dp_28"
+                    android:textColor="@color/f4E8FFF"/>
+                <TextView
+                    android:id="@+id/personnelDataAdapter_ID"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/f233554"
+                    android:textSize="@dimen/dp_28"/>
+            </LinearLayout>
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="姓名: "
+                    android:textSize="@dimen/dp_28"
+                    android:textColor="@color/f4E8FFF"/>
+                <TextView
+                    android:id="@+id/personnelDataAdapter_name"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/f233554"
+                    android:textSize="@dimen/dp_28"/>
+            </LinearLayout>
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="卡号: "
+                    android:textSize="@dimen/dp_28"
+                    android:textColor="@color/f4E8FFF"/>
+                <TextView
+                    android:id="@+id/personnelDataAdapter_cardNumber"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/f233554"
+                    android:textSize="@dimen/dp_28"/>
+            </LinearLayout>
+        </LinearLayout>
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:orientation="vertical"
+            android:gravity="center_vertical"
+            android:layout_marginLeft="@dimen/dp_28">
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="证件号: "
+                    android:textSize="@dimen/dp_28"
+                    android:textColor="@color/f4E8FFF"/>
+                <TextView
+                    android:id="@+id/personnelDataAdapter_idNumber"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/f233554"
+                    android:textSize="@dimen/dp_26"/>
+            </LinearLayout>
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="手机号: "
+                    android:textSize="@dimen/dp_28"
+                    android:textColor="@color/f4E8FFF"/>
+                <TextView
+                    android:id="@+id/personnelDataAdapter_phone"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/f233554"
+                    android:textSize="@dimen/dp_26"/>
+            </LinearLayout>
+        </LinearLayout>
+
+    </LinearLayout>
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="@color/fdddddd"
+        android:layout_alignParentBottom="true"/>
+</RelativeLayout>

+ 15 - 6
app/src/main/res/layout/window_outcome_floating_pages.xml

@@ -371,8 +371,7 @@
                 android:id="@+id/OutcomeActivity_Outcome"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:orientation="vertical"
-                android:visibility="gone">
+                android:orientation="vertical">
 
                 <LinearLayout
                     android:layout_width="match_parent"
@@ -403,7 +402,7 @@
                         android:layout_height="wrap_content"
                         android:layout_marginLeft="@dimen/dp_42"
                         android:layout_marginRight="@dimen/dp_42"
-                        android:layout_marginBottom="@dimen/dp_7"
+                        android:layout_marginBottom="@dimen/dp_10"
                         android:background="@drawable/outcome_masked_white">
 
                         <LinearLayout
@@ -441,7 +440,7 @@
                                 android:gravity="left"
                                 android:text=""
                                 android:textColor="@color/f324360"
-                                android:textSize="@dimen/dp_50"
+                                android:textSize="@dimen/idCardTextSize"
                                 android:textStyle="bold" />
 
                             <TextView
@@ -466,15 +465,24 @@
                                 android:textSize="@dimen/idCardTextSize"
                                 android:textStyle="bold" />
                         </LinearLayout>
+                        <View
+                            android:id="@+id/OutcomeActivity_OutcomeButtonViewBg"
+                            android:layout_width="match_parent"
+                            android:layout_height="@dimen/dp_50"
+                            android:background="@color/white"
+                            android:layout_below="@+id/OutcomeActivity_OutcomeImage"
+                            android:visibility="gone"/>
 
                         <LinearLayout
+                            android:id="@+id/OutcomeActivity_OutcomeButtonLinear"
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
                             android:layout_below="@+id/OutcomeActivity_OutcomeImage"
                             android:layout_marginLeft="@dimen/dp_42"
                             android:layout_marginTop="@dimen/dp_36"
                             android:layout_marginBottom="@dimen/dp_24"
-                            android:orientation="horizontal">
+                            android:orientation="horizontal"
+                            android:visibility="gone">
 
                             <LinearLayout
                                 android:layout_width="0dp"
@@ -827,7 +835,8 @@
                 android:id="@+id/OutcomeActivity_statusPending"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginBottom="@dimen/dp_15">
+                android:layout_marginBottom="@dimen/dp_15"
+                android:visibility="gone">
 
                 <LinearLayout
                     android:layout_width="match_parent"

BIN
app/src/main/res/mipmap-xhdpi/personneldata_image.png


BIN
app/src/main/res/mipmap-xhdpi/personneldataadapter_title.png


+ 2 - 2
app/src/main/res/values/strings.xml

@@ -27,9 +27,9 @@
 
     <!-- 百度人脸版的人脸特征数据 -->
     <!-- 测试地址 -->
-<!--    <string name="hhface_baidu_face_data">wss://test.hz-hanghui.com:18890/hhfacews?</string>-->
+    <!--    <string name="hhface_baidu_face_data">wss://test.hz-hanghui.com:18890/hhfacews?</string>-->
     <!-- 正式地址 -->
-<!--    <string name="hhface_baidu_face_data">wss://hhomc.hz-hanghui.com:18096/hhfacews?</string>-->
+    <!--    <string name="hhface_baidu_face_data">wss://hhomc.hz-hanghui.com:18096/hhfacews?</string>-->
 
     <!-- 本地黑名单配置-->
     <string name="url_Local_Blacklist_Config">https://tx.hz-hanghui.com:8088/hanghui-server-platform/api/v1/open/device/blacklist/query</string>

+ 1 - 0
build.gradle

@@ -14,6 +14,7 @@ buildscript {
 //        classpath "com.android.tools.build:gradle:3.4.3"
         // NOTE: Do not place your application dependencies here; they belong
         classpath "com.github.kezong:fat-aar:1.3.8"
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72"
 
     }
 }

+ 1 - 1
datalibrary/src/main/java/com/example/datalibrary/factory/specific/FeatureBuilder.java

@@ -34,7 +34,7 @@ public class FeatureBuilder extends ModelBuilder<FaceFeature> {
         faceSearch.setInputDBListener(new FaceSearch.InputDBListener() {
             @Override
             public void onInputDB(int i, int i1) {
-                Log.e("face_feature_db_add" , i + " " + i1);
+               // Log.e("face_feature_db_add" , i + " " + i1);
             }
         });
         faceSearch.setMaxUpdateSize(10);

+ 2 - 15
datalibrary/src/main/java/com/example/datalibrary/gatecamera/CameraPreviewManager.java

@@ -213,28 +213,15 @@ public class CameraPreviewManager implements SurfaceHolder.Callback , TextureVie
             mCamera.setParameters(params);
             if (mTextureView != null){
                 try {
-                    byte[] buffer=new byte[460800];
-                    mCamera.addCallbackBuffer(buffer);
-                    mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
+                    mCamera.setPreviewCallback(new Camera.PreviewCallback() {
                         @Override
                         public void onPreviewFrame(byte[] bytes, Camera camera) {
-                            if(camera!=null) {
-                                camera.addCallbackBuffer(bytes);
-                                if (mCameraDataCallback != null) {
+                          if (mCameraDataCallback != null) {
                                     mCameraDataCallback.onGetCameraData(bytes, camera,
                                             videoWidth, videoHeight);
                                 }
-                            }
                         }
                     });
-
-                    /*mCamera.setPreviewCallback(new Camera.PreviewCallback() {
-                        @Override
-                        public void onPreviewFrame(byte[] bytes, Camera camera) {
-                          //  Log.i("______456","rgb摄像头预览数据"+bytes.length);
-
-                        }
-                    });*/
                     mCamera.setPreviewTexture(mSurfaceTexture);
 
                     mCamera.startPreview();

+ 60 - 55
datalibrary/src/main/java/com/example/datalibrary/manager/FaceSDKManager.java

@@ -73,8 +73,8 @@ public class FaceSDKManager {
     private Future future3;
     private Future future4;
     private Future future5; //nir 补光灯判断线程逻辑
+    private volatile long nirFillLightStartTime = 0L; //红外补光灯计时:开始时间
 
-    private volatile int nirLightCount=0;
 
     private float[] scores;
     private ImageIllum imageIllum;
@@ -88,6 +88,7 @@ public class FaceSDKManager {
     private long trackTime;
     private FaceModel faceModel;
 
+
     private FaceSDKManager() {
         faceAuth = new FaceAuth();
         faceAuth.setCoreConfigure(BDFaceSDKCommon.BDFaceCoreRunMode.BDFACE_LITE_POWER_NO_BIND, 2);
@@ -248,7 +249,7 @@ public class FaceSDKManager {
     }
 
     public void emptyFrame() {
-        EventBus.getDefault().post(new LedLightEvent(false,5000));
+        EventBus.getDefault().post(new LedLightEvent(false, 5000));
         failNumber = 0;
         faceId = 0;
         isFail = false;
@@ -345,9 +346,9 @@ public class FaceSDKManager {
         if (!FaceSDKManager.initModelSuccess) {
             return;
         }
-        future = es.submit(new Runnable() {
-            @Override
-            public void run() {
+//        future = es.submit(new Runnable() {
+//            @Override
+//            public void run() {
                 long startTime = System.currentTimeMillis();
                 // 创建检测结果存储数据
                 LivenessModel livenessModel = new LivenessModel();
@@ -401,8 +402,8 @@ public class FaceSDKManager {
                     }
                 });
 
-            }
-        });
+//            }
+//        });
 
 
     }
@@ -544,7 +545,7 @@ public class FaceSDKManager {
                                   //  Log.e("illum", "illum = " + illum+"  "+ bdFaceCheckConfig.illum);
                                     if (illum < bdFaceCheckConfig.illum) {
                                         faceDetectCallBack.onTip(-1, "图片光照不通过");
-                                        EventBus.getDefault().post(new LedLightEvent(true,0));
+                                        EventBus.getDefault().post(new LedLightEvent(true, 0));
                                     }
                                 }
                                 // 质量检测未通过,销毁BDFaceImageInstance,结束函数
@@ -1174,25 +1175,50 @@ public class FaceSDKManager {
         FaceInfo[] faceInfos = getTrackCheck(rgbInstance);
         // 检测结果判断
         if (faceInfos == null || faceInfos.length == 0) {
-            if(bdNirFaceImageConfig!=null){
-                BDFaceImageInstance nirInstance = getBdImage(bdNirFaceImageConfig, bdFaceCheckConfig.darkEnhance);
-                // track
-                FaceInfo[] faceInfos2 = getTrackCheck(nirInstance);
-                if(faceInfos2 != null && faceInfos2.length > 0){
-                    nirLightCount++;
-                    if (nirLightCount > 6) {
-                        nirLightCount = 0;
-                        EventBus.getDefault().post(new LedLightEvent(true, 0));
+            if(future5!=null&&!future5.isDone()){
+                detectListener.onDetectFail();
+                return;
+            }
+            future5=es.submit(new Runnable() {
+                @Override
+                public void run() {
+                    if(bdNirFaceImageConfig!=null) {
+                        BDFaceDetectListConf bdFaceDetectListConf = new BDFaceDetectListConf();
+                        bdFaceDetectListConf.usingDetect = true;
+
+                        BDFaceImageInstance nirInstance = getBdImage(bdNirFaceImageConfig,false);
+                        // track
+                        FaceInfo[] faceInfos2 = faceModel.getFaceNirDetect().
+                                detect(BDFaceSDKCommon.DetectType.DETECT_NIR,
+                                        BDFaceSDKCommon.AlignType.
+                                                BDFACE_ALIGN_TYPE_NIR_ACCURATE,
+                                        nirInstance, null, bdFaceDetectListConf);
+                        if (faceInfos2 != null && faceInfos2.length > 0) {
+                            if(nirFillLightStartTime==0){
+                                nirFillLightStartTime=System.currentTimeMillis();
+                            }
+                            long currentTime=System.currentTimeMillis();
+                            if (currentTime-nirFillLightStartTime > 1000) { //todo 连续并且时间大于1秒存在,则启动补光灯
+                                nirFillLightStartTime = 0;
+                                EventBus.getDefault().post(new LedLightEvent(true, 0));
+
+                            }
+                        }else {
+                            nirFillLightStartTime = 0L;
+                        }
+                        if (nirInstance != null) {
+                            nirInstance.destory();
+                        }
+                    }else {
+                        nirFillLightStartTime = 0L;
                     }
                 }
-                nirInstance.destory();
-
-            }
+            });
 
             detectListener.onDetectFail();
             return;
         }
-        nirLightCount=0;
+        nirFillLightStartTime = 0L;
         livenessModel.setTrackFaceInfo(faceInfos);
         livenessModel.setFaceInfo(faceInfos[0]);
         livenessModel.setTrackLandmarks(faceInfos[0].landmarks);
@@ -1319,70 +1345,49 @@ public class FaceSDKManager {
 
             // 角度过滤
             if (Math.abs(faceInfo.yaw) > bdQualityConfig.gesture) {
-                if(faceDetectCallBack!=null) {
-                    faceDetectCallBack.onTip(-1, "人脸左右偏转角超出限制");
-                }
+                faceDetectCallBack.onTip(-1, "人脸左右偏转角超出限制");
                 return false;
             } else if (Math.abs(faceInfo.roll) > bdQualityConfig.gesture) {
-                if(faceDetectCallBack!=null) {
-                    faceDetectCallBack.onTip(-1, "人脸平行平面内的头部旋转角超出限制");
-                }
+                faceDetectCallBack.onTip(-1, "人脸平行平面内的头部旋转角超出限制");
                 return false;
             } else if (Math.abs(faceInfo.pitch) > bdQualityConfig.gesture) {
-                if(faceDetectCallBack!=null) {
-                    faceDetectCallBack.onTip(-1, "人脸上下偏转角超出限制");
-                }
+                faceDetectCallBack.onTip(-1, "人脸上下偏转角超出限制");
                 return false;
             }
 
             // 模糊结果过滤
             float blur = faceInfo.bluriness;
             if (blur > bdQualityConfig.blur) {
-                if(faceDetectCallBack!=null) {
-                    faceDetectCallBack.onTip(-1, "图片模糊");
-                }
+                faceDetectCallBack.onTip(-1, "图片模糊");
                 return false;
             }
 
+
             // 遮挡结果过滤
             if (faceInfo.occlusion != null) {
                 BDFaceOcclusion occlusion = faceInfo.occlusion;
 
                 if (occlusion.leftEye > bdQualityConfig.leftEye) {
                     // 左眼遮挡置信度
-                    if(faceDetectCallBack!=null) {
-                        faceDetectCallBack.onTip(-1, "左眼遮挡");
-                    }
+                    faceDetectCallBack.onTip(-1, "左眼遮挡");
                 } else if (occlusion.rightEye > bdQualityConfig.rightEye) {
                     // 右眼遮挡置信度
-                    if(faceDetectCallBack!=null) {
-                        faceDetectCallBack.onTip(-1, "右眼遮挡");
-                    }
+                    faceDetectCallBack.onTip(-1, "右眼遮挡");
                 } else if (occlusion.nose > bdQualityConfig.nose) {
                     // 鼻子遮挡置信度
-                    if(faceDetectCallBack!=null) {
-                        faceDetectCallBack.onTip(-1, "鼻子遮挡");
-                    }
+                    faceDetectCallBack.onTip(-1, "鼻子遮挡");
                 } else if (occlusion.mouth > bdQualityConfig.mouth) {
                     // 嘴巴遮挡置信度
-                    if(faceDetectCallBack!=null) {
-                        faceDetectCallBack.onTip(-1, "嘴巴遮挡");
-                    }
+                    faceDetectCallBack.onTip(-1, "嘴巴遮挡");
                 } else if (occlusion.leftCheek > bdQualityConfig.leftCheek) {
                     // 左脸遮挡置信度
-                    if(faceDetectCallBack!=null) {
-                        faceDetectCallBack.onTip(-1, "左脸遮挡");
-                    }
+                    faceDetectCallBack.onTip(-1, "左脸遮挡");
                 } else if (occlusion.rightCheek > bdQualityConfig.rightCheek) {
                     // 右脸遮挡置信度
-                    if(faceDetectCallBack!=null) {
-                        faceDetectCallBack.onTip(-1, "右脸遮挡");
-                    }
+                    faceDetectCallBack.onTip(-1, "右脸遮挡");
                 } else if (occlusion.chin > bdQualityConfig.chinContour) {
                     // 下巴遮挡置信度
-                    if(faceDetectCallBack!=null) {
-                        faceDetectCallBack.onTip(-1, "下巴遮挡");
-                    }
+                    faceDetectCallBack.onTip(-1, "下巴遮挡");
                 } else {
                     return true;
                 }
@@ -1443,7 +1448,7 @@ public class FaceSDKManager {
                 float illum = faceInfos[0].illum;
              //   Log.e("illum", "illum = " + illum);
                 if (illum < bdFaceCheckConfig.illum) {
-                    EventBus.getDefault().post(new LedLightEvent(true,0));
+                    EventBus.getDefault().post(new LedLightEvent(true, 0));
                 }
             }
 

+ 4 - 1
lib_base/src/main/java/com/hanghui/senic/lib_base/event/LedLightEvent.java

@@ -8,8 +8,11 @@ package com.hanghui.senic.lib_base.event;
  **/
 public class LedLightEvent {
     private boolean isOpenLedLight;
-    private int delay =0; //延迟  ms
+    private int delay =0; //todo 打开补光灯时,延时时间关闭 ;毫秒
 
+    public LedLightEvent(boolean isOpenLedLight) {
+        this.isOpenLedLight = isOpenLedLight;
+    }
 
     public LedLightEvent(boolean isOpenLedLight, int delay) {
         this.isOpenLedLight = isOpenLedLight;

+ 1 - 1
lib_base/src/main/java/com/hanghui/senic/lib_base/glide/MyAppGlideModule.java

@@ -25,7 +25,7 @@ public class MyAppGlideModule extends AppGlideModule {
         builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
 
         // 设置磁盘缓存大小
-        int diskCacheSizeBytes = 1024 * 1024 * 1000; // 1000MB
+        int diskCacheSizeBytes = 1024 * 1024 * 500; // 500MB
         builder.setDiskCache(new ExternalPreferredCacheDiskCacheFactory(context,  diskCacheSizeBytes));
     }
 }