kkk 2 years ago
parent
commit
0734d9ef25
100 changed files with 10956 additions and 2 deletions
  1. 2 2
      README.md
  2. 1 0
      app/.gitignore
  3. 154 0
      app/app.iml
  4. 53 0
      app/build.gradle
  5. 1 0
      app/gradle.properties
  6. BIN
      app/key/Untitled
  7. BIN
      app/key/app.iml
  8. BIN
      app/key/jhj
  9. BIN
      app/key/jsw_txm_app
  10. BIN
      app/libs/FaceSDK-6.0.jar.bak
  11. BIN
      app/libs/arm64-v8a/libaikl_calc_arm.so
  12. BIN
      app/libs/arm64-v8a/libaikl_cluster_arm.so
  13. BIN
      app/libs/arm64-v8a/libbd_unifylicense.so
  14. BIN
      app/libs/arm64-v8a/libbdface_sdk.so
  15. BIN
      app/libs/arm64-v8a/libc++_shared.so
  16. BIN
      app/libs/arm64-v8a/libliantian.so
  17. BIN
      app/libs/arm64-v8a/libpaddle_light_api_shared.so
  18. BIN
      app/libs/armeabi-v7a/libaikl_calc_arm.so
  19. BIN
      app/libs/armeabi-v7a/libaikl_cluster_arm.so
  20. BIN
      app/libs/armeabi-v7a/libbd_unifylicense.so
  21. BIN
      app/libs/armeabi-v7a/libbdface_sdk.so
  22. BIN
      app/libs/armeabi-v7a/libc++_shared.so
  23. BIN
      app/libs/armeabi-v7a/libliantian.so
  24. BIN
      app/libs/armeabi-v7a/libpaddle_light_api_shared.so
  25. BIN
      app/libs/bd_unifylicense.jar.bak
  26. BIN
      app/libs/fastjson-1.2.68.sec10.jar.bak
  27. BIN
      app/libs/gson-2.8.6.jar.bak
  28. BIN
      app/libs/hf_reader.jar.bak
  29. BIN
      app/libs/kotlin-stdlib-1.4.10.jar.bak
  30. BIN
      app/libs/liantian.jar.bak
  31. BIN
      app/libs/okhttp-4.10.0-RC1.jar.bak
  32. BIN
      app/libs/okio-2.9.0.jar.bak
  33. BIN
      app/libs/orbbec_module-debug.aar
  34. 21 0
      app/proguard-rules.pro
  35. BIN
      app/release/jswkj
  36. 1 0
      app/release/output.json
  37. 27 0
      app/src/androidTest/java/com/jsw/jswlibrary/ExampleInstrumentedTest.java
  38. 153 0
      app/src/main/AndroidManifest.xml
  39. BIN
      app/src/main/assets/face-sdk-models/align/align_nir-customized-pa-model.model.float32-6.4.11.1
  40. BIN
      app/src/main/assets/face-sdk-models/align/align_rgb-customized-pa-mobile.model.float32-0.7.5.3
  41. BIN
      app/src/main/assets/face-sdk-models/align/align_rgb-customized-pa-model.model.float32-6.4.10.1
  42. BIN
      app/src/main/assets/face-sdk-models/attribute/attribute-customized-pa-mobile.model.float32-1.0.9.4
  43. BIN
      app/src/main/assets/face-sdk-models/best_image/best_image-mobilenet-pa-faceid60.model.float32-1.0.1.1
  44. BIN
      app/src/main/assets/face-sdk-models/blur/blur-customized-pa-blurnet_9768.model.float32-3.0.9.1
  45. BIN
      app/src/main/assets/face-sdk-models/dark_enhance/dark_enhance-customized-pa-zero_depthwise.model.float32-1.0.2.1
  46. BIN
      app/src/main/assets/face-sdk-models/detect/detect_nir-customized-pa-normquant.model.int8-0.0.12.1
  47. BIN
      app/src/main/assets/face-sdk-models/detect/detect_rgb-customized-pa-faceid6_0.model.int8-0.0.11.1
  48. BIN
      app/src/main/assets/face-sdk-models/driver_monitor/driver_monitor_nir-customized-pa-DMS_anquandai_rgb_nir_detect.model.float32-1.0.2.1
  49. BIN
      app/src/main/assets/face-sdk-models/driver_monitor/driver_monitor_nir-customized-pa-DMS_rgb_nir_detect.model.float32-1.0.1.1
  50. BIN
      app/src/main/assets/face-sdk-models/eyes_close/eyes-customized-pa-DMS_eye_rgb_nir_detect.model.float32-1.0.4.1
  51. BIN
      app/src/main/assets/face-sdk-models/feature/feature_id-mnasnet-pa-renzheng.model.int8-2.0.135.2
  52. BIN
      app/src/main/assets/face-sdk-models/feature/feature_live-mnasnet-pa-life.model.int8-2.0.134.1
  53. BIN
      app/src/main/assets/face-sdk-models/feature/feature_nir-mnasnet-pa-nir_rgb_mix.model.int8-2.0.138.1
  54. BIN
      app/src/main/assets/face-sdk-models/feature/feature_rgbd-mnasnet-pa-RGBD_FaceID_5.model.int8-2.0.88.2
  55. BIN
      app/src/main/assets/face-sdk-models/gaze/gaze-customized-pa-mobile.model.float32-1.0.3.3
  56. BIN
      app/src/main/assets/face-sdk-models/mouth_close/mouth-customized-pa-DMS_mouth_rgb_nir_detect.model.float32-1.0.4.1
  57. BIN
      app/src/main/assets/face-sdk-models/mouth_mask/mouth_mask-customized-pa-20200306.model.float32-1.0.6.3
  58. BIN
      app/src/main/assets/face-sdk-models/occlusion/occlusion-customized-pa-paddle.model.float32-2.0.7.1
  59. BIN
      app/src/main/assets/face-sdk-models/silent_live/liveness_depth-customized-pa-paddle_60.model.float32-1.1.13.1
  60. BIN
      app/src/main/assets/face-sdk-models/silent_live/liveness_nir-customized-pa-60_android.model.float32-1.1.11.1
  61. BIN
      app/src/main/assets/face-sdk-models/silent_live/liveness_rgb-customized-pa-LGSC.model.float32-1.1.12.1
  62. 254 0
      app/src/main/java/com/jsw/jswlibrary/AuthReaderActivity.java
  63. 262 0
      app/src/main/java/com/jsw/jswlibrary/BaseActivity.java
  64. 20 0
      app/src/main/java/com/jsw/jswlibrary/BootBroadcastReceiver.java
  65. 71 0
      app/src/main/java/com/jsw/jswlibrary/CheckAdminPassword.java
  66. 255 0
      app/src/main/java/com/jsw/jswlibrary/CodeBindActivity.java
  67. 607 0
      app/src/main/java/com/jsw/jswlibrary/FaceAuthReaderActivity.java
  68. 140 0
      app/src/main/java/com/jsw/jswlibrary/FaceSDKManager.java
  69. 443 0
      app/src/main/java/com/jsw/jswlibrary/HuanshuActivity.java
  70. 254 0
      app/src/main/java/com/jsw/jswlibrary/JiansuoActivity.java
  71. 449 0
      app/src/main/java/com/jsw/jswlibrary/JieshuActivity.java
  72. 713 0
      app/src/main/java/com/jsw/jswlibrary/JswHomeActivity.java
  73. 186 0
      app/src/main/java/com/jsw/jswlibrary/LoadFaceActivity.java
  74. 159 0
      app/src/main/java/com/jsw/jswlibrary/MyjieyueActivity.java
  75. 210 0
      app/src/main/java/com/jsw/jswlibrary/SettingActivity.java
  76. 260 0
      app/src/main/java/com/jsw/jswlibrary/UpdateActivity.java
  77. 664 0
      app/src/main/java/com/jsw/jswlibrary/baiduregist/ActivitionActivity.java
  78. 265 0
      app/src/main/java/com/jsw/jswlibrary/baiduregist/StartActivity.java
  79. 45 0
      app/src/main/java/com/jsw/jswlibrary/baiduregist/StartSettingActivity.java
  80. 54 0
      app/src/main/java/com/jsw/jswlibrary/common/GsonUtil.java
  81. 86 0
      app/src/main/java/com/jsw/jswlibrary/common/MyTimer.java
  82. 33 0
      app/src/main/java/com/jsw/jswlibrary/common/PubData.java
  83. 80 0
      app/src/main/java/com/jsw/jswlibrary/common/TagData.java
  84. 1350 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/FaceSDKManager.java
  85. 33 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/activity/BaseOrbbecActivity.java
  86. 341 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/activity/BatchImportActivity.java
  87. 689 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/activity/UserManagerActivity.java
  88. 371 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/api/FaceApi.java
  89. 18 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/callback/CameraDataCallback.java
  90. 21 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/callback/FaceDetectCallBack.java
  91. 17 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/callback/FaceFeatureCallBack.java
  92. 167 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/camera/AutoTexturePreviewView.java
  93. 344 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/camera/CameraPreviewManager.java
  94. 126 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/db/DBHelper.java
  95. 865 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/db/DBManager.java
  96. 259 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/manager/FaceTrackManager.java
  97. 284 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/manager/ImportFileManager.java
  98. 40 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/manager/ShareManager.java
  99. 108 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/manager/UserInfoManager.java
  100. 0 0
      app/src/main/java/com/jsw/jswlibrary/faceregist/register/FaceRegisterNewActivity.java

+ 2 - 2
README.md

@@ -1,3 +1,3 @@
-# jswlibrary_android_rfid_etk
+# jswlibrary_android
 
-斯科自助借还机儿童款app
+图书自助借还机——android工程 儿童款

+ 1 - 0
app/.gitignore

@@ -0,0 +1 @@
+/build

+ 154 - 0
app/app.iml

@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="android-gradle" name="Android-Gradle">
+      <configuration>
+        <option name="GRADLE_PROJECT_PATH" value=":app" />
+        <option name="LAST_SUCCESSFUL_SYNC_AGP_VERSION" value="3.5.2" />
+        <option name="LAST_KNOWN_AGP_VERSION" value="3.5.2" />
+      </configuration>
+    </facet>
+    <facet type="android" name="Android">
+      <configuration>
+        <option name="SELECTED_BUILD_VARIANT" value="debug" />
+        <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
+        <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
+        <afterSyncTasks>
+          <task>generateDebugSources</task>
+        </afterSyncTasks>
+        <option name="ALLOW_USER_CONFIGURATION" value="false" />
+        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
+        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
+        <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res;file://$MODULE_DIR$/build/generated/res/resValues/debug" />
+        <option name="TEST_RES_FOLDERS_RELATIVE_PATH" value="" />
+        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
+    <output url="file://$MODULE_DIR$/build/intermediates/javac/debug/classes" />
+    <output-test url="file://$MODULE_DIR$/build/intermediates/javac/debugUnitTest/classes" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debug/out" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debug/compileDebugAidl/out" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debug/compileDebugRenderscript/out" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debugAndroidTest/out" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debugAndroidTest/compileDebugAndroidTestAidl/out" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debugAndroidTest/compileDebugAndroidTestRenderscript/out" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/ap_generated_sources/debugUnitTest/out" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/build" />
+    </content>
+    <orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" scope="TEST" name="Gradle: junit:junit:4.12@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-core:1.3@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: net.sf.kxml:kxml2:2.3.0@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: androidx.test.ext:junit:1.1.0@aar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: androidx.test.espresso:espresso-core:3.1.1@aar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: androidx.test:runner:1.1.1@aar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: androidx.test:core:1.1.0@aar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: androidx.test:monitor:1.1.1@aar" level="project" />
+    <orderEntry type="library" scope="TEST" name="Gradle: androidx.test.espresso:espresso-idling-resource:3.1.1@aar" level="project" />
+    <orderEntry type="library" name="Gradle: __local_aars__:/Users/tianlumei/Documents/temp2/jswlibrary_android_rfid/app/libs/gson-2.8.6.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="Gradle: __local_aars__:/Users/tianlumei/Documents/temp2/jswlibrary_android_rfid/app/libs/bd_unifylicense.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="Gradle: __local_aars__:/Users/tianlumei/Documents/temp2/jswlibrary_android_rfid/app/libs/fastjson-1.2.68.sec10.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="Gradle: __local_aars__:/Users/tianlumei/Documents/temp2/jswlibrary_android_rfid/app/libs/kotlin-stdlib-1.4.10.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="Gradle: __local_aars__:/Users/tianlumei/Documents/temp2/jswlibrary_android_rfid/app/libs/FaceSDK.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="Gradle: __local_aars__:/Users/tianlumei/Documents/temp2/jswlibrary_android_rfid/app/libs/liantian.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="Gradle: __local_aars__:/Users/tianlumei/Documents/temp2/jswlibrary_android_rfid/app/libs/okio-2.9.0.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="Gradle: __local_aars__:/Users/tianlumei/Documents/temp2/jswlibrary_android_rfid/app/libs/okhttp-4.10.0-RC1.jar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="Gradle: org.jetbrains:annotations-java5:15.0@jar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.collection:collection:1.0.0@jar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-common:2.0.0@jar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.arch.core:core-common:2.0.0@jar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.annotation:annotation:1.0.0@jar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.constraintlayout:constraintlayout-solver:1.1.3@jar" level="project" />
+    <orderEntry type="library" name="Gradle: __local_aars__:/Users/tianlumei/Documents/temp2/jswlibrary_android_rfid/app/libs/orbbec_module-debug.aar:unspecified@jar" level="project" />
+    <orderEntry type="library" name="Gradle: com.google.android.material:material:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.appcompat:appcompat:1.0.2@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.fragment:fragment:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.vectordrawable:vectordrawable-animated:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.recyclerview:recyclerview:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.legacy:legacy-support-core-ui:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.legacy:legacy-support-core-utils:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.vectordrawable:vectordrawable:1.0.1@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.transition:transition:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.loader:loader:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.viewpager:viewpager:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.coordinatorlayout:coordinatorlayout:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.drawerlayout:drawerlayout:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.slidingpanelayout:slidingpanelayout:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.customview:customview:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.swiperefreshlayout:swiperefreshlayout:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.asynclayoutinflater:asynclayoutinflater:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.core:core:1.0.1@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.versionedparcelable:versionedparcelable:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.cursoradapter:cursoradapter:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.cardview:cardview:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-runtime:2.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.documentfile:documentfile:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.localbroadcastmanager:localbroadcastmanager:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.print:print:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-viewmodel:2.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.interpolator:interpolator:1.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-livedata:2.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-livedata-core:2.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.arch.core:core-runtime:2.0.0@aar" level="project" />
+    <orderEntry type="library" name="Gradle: androidx.constraintlayout:constraintlayout:1.1.3@aar" level="project" />
+    <orderEntry type="library" name="Gradle: me.jessyan:autosize:0.9.5@aar" level="project" />
+  </component>
+</module>

+ 53 - 0
app/build.gradle

@@ -0,0 +1,53 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 29
+    buildToolsVersion "29.0.3"
+    publishNonDefault true
+    defaultConfig {
+        applicationId "com.jsw.jswlibrary"
+        minSdkVersion 25
+        targetSdkVersion 29
+        versionCode 1
+        versionName "1.0"
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        ndk {
+            moduleName "facesdk"
+            ldLibs "log"
+            abiFilters "armeabi-v7a"
+        }
+    }
+    sourceSets.main {
+        jni.srcDirs = []
+        jniLibs.srcDir "libs"
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+dependencies {
+
+    compile fileTree(include: ['*.jar'], dir: 'libs')
+    implementation 'org.jetbrains:annotations-java5:15.0'
+    implementation files('libs/orbbec_module-debug.aar')
+    implementation files('libs/bd_unifylicense.jar')
+    implementation 'androidx.appcompat:appcompat:1.0.2'
+    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+    implementation 'com.google.android.material:material:1.0.0'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
+    implementation files('libs/fastjson-1.2.68.sec10.jar')
+    implementation files('libs/liantian.jar')
+    implementation 'me.jessyan:autosize:0.9.5'
+    implementation files('libs/okhttp-4.10.0-RC1.jar')
+    implementation files('libs/kotlin-stdlib-1.4.10.jar')
+    implementation files('libs/okio-2.9.0.jar')
+    implementation files('libs/gson-2.8.6.jar')
+    implementation files('libs/FaceSDK.jar')
+
+}

+ 1 - 0
app/gradle.properties

@@ -0,0 +1 @@
+android.useDeprecatedNdk=true

BIN
app/key/Untitled


BIN
app/key/app.iml


BIN
app/key/jhj


BIN
app/key/jsw_txm_app


BIN
app/libs/FaceSDK-6.0.jar.bak


BIN
app/libs/arm64-v8a/libaikl_calc_arm.so


BIN
app/libs/arm64-v8a/libaikl_cluster_arm.so


BIN
app/libs/arm64-v8a/libbd_unifylicense.so


BIN
app/libs/arm64-v8a/libbdface_sdk.so


BIN
app/libs/arm64-v8a/libc++_shared.so


BIN
app/libs/arm64-v8a/libliantian.so


BIN
app/libs/arm64-v8a/libpaddle_light_api_shared.so


BIN
app/libs/armeabi-v7a/libaikl_calc_arm.so


BIN
app/libs/armeabi-v7a/libaikl_cluster_arm.so


BIN
app/libs/armeabi-v7a/libbd_unifylicense.so


BIN
app/libs/armeabi-v7a/libbdface_sdk.so


BIN
app/libs/armeabi-v7a/libc++_shared.so


BIN
app/libs/armeabi-v7a/libliantian.so


BIN
app/libs/armeabi-v7a/libpaddle_light_api_shared.so


BIN
app/libs/bd_unifylicense.jar.bak


BIN
app/libs/fastjson-1.2.68.sec10.jar.bak


BIN
app/libs/gson-2.8.6.jar.bak


BIN
app/libs/hf_reader.jar.bak


BIN
app/libs/kotlin-stdlib-1.4.10.jar.bak


BIN
app/libs/liantian.jar.bak


BIN
app/libs/okhttp-4.10.0-RC1.jar.bak


BIN
app/libs/okio-2.9.0.jar.bak


BIN
app/libs/orbbec_module-debug.aar


+ 21 - 0
app/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

BIN
app/release/jswkj


+ 1 - 0
app/release/output.json

@@ -0,0 +1 @@
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]

+ 27 - 0
app/src/androidTest/java/com/jsw/jswlibrary/ExampleInstrumentedTest.java

@@ -0,0 +1,27 @@
+package com.jsw.jswlibrary;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+        assertEquals("com.jsw.jswlibrary", appContext.getPackageName());
+    }
+}

+ 153 - 0
app/src/main/AndroidManifest.xml

@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.jsw.jswlibrary">
+
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>
+
+    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+    <uses-permission android:name="android.permission.CAMERA" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission
+        android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
+        tools:ignore="ProtectedPermissions" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.hardware.camera.autofocus" />
+    <uses-permission
+        android:name="android.permission.WRITE_SETTINGS"
+        tools:ignore="ProtectedPermissions" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.GET_TASKS" />
+    <uses-permission android:name="android.permission.VIBRATE" />
+
+    <uses-feature android:name="android.hardware.camera" />
+    <uses-feature
+        android:name="android.hardware.camera.autofocus"
+        android:required="true" />
+    <uses-feature
+        android:name="android.hardware.camera.front"
+        android:required="true" />
+    <uses-feature
+        android:name="android.hardware.camera.front.autofocus"
+        android:required="true" />
+
+
+
+
+
+
+    <application
+        android:requestLegacyExternalStorage="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="图书自助借还"
+        tools:ignore="GoogleAppIndexingWarning">
+
+        <meta-data
+            android:name="design_width_in_dp"
+            android:value="1365" />
+        <meta-data
+            android:name="design_height_in_dp"
+            android:value="768" />
+        <activity android:name="com.jsw.jswlibrary.JswHomeActivity" android:launchMode="singleTop"
+            android:theme="@style/Theme_NoTitle">
+
+        </activity>
+        <activity android:name="com.jsw.jswlibrary.CheckAdminPassword" />
+        <activity android:name="com.jsw.jswlibrary.SettingActivity" />
+        <activity android:name="com.jsw.jswlibrary.CodeBindActivity" />
+        <activity android:name="com.jsw.jswlibrary.UpdateActivity" />
+        <activity android:name="com.jsw.jswlibrary.AuthReaderActivity" />
+        <activity android:name="com.jsw.jswlibrary.FaceAuthReaderActivity" />
+        <activity android:name="com.jsw.jswlibrary.JieshuActivity" />
+        <activity android:name="com.jsw.jswlibrary.HuanshuActivity" />
+        <activity android:name="com.jsw.jswlibrary.MyjieyueActivity" />
+        <activity android:name="com.jsw.jswlibrary.JiansuoActivity" />
+        <activity android:name="com.jsw.jswlibrary.baiduregist.ActivitionActivity" />
+        <activity android:name="com.jsw.jswlibrary.baiduregist.StartSettingActivity" />
+        <activity android:name="com.jsw.jswlibrary.LoadFaceActivity" />
+        <activity
+            android:name="com.jsw.jswlibrary.baiduregist.StartActivity"
+            android:launchMode="singleTop"
+            android:theme="@style/Theme_NoTitle">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity android:name="com.jsw.jswlibrary.faceregist.activity.UserManagerActivity" />
+        <activity android:name="com.jsw.jswlibrary.faceregist.activity.BatchImportActivity" />
+        <activity android:name="com.jsw.jswlibrary.faceregist.register.FaceRegisterNewActivity" />
+        <activity android:name="com.jsw.jswlibrary.faceregist.register.FaceRegisterNewNIRActivity" />
+        <activity android:name="com.jsw.jswlibrary.faceregist.register.FaceRegisterNewDepthActivity" />
+        <activity android:name="com.jsw.jswlibrary.faceregist.register.FaceRegisterNewRgbNirDepthActivity" />
+
+        <receiver android:name="com.jsw.jswlibrary.BootBroadcastReceiver" >
+            <intent-filter>
+                <action android:name="android.intent.action.BOOT_COMPLETED" />
+            </intent-filter>
+        </receiver>
+
+        <activity
+            android:name="com.baidu.liantian.LiantianActivity"
+            android:excludeFromRecents="true"
+            android:exported="true"
+            android:launchMode="standard"
+            android:theme="@android:style/Theme.Translucent">
+            <intent-filter>
+                <action android:name="com.baidu.action.Liantian.VIEW" />
+
+                <category android:name="com.baidu.category.liantian" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <receiver
+            android:name="com.baidu.liantian.LiantianReceiver"
+            android:exported="false">
+            <intent-filter>
+                <action android:name="com.baidu.action.Liantian.VIEW" />
+
+                <category android:name="com.baidu.category.liantian" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <intent-filter android:priority="2147483647">
+                <action android:name="android.intent.action.BOOT_COMPLETED" />
+            </intent-filter>
+        </receiver>
+
+        <provider
+            android:name="com.baidu.liantian.LiantianProvider"
+            android:authorities="com.baidu.idl.face.demo.liantian.ac.provider"
+            android:exported="false" />
+        <provider
+            android:name="androidx.core.content.FileProvider"
+            android:authorities="com.jsw.jswlibrary.fileprovider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths" />
+        </provider>
+        <!--<service android:name="com.baidu.idl.face.main.socket.SocketService" />-->
+        <service
+            android:name="com.baidu.liantian.LiantianService"
+            android:exported="false">
+            <intent-filter>
+                <action android:name="com.baidu.action.Liantian.VIEW" />
+
+                <category android:name="com.baidu.category.liantian" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </service>
+
+        <meta-data
+            android:name="seckey_avscan"
+            android:value="660346260f8a841a04ec2a56815b421b" />
+        <meta-data
+            android:name="appkey_avscan"
+            android:value="100034" />
+    </application>
+
+</manifest>

BIN
app/src/main/assets/face-sdk-models/align/align_nir-customized-pa-model.model.float32-6.4.11.1


BIN
app/src/main/assets/face-sdk-models/align/align_rgb-customized-pa-mobile.model.float32-0.7.5.3


BIN
app/src/main/assets/face-sdk-models/align/align_rgb-customized-pa-model.model.float32-6.4.10.1


BIN
app/src/main/assets/face-sdk-models/attribute/attribute-customized-pa-mobile.model.float32-1.0.9.4


BIN
app/src/main/assets/face-sdk-models/best_image/best_image-mobilenet-pa-faceid60.model.float32-1.0.1.1


BIN
app/src/main/assets/face-sdk-models/blur/blur-customized-pa-blurnet_9768.model.float32-3.0.9.1


BIN
app/src/main/assets/face-sdk-models/dark_enhance/dark_enhance-customized-pa-zero_depthwise.model.float32-1.0.2.1


BIN
app/src/main/assets/face-sdk-models/detect/detect_nir-customized-pa-normquant.model.int8-0.0.12.1


BIN
app/src/main/assets/face-sdk-models/detect/detect_rgb-customized-pa-faceid6_0.model.int8-0.0.11.1


BIN
app/src/main/assets/face-sdk-models/driver_monitor/driver_monitor_nir-customized-pa-DMS_anquandai_rgb_nir_detect.model.float32-1.0.2.1


BIN
app/src/main/assets/face-sdk-models/driver_monitor/driver_monitor_nir-customized-pa-DMS_rgb_nir_detect.model.float32-1.0.1.1


BIN
app/src/main/assets/face-sdk-models/eyes_close/eyes-customized-pa-DMS_eye_rgb_nir_detect.model.float32-1.0.4.1


BIN
app/src/main/assets/face-sdk-models/feature/feature_id-mnasnet-pa-renzheng.model.int8-2.0.135.2


BIN
app/src/main/assets/face-sdk-models/feature/feature_live-mnasnet-pa-life.model.int8-2.0.134.1


BIN
app/src/main/assets/face-sdk-models/feature/feature_nir-mnasnet-pa-nir_rgb_mix.model.int8-2.0.138.1


BIN
app/src/main/assets/face-sdk-models/feature/feature_rgbd-mnasnet-pa-RGBD_FaceID_5.model.int8-2.0.88.2


BIN
app/src/main/assets/face-sdk-models/gaze/gaze-customized-pa-mobile.model.float32-1.0.3.3


BIN
app/src/main/assets/face-sdk-models/mouth_close/mouth-customized-pa-DMS_mouth_rgb_nir_detect.model.float32-1.0.4.1


BIN
app/src/main/assets/face-sdk-models/mouth_mask/mouth_mask-customized-pa-20200306.model.float32-1.0.6.3


BIN
app/src/main/assets/face-sdk-models/occlusion/occlusion-customized-pa-paddle.model.float32-2.0.7.1


BIN
app/src/main/assets/face-sdk-models/silent_live/liveness_depth-customized-pa-paddle_60.model.float32-1.1.13.1


BIN
app/src/main/assets/face-sdk-models/silent_live/liveness_nir-customized-pa-60_android.model.float32-1.1.11.1


BIN
app/src/main/assets/face-sdk-models/silent_live/liveness_rgb-customized-pa-LGSC.model.float32-1.1.12.1


+ 254 - 0
app/src/main/java/com/jsw/jswlibrary/AuthReaderActivity.java

@@ -0,0 +1,254 @@
+package com.jsw.jswlibrary;
+
+
+import android.app.Activity;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbManager;
+import android.os.Bundle;
+import android.os.Looper;
+import android.view.View;
+import android.widget.Button;
+import android.widget.Toast;
+import com.jsw.jswlibrary.utils.HttpUtils;
+import com.syc.usbrfidreader.ICReaderApi;
+
+import java.util.Collection;
+import java.util.Map;
+
+
+public class AuthReaderActivity extends BaseActivity  {
+
+    private String toPage = "";
+    private Context context = null;
+    private Activity activity = null;
+    private ICReaderApi api = null;
+    private boolean flag = true;
+    private static int i = 0;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_authreader);
+        createTopView();
+        context = this;
+        activity = this;
+        i = 10;
+        toPage = getIntent().getStringExtra("toPage");
+
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                while(i>0){
+                    try {
+                        Thread.sleep(1000);
+                        i--;
+
+                        if(i == 0){
+                            finish();
+                        }
+                    }catch(Exception e){
+
+                    }
+                }
+                flag = false;
+
+                // startActivity(new Intent(AuthReaderActivity.this, JswHomeActivity.class));
+                //finish();
+            }
+        }).start();
+
+
+
+
+        Button r = findViewById(R.id.check_return);
+        r.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                i = -100;
+                finish();
+            }
+        });
+
+
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        IC_REDER();
+    }
+
+
+
+    private void IC_REDER(){
+        //IC卡读卡器启动
+        UsbManager manager = (UsbManager) context
+                .getSystemService(context.USB_SERVICE);
+        Collection<UsbDevice> values = manager.getDeviceList().values();
+        UsbDevice device = null;
+        for (UsbDevice value : values) {
+            int id = value.getProductId();
+            int vendorId = value.getVendorId();
+            //读卡器设备
+            if (id == 53 || vendorId == 65535) {
+                PendingIntent mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent("com.android.example.USB_PERMISSION"), 0);
+                if (manager.hasPermission(value)) {
+                    manager.openDevice(value);
+                    device = value;
+                    //Toast.makeText(context, "设备已开启", Toast.LENGTH_SHORT).show();
+                } else {
+                    System.out.println("设备未开启");
+                    //Toast.makeText(context, "设备未开启", Toast.LENGTH_SHORT).show();
+                    manager.requestPermission(value, mPermissionIntent);
+                    manager.openDevice(value);
+                    device = value;
+
+
+                }
+            }
+        }
+
+        if (device != null) {
+            api = new ICReaderApi(device, manager);
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    while(flag == true){
+                        try {
+
+                            Thread.sleep(1000);
+                            String text = new String();
+                            byte mode;
+                            mode = 0x52;
+                            byte halt = (byte) 0;
+                            byte[] snr = new byte[1];
+                            byte[] value = new byte[5]; // card number
+                            int result = api.GET_SNR(mode, halt, snr, value);
+                            if (result == 0) {
+                                text = showData(text, value, "", 0, 4);
+                                flag = false;
+                                action(text, BaseActivity.cardtype, activity);
+                            }
+                        }catch(Exception e){
+                            e.printStackTrace();
+                        }
+
+                    }
+
+                }
+            }).start();
+        }
+
+
+    }
+    public void action(String a, int type, Activity activity) {
+
+
+        if(type == 0) {//ic卡  8位需反转
+            a = changeCardNumber(a);
+        }else if(type == 1){//身份证
+
+        }
+        System.out.println("号码:"+a);
+        SharedPreferences sp = getSharedPreferences("reader", Context.MODE_PRIVATE);
+        SharedPreferences.Editor editor = sp.edit();
+        editor.clear();
+        if ("jieshu".equals(toPage)) {
+            Map res = HttpUtils.requestGet("/api/smartLibrary/queryReaderInfo?readerCardId="+a,activity);
+            if((Integer)res.get("code") == 200){
+                editor.putString("readerCardId", a);
+                editor.putString("readername", ((Map)res.get("data")).get("realname")+"");
+                flag = false;
+                i=-10;
+
+                startActivity(new Intent(AuthReaderActivity.this, JieshuActivity.class));
+                finish();
+
+            }else if((Integer)res.get("code") == 333){
+                startActivity(new Intent(AuthReaderActivity.this, JswHomeActivity.class));
+                Looper.prepare();
+                flag = false;
+                i=-10;
+                Toast.makeText(AuthReaderActivity.this, "网络异常,请检查是否配置了云参数!", Toast.LENGTH_SHORT).show();
+                Looper.loop();
+                finish();
+            }
+            else{
+                i=5;
+                Looper.prepare();
+                Toast.makeText(AuthReaderActivity.this, ""+res.get("msg"), Toast.LENGTH_SHORT).show();
+                Looper.loop();
+            }
+
+
+
+        }else if("myjieyue".equals(toPage)){
+            Map res = HttpUtils.requestGet("/api/smartLibrary/queryReaderInfo_jieyuelist?readerCardId="+a,activity);
+            if((Integer)res.get("code") == 200){
+                editor.putString("readerCardId", a);
+                editor.putString("readername", ((Map)res.get("data")).get("realname")+"");
+                flag = false;
+                i=-10;
+                startActivity(new Intent(AuthReaderActivity.this, MyjieyueActivity.class));
+                finish();
+            }else if((Integer)res.get("code") == 333){
+                startActivity(new Intent(AuthReaderActivity.this, JswHomeActivity.class));
+                Looper.prepare();
+                Toast.makeText(AuthReaderActivity.this, "网络异常,请检查是否配置了云参数!", Toast.LENGTH_SHORT).show();
+                Looper.loop();
+                flag = false;
+                i=-10;
+                finish();
+            }
+            else{
+                i=5;
+                Looper.prepare();
+                Toast.makeText(AuthReaderActivity.this, ""+res.get("msg"), Toast.LENGTH_SHORT).show();
+                Looper.loop();
+            }
+        }
+        editor.commit();
+    }
+
+    private String showData(String text, byte[] data, String str, int pos,
+                            int len) {
+        String dStr = "";
+        for (int i = 0; i < len; i++) {
+            dStr += String.format("%02x", data[i + pos]);//%02x
+        }
+        text += (str + dStr.toUpperCase());
+        return text;
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        flag = false;
+        getIntent().removeExtra("toPage");
+
+    }
+    public  static String changeCardNumber(String str){
+        String a = "";
+        try {
+            char newstring[] = new char[8];
+            char temp[] = str.toCharArray();
+            newstring[0] = temp[6];
+            newstring[1] = temp[7];
+            newstring[2] = temp[4];
+            newstring[3] = temp[5];
+            newstring[4] = temp[2];
+            newstring[5] = temp[3];
+            newstring[6] = temp[0];
+            newstring[7] = temp[1];
+            return new String(newstring);
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+        return a;
+    }
+
+}

+ 262 - 0
app/src/main/java/com/jsw/jswlibrary/BaseActivity.java

@@ -0,0 +1,262 @@
+package com.jsw.jswlibrary;
+
+import android.Manifest;
+import android.app.Activity;
+import android.app.DownloadManager;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.graphics.Color;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.jsw.jswlibrary.common.PubData;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+
+public class BaseActivity extends Activity {
+    public static String host = "";
+    public static String orgid = "";
+    public static String libraryid = "";
+    public static int cardtype = 1;
+    public static String apptitle = "";
+    public static int model = 0;
+    public static boolean hasIDCard = false;
+    public static boolean hasICCard = true;
+    public static int botelv_rfid = 0;
+    public static int botelv_idreader = 0;
+    public static String chuankouhao_fix_name_rfid="/dev/ttyXRUSB";
+    public static int chuankouhao_rfid = 2;
+    public static String chuankouhao_fix_name_idreader="/dev/ttyXRUSB";
+    public static int chuankouhao_idreader = 0;
+    String sdcardPath = System.getenv("EXTERNAL_STORAGE");
+    public static SimpleDateFormat format4 = new SimpleDateFormat("yyyyMMddHHmm");
+
+    public final static double appversion = 0.9d;
+    public final static String appname = "RFID自助借还机儿童款";
+    public static double lastversion = 0d;
+    public static String update_path="";//app更新地址
+    public static int model_camear_facing = 0;
+    public int borderColor= Color.parseColor("#ececec");
+    public static int screenWidth = 1920;
+    public static int screenHeight = 1080;
+    public static double marginLeft = screenWidth*0.1;
+    public static double contentWidth = screenWidth*0.8;
+    public static double marginTop_title = screenHeight*.02;
+    public static double margonTop_content = screenHeight*.02+60;
+    public static SimpleDateFormat format_cn = new SimpleDateFormat("yyyy年MM月dd日");
+    public static SimpleDateFormat hhss_format = new SimpleDateFormat("HH:mm:ss");
+    public static SimpleDateFormat hhsss_format = new SimpleDateFormat("HH:mm:ss.SSS");
+    public static boolean timetheadflag = true;
+    public static TextView time_str;
+    public static Thread time_str_thread = null;
+    public void getScreenXY(){
+        DisplayMetrics outMetrics = new DisplayMetrics();
+        getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
+        screenWidth = outMetrics.widthPixels;
+        screenHeight = outMetrics.heightPixels;
+        System.out.println("像素: 宽:"+screenWidth);
+        System.out.println("像素: 高:"+screenHeight);
+        System.out.println("dp: 宽:"+px2dp(getApplicationContext(),screenWidth));
+        System.out.println("dp: 高:"+px2dp(getApplicationContext(),screenHeight));
+    }
+    public static int dp2px(Context context, float dpValue) {
+        final float scale = context.getResources().getDisplayMetrics().density;
+        return (int) (dpValue * scale + 0.5f);
+    }
+
+    /**
+     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
+     */
+    public static int px2dp(Context context, float pxValue) {
+        final float scale = context.getResources().getDisplayMetrics().density;
+        return (int) (pxValue / scale + 0.5f);
+    }
+    public void createTopView(){
+        LinearLayout top_layout = findViewById(R.id.top_layout);
+        top_layout.addView(View.inflate(this, R.layout.layout_top, null));
+        TextView apptitle = findViewById(R.id.apptitle);
+        time_str = findViewById(R.id.time_str);
+        TextView week_str = findViewById(R.id.week_str);
+        TextView day_str = findViewById(R.id.day_str);
+        Date time = new Date();
+        Calendar calendar = Calendar.getInstance();
+        int weekday = calendar.get(Calendar.DAY_OF_WEEK);
+        if(weekday == Calendar.MONDAY){
+            week_str.setText("星期一");
+        }else if(weekday == Calendar.TUESDAY){
+            week_str.setText("星期二");
+        }else if(weekday == Calendar.WEDNESDAY){
+            week_str.setText("星期三");
+        }else if(weekday == Calendar.TUESDAY){
+            week_str.setText("星期四");
+        }else if(weekday == Calendar.FRIDAY){
+            week_str.setText("星期五");
+        }else if(weekday == Calendar.SATURDAY){
+            week_str.setText("星期六");
+        }else if(weekday == Calendar.SUNDAY){
+            week_str.setText("星期日");
+        }
+        SharedPreferences sp = getSharedPreferences("sp_name", Context.MODE_PRIVATE);
+        apptitle.setText(sp.getString("apptitle","自助借还机"));
+        day_str.setText(format_cn.format(time));
+        if(time_str_thread == null) {
+            time_str_thread = new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    while (timetheadflag) {
+                        try {
+                            timeHandle.sendEmptyMessage(1);
+                           // System.out.println("时间:" + hhss_format.format(new Date()));
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        } finally {
+                            try {
+                                Thread.sleep(1000);
+                            } catch (Exception e) {
+
+                            }
+                        }
+                    }
+                }
+            });
+            time_str_thread.start();
+        }
+
+
+
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        // 将activity设置为全屏显示
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+                WindowManager.LayoutParams.FLAG_FULLSCREEN);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        requestPermissions(99);
+        this.getScreenXY();
+    }
+
+    // 请求权限
+    public void requestPermissions(int requestCode) {
+        try {
+            if (Build.VERSION.SDK_INT >= 23) {
+                ArrayList<String> requestPerssionArr = new ArrayList<>();
+                int hasCamrea = checkSelfPermission(Manifest.permission.CAMERA);
+                if (hasCamrea != PackageManager.PERMISSION_GRANTED) {
+                    requestPerssionArr.add(Manifest.permission.CAMERA);
+                }
+
+                int hasSdcardRead = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
+                if (hasSdcardRead != PackageManager.PERMISSION_GRANTED) {
+                    requestPerssionArr.add(Manifest.permission.READ_EXTERNAL_STORAGE);
+                }
+
+                int hasSdcardWrite = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
+                if (hasSdcardWrite != PackageManager.PERMISSION_GRANTED) {
+                    requestPerssionArr.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
+                }
+                // 是否应该显示权限请求
+                if (requestPerssionArr.size() >= 1) {
+                    String[] requestArray = new String[requestPerssionArr.size()];
+                    for (int i = 0; i < requestArray.length; i++) {
+                        requestArray[i] = requestPerssionArr.get(i);
+                    }
+                    requestPermissions(requestArray, requestCode);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions,
+                                           int[] grantResults) {
+        boolean flag = false;
+        for (int i = 0; i < permissions.length; i++) {
+            if (PackageManager.PERMISSION_GRANTED == grantResults[i]) {
+                flag = true;
+            }
+        }
+    }
+    Handler timeHandle = new Handler(){
+        @Override
+        public void handleMessage(Message msg){
+            time_str.setText(hhss_format.format(new Date()));
+        }
+    };
+    //80461309
+    public  static String changeCardNumber(String str){
+        String a = "";
+        try {
+            char newstring[] = new char[8];
+            char temp[] = str.toCharArray();
+            newstring[0] = temp[6];
+            newstring[1] = temp[7];
+            newstring[2] = temp[4];
+            newstring[3] = temp[5];
+            newstring[4] = temp[2];
+            newstring[5] = temp[3];
+            newstring[6] = temp[0];
+            newstring[7] = temp[1];
+            return new String(newstring);
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+        return a;
+    }
+    public  static String changeUid(String str){
+        char newstring[] = new char[16];
+        if(str != null && str.length()==23){
+            String aa[] = str.split(":");
+            int i=15;
+            for(String a : aa){
+                char b[] = a.toCharArray();
+                newstring[i] = b[1];
+                i--;
+                newstring[i] = b[0];
+                i--;
+
+            }
+        }
+        return new String(newstring);
+    }
+
+    public boolean reWriteAfi(String rfid, int value){
+        for(int i=0;i<5;i++){
+            try {
+                boolean f = PubData.reader.writeAFI(rfid, value);
+                System.out.println(i + "->修改Rfid:" + value + "-->" + f);
+                if (f == true) {
+                    return true;
+                }
+                Thread.sleep(50);
+            }catch(Exception e){
+                e.printStackTrace();
+            }
+        }
+        return false;
+    }
+}

+ 20 - 0
app/src/main/java/com/jsw/jswlibrary/BootBroadcastReceiver.java

@@ -0,0 +1,20 @@
+package com.jsw.jswlibrary;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.jsw.jswlibrary.baiduregist.StartActivity;
+
+public class BootBroadcastReceiver extends BroadcastReceiver {
+    static final String ACTION = "android.intent.action.BOOT_COMPLETED";
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (intent.getAction().equals(ACTION)) {
+            Intent mainActivityIntent = new Intent(context, StartActivity.class);  // 要启动的Activity
+            mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            context.startActivity(mainActivityIntent);
+        }
+    }
+
+}

+ 71 - 0
app/src/main/java/com/jsw/jswlibrary/CheckAdminPassword.java

@@ -0,0 +1,71 @@
+package com.jsw.jswlibrary;
+
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+
+import java.util.Date;
+
+
+public class CheckAdminPassword extends BaseActivity  {
+
+    private EditText password;
+    private Button checkBtn;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_checkadminpassword);
+        createTopView();
+        password = findViewById(R.id.password);
+        checkBtn = findViewById(R.id.checkBtn);
+        Button returnBtn = findViewById(R.id.returnBtn);
+        returnBtn.setOnClickListener(new Button.OnClickListener(){
+            @Override
+            public void onClick(View v) {
+                startActivity(new Intent(CheckAdminPassword.this,JswHomeActivity.class));
+            }
+        });
+
+        password.setOnFocusChangeListener(new View.OnFocusChangeListener(){
+            @Override
+            public void onFocusChange(View v, boolean hasFocus) {
+
+            }
+        });
+        checkBtn.setOnClickListener(new Button.OnClickListener(){
+            @Override
+            public void onClick(View v) {
+
+                String date = "jswadmin"+format4.format(new Date());
+                String value = password.getText().toString().trim();
+                if(date.equals(value)){
+                    startActivity(new Intent(CheckAdminPassword.this, SettingActivity.class));
+                }
+            }
+        });
+
+
+
+    }
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+
+        if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
+
+            String date = "jswadmin"+format4.format(new Date());
+            String value = password.getText().toString().trim();
+            if(date.equals(value)){
+                startActivity(new Intent(CheckAdminPassword.this, SettingActivity.class));
+            }
+
+        }
+
+        return super.dispatchKeyEvent(event);
+    }
+
+}

+ 255 - 0
app/src/main/java/com/jsw/jswlibrary/CodeBindActivity.java

@@ -0,0 +1,255 @@
+package com.jsw.jswlibrary;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+
+import com.jsw.jswlibrary.common.MyTimer;
+import com.jsw.jswlibrary.common.PubData;
+import com.jsw.jswlibrary.utils.HttpUtils;
+import com.rightin.reader.hf.CommunicatorStruct;
+import com.rightin.reader.hf.myhf.HfConnector;
+import com.rightin.reader.hf.myhf.HfReader;
+import com.rightin.reader.hf.rfidenum.EnumModuleState;
+import com.rightin.reader.hf.rfidenum.EnumReaderStatus;
+import com.rightin.reader.hf.rfidenum.EnumResults;
+import com.rightin.reader.hf.rfidenum.EnumRfidCommand;
+import com.rightin.reader.hf.rfidenum.EnumSecStatus;
+import com.rightin.reader.hf.rfidenum.EnumTagType;
+
+
+
+import java.util.ArrayList;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class CodeBindActivity extends BaseActivity implements HfReader.OnHfReaderListener, HfConnector.OnHfReaderListener, MyTimer.OnTimerTickListener{
+
+    private String orgid = "";
+    protected final Map map = new HashMap();
+    final Activity activity = this;
+    private String barcode_text="";
+    private TextView barcode ;
+    private Map tagMap = new HashMap();
+    private boolean readflag = false;
+    private boolean readflag2 = false;
+    private TextView orgname ;
+    private String orgname_text = "";
+    private static boolean flag = false;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_codebind);
+        createTopView();
+        map.clear();
+        readflag = true;
+        readflag2=true;
+        SharedPreferences sp = getSharedPreferences("sp_name", Context.MODE_PRIVATE);
+        orgid = sp.getString("orgid","");
+        orgname = findViewById(R.id.orgname_codebind);
+        barcode = findViewById(R.id.barcode_codebind);
+        Button returnBtn = findViewById(R.id.returnBtn);
+        returnBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                readflag = false;
+                startActivity(new Intent(CodeBindActivity.this, SettingActivity.class));
+            }
+        });
+
+        HfReader.fix_name = "/dev/ttyXRUSB";
+        PubData.reader.setOnHfReaderListener(this);
+        PubData.reader.getMySerial().mDevNum = 0;
+        PubData.reader.open();
+        PubData.reader.setBaudRate(19200);
+        PubData.reader._is_inventory = false;//是否持续读
+        PubData.reader.setReaderAddress((byte)1);//天线1
+        PubData.reader.updateReadState(EnumModuleState.WORK);
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+
+                try {
+                    Map res = HttpUtils.requestGet("/api/smartLibrary_rfid/queryOrgInfo?id=" + orgid, activity);
+                    Map data = (Map)res.get("data");
+                    if((Integer)res.get("code") == 200){
+                        orgname_text = (String)data.get("orgname");
+                        orgnameHandle.sendEmptyMessage(1);
+                    }
+
+                }catch(Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                while(readflag){
+                    try{
+                        if(readflag2) {
+                            PubData.reader.inventory();
+                        }
+                    }catch(Exception e){
+                        e.printStackTrace();
+                    }finally {
+                        try{
+                            Thread.sleep(500);
+                        }catch(Exception e){}
+                    }
+                }
+            }
+        }).start();
+        barcode.requestFocus();
+
+
+    }
+
+    private void rfidbindbarcode(final String a){
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+
+                try {
+                    Map res = HttpUtils.requestGet("/api/smartLibrary_rfid/rfidbindbarcode?barcode=" + barcode.getText().toString()+"&rfid="+a, activity);
+                    barodeHandle.sendEmptyMessage(1);
+                    String msg = res.get("msg")+"";
+                    if((Integer)res.get("code") == 200){
+                        msg = "绑定成功!";
+                    }
+                    Looper.prepare();
+                    Toast.makeText(CodeBindActivity.this, res.get("msg")+"", Toast.LENGTH_SHORT).show();
+                    Looper.loop();
+
+                }catch(Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        readflag = false;
+        PubData.reader.updateReadState(EnumModuleState.IDLE);
+        PubData.reader.close();
+
+    }
+    Handler orgnameHandle = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            orgname.setText(orgname_text);
+        }
+    };
+    Handler barodeHandle = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            System.out.println("flag:"+flag);
+
+            barcode.setText("");
+            barcode.requestFocus();
+            flag = false;
+        }
+    };
+
+
+
+    @Override
+    public void onTick(String s) {
+    }
+
+    //region 读写器事件
+    @Override
+    public void onDataSendedHandler(Object o, byte[] bytes) {
+
+    }
+
+    @Override
+    public void onDataBaseReceivedHandler(Object o, byte[] bytes) {
+    }
+
+    @Override
+    public void onDataReceivedHandler(Object sender, byte[] buffer) {
+    }
+
+    @Override
+    public void onDataErrorHandler(String s) {
+    }
+
+    @Override
+    public void onResponseListHandler(Object o, ArrayList<Byte> arrayList) {
+    }
+
+    @Override
+    public void onSystemInfoHandler(Object o, EnumResults enumResults, String s, int i, String s1, String s2, String s3, String s4, CommunicatorStruct communicatorStruct) {
+    }
+
+    @Override
+    public void onInventoryUIDHandler(Object sender, final EnumResults result, final EnumTagType tagType, final int dsfid, final String uid, final int tagCount, EnumReaderStatus readerStatus, final CommunicatorStruct structs) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    if(result == EnumResults.SingleTag){
+                        String a = barcode.getText().toString();
+                        if(flag == false){
+                            if(a != null && !"".equals(a) ){
+                                flag = true;
+                                rfidbindbarcode(uid);
+                            }
+                        }
+                    }
+                }catch (Exception ex){
+//                    tvCount.setText(ex.getMessage());
+                }
+            }
+        });
+    }
+
+    @Override
+    public void onCommandSetHandler(Object o, EnumRfidCommand enumRfidCommand, EnumResults enumResults, int i, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onReadSingleBlocksHandler(Object o, EnumResults enumResults, EnumSecStatus enumSecStatus, String s, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onReadMultipleBlocksHandler(Object o, EnumResults enumResults, int i, ArrayList<EnumSecStatus> arrayList, ArrayList<String> arrayList1, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onGetTagInfoHanler(Object o, EnumResults enumResults, int i, String s, int i1, int i2, String s1, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onGetMulipleBlocksSecStatusHandler(Object o, EnumResults enumResults, int i, ArrayList<EnumSecStatus> arrayList, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onInventoryMultipleBlocksHandler(Object o, EnumResults enumResults, EnumTagType enumTagType, int i, String s, int i1, ArrayList<EnumSecStatus> arrayList, ArrayList<String> arrayList1, int i2, EnumReaderStatus enumReaderStatus, CommunicatorStruct communicatorStruct) {
+
+    }
+}

+ 607 - 0
app/src/main/java/com/jsw/jswlibrary/FaceAuthReaderActivity.java

@@ -0,0 +1,607 @@
+package com.jsw.jswlibrary;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.PorterDuff;
+import android.graphics.RectF;
+import android.hardware.Camera;
+import android.os.Bundle;
+import android.os.Looper;
+import android.view.TextureView;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.baidu.idl.main.facesdk.FaceInfo;
+import com.baidu.idl.main.facesdk.model.BDFaceImageInstance;
+import com.jsw.jswlibrary.faceregist.api.FaceApi;
+import com.jsw.jswlibrary.faceregist.callback.CameraDataCallback;
+import com.jsw.jswlibrary.faceregist.callback.FaceDetectCallBack;
+import com.jsw.jswlibrary.faceregist.camera.AutoTexturePreviewView;
+import com.jsw.jswlibrary.faceregist.camera.CameraPreviewManager;
+import com.jsw.jswlibrary.faceregist.view.CircleImageView;
+import com.jsw.jswlibrary.listener.SdkInitListener;
+import com.jsw.jswlibrary.model.LivenessModel;
+import com.jsw.jswlibrary.model.SingleBaseConfig;
+import com.jsw.jswlibrary.model.User;
+import com.jsw.jswlibrary.utils.BitmapUtils;
+import com.jsw.jswlibrary.utils.DensityUtils;
+import com.jsw.jswlibrary.utils.FaceOnDrawTexturViewUtil;
+import com.jsw.jswlibrary.utils.FileUtils;
+import com.jsw.jswlibrary.utils.HttpUtils;
+import com.jsw.jswlibrary.utils.ToastUtils;
+
+import java.util.Map;
+
+
+public class FaceAuthReaderActivity extends BaseActivity implements View.OnClickListener {
+
+    // 图片越大,性能消耗越大,也可以选择640*480, 1280*720
+    private static final int PREFER_WIDTH = SingleBaseConfig.getBaseConfig().getRgbAndNirWidth();
+    private static final int PERFER_HEIGH = SingleBaseConfig.getBaseConfig().getRgbAndNirHeight();
+    private Context mContext;
+
+    private TextureView mDrawDetectFaceView;
+    private AutoTexturePreviewView mAutoCameraPreviewView;
+    private ImageView mFaceDetectImageView;
+    private TextView mTvDetect;
+    private TextView mTvLive;
+    private TextView mTvLiveScore;
+    private TextView mTvFeature;
+    private TextView mTvAll;
+    private TextView mTvAllTime;
+
+    private RectF rectF;
+    private Paint paint;
+    private RelativeLayout relativeLayout;
+    private int mLiveType;
+    private float mRgbLiveScore;
+
+    private boolean isCheck = false;
+    private boolean isCompareCheck = false;
+    private TextView preText;
+    //private TextView deveLop;
+    private RelativeLayout preViewRelativeLayout;
+    private RelativeLayout deveLopRelativeLayout;
+
+    private CircleImageView nameImage;
+    private TextView nameText;
+    private RelativeLayout userNameLayout;
+    private TextView detectSurfaceText;
+    private ImageView isCheckImage;
+
+
+    private TextView attendanceTimeText;
+    private RelativeLayout outRelativelayout;
+    private ImageView previewView;
+    //private ImageView developView;
+    private TextView mNum;
+    private Paint paintBg;
+    private RelativeLayout layoutCompareStatus;
+    private TextView textCompareStatus;
+    private User mUser;
+    private String toPage;
+    private boolean flag = true;
+    private Activity activity;
+    private CameraPreviewManager cameraPreviewManager ;
+    private long time = System.currentTimeMillis();
+    public boolean THREAD_RUNNING = true;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mContext = this;
+        activity = this;
+        //initListener();
+        com.jsw.jswlibrary.faceregist.FaceSDKManager.getInstance().initDataBases(this);
+        setContentView(R.layout.activity_faceauthreader);
+        initView();
+        toPage = getIntent().getStringExtra("toPage");
+        Button r = findViewById(R.id.facecheck_return);
+        r.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                finish();
+            }
+        });
+        // 屏幕的宽
+        int displayWidth = DensityUtils.getDisplayWidth(mContext);
+        // 屏幕的高
+        int displayHeight = DensityUtils.getDisplayHeight(mContext);
+        // 当屏幕的宽大于屏幕宽时
+        /*if (displayHeight < displayWidth) {
+            // 获取高
+            int height = displayHeight;
+            // 获取宽
+            int width = (int) (displayHeight * ((9.0f / 16.0f)));
+            // 设置布局的宽和高
+            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(width, height);
+            // 设置布局居中
+            params.gravity = Gravity.CENTER;
+            relativeLayout.setLayoutParams(params);
+        }*/
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                while(THREAD_RUNNING){
+                    try {
+                        Thread.sleep(1000);
+                        if(System.currentTimeMillis()-time>10000){
+                            if(cameraPreviewManager!= null){
+                                cameraPreviewManager.stopPreview();
+                            }
+                            Thread.sleep(2000);
+                            finish();
+                            break;
+                        }
+
+                    }catch(Exception e){
+
+                    }
+                }
+
+            }
+        }).start();
+    }
+
+    private void initListener() {
+        if (FaceSDKManager.initStatus != FaceSDKManager.SDK_MODEL_LOAD_SUCCESS) {
+            com.jsw.jswlibrary.faceregist.FaceSDKManager.getInstance().initModel(this, new SdkInitListener() {
+                @Override
+                public void initStart() {
+                }
+
+                @Override
+                public void initLicenseSuccess() {
+                }
+
+                @Override
+                public void initLicenseFail(int errorCode, String msg) {
+                }
+
+                @Override
+                public void initModelSuccess() {
+                    com.jsw.jswlibrary.faceregist.FaceSDKManager.initModelSuccess = true;
+                    //ToastUtils.toast(FaceAuthReaderActivity.this, "模型加载成功,欢迎使用");
+                    //Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
+                }
+
+                @Override
+                public void initModelFail(int errorCode, String msg) {
+                    com.jsw.jswlibrary.faceregist.FaceSDKManager.initModelSuccess = false;
+                    if (errorCode != -12) {
+                        ToastUtils.toast(FaceAuthReaderActivity.this, "模型加载失败,请尝试重启应用");
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * View
+     */
+    private void initView() {
+        // 获取整个布局
+        relativeLayout = findViewById(R.id.all_relative_my);
+        // 画人脸框
+        rectF = new RectF();
+        paint = new Paint();
+        paintBg = new Paint();
+        mDrawDetectFaceView = findViewById(R.id.draw_detect_face_view);
+        mDrawDetectFaceView.setOpaque(false);
+        mDrawDetectFaceView.setKeepScreenOn(true);
+        // 单目摄像头RGB 图像预览
+        mAutoCameraPreviewView = findViewById(R.id.auto_camera_preview_view);
+        // 返回
+        ImageView mButReturn = findViewById(R.id.btn_back);
+        mButReturn.setOnClickListener(this);
+
+        layoutCompareStatus = findViewById(R.id.layout_compare_status);
+        layoutCompareStatus.setVisibility(View.GONE);
+        textCompareStatus = findViewById(R.id.text_compare_status);
+
+        // ***************开发模式*************
+        isCheckImage = findViewById(R.id.is_check_image);
+        // 活体状态
+        mLiveType = SingleBaseConfig.getBaseConfig().getType();
+        // 活体阈值
+        mRgbLiveScore = SingleBaseConfig.getBaseConfig().getRgbLiveScore();
+        // 送检RGB 图像回显
+        mFaceDetectImageView = findViewById(R.id.face_detect_image_view);
+        mFaceDetectImageView.setVisibility(View.VISIBLE);
+        // 存在底库的数量
+        mNum = findViewById(R.id.tv_num);
+        mNum.setText(String.format("底库 : %s 个样本", FaceApi.getInstance().getmUserNum()));
+
+        // 检测耗时
+        mTvDetect = findViewById(R.id.tv_detect_time);
+        // RGB活体
+        mTvLive = findViewById(R.id.tv_rgb_live_time);
+        mTvLiveScore = findViewById(R.id.tv_rgb_live_score);
+        // 特征提取
+        mTvFeature = findViewById(R.id.tv_feature_time);
+        // 检索
+        mTvAll = findViewById(R.id.tv_feature_search_time);
+        // 总耗时
+        mTvAllTime = findViewById(R.id.tv_all_time);
+
+
+        // ***************预览模式*************
+
+        userNameLayout = findViewById(R.id.user_name_layout);
+        nameImage = findViewById(R.id.detect_reg_image_item);
+        nameText = findViewById(R.id.name_text);
+        detectSurfaceText = findViewById(R.id.detect_surface_text);
+        mFaceDetectImageView.setVisibility(View.GONE);
+        detectSurfaceText.setVisibility(View.GONE);
+
+
+        attendanceTimeText = findViewById(R.id.attendance_time_text);
+        outRelativelayout = findViewById(R.id.out_relativelayout);
+
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        startTestOpenDebugRegisterFunction();
+    }
+
+    private void startTestOpenDebugRegisterFunction() {
+        // TODO : 临时放置
+        //  CameraPreviewManager.getInstance().setCameraFacing(CameraPreviewManager.CAMERA_USB);
+        cameraPreviewManager = CameraPreviewManager.getInstance();
+        //cameraPreviewManager.setCameraFacing(CameraPreviewManager.CAMERA_FACING_FRONT);
+        //cameraPreviewManager.setCameraFacing(CameraPreviewManager.CAMERA_FACING_BACK);
+
+        if(model_camear_facing == 0){
+            // 设置前置摄像头
+            CameraPreviewManager.getInstance().setCameraFacing(CameraPreviewManager.CAMERA_FACING_FRONT);
+        }else if(model_camear_facing == 1){
+            // 设置后置摄像头
+            CameraPreviewManager.getInstance().setCameraFacing(CameraPreviewManager.CAMERA_FACING_BACK);
+        }else{
+            // 设置USB摄像头
+            // CameraPreviewManager.getInstance().setCameraFacing(CameraPreviewManager.CAMERA_USB);
+        }
+
+        cameraPreviewManager.startPreview(mContext, mAutoCameraPreviewView,
+                PREFER_WIDTH, PERFER_HEIGH, new CameraDataCallback() {
+                    @Override
+                    public void onGetCameraData(byte[] data, Camera camera, int width, int height) {
+                        //摄像头预览数据进行人脸检测
+                        com.jsw.jswlibrary.faceregist.FaceSDKManager.getInstance().onDetectCheck(data, null, null,
+                                height, width, mLiveType, new FaceDetectCallBack() {
+                                    @Override
+                                    public void onFaceDetectCallback(LivenessModel livenessModel) {
+                                        // 预览模式
+                                        checkCloseDebugResult(livenessModel);
+
+                                        // 开发模式
+                                        checkOpenDebugResult(livenessModel);
+                                    }
+
+                                    @Override
+                                    public void onTip(int code, String msg) {
+                                    }
+
+                                    @Override
+                                    public void onFaceDetectDarwCallback(LivenessModel livenessModel) {
+                                        // 绘制人脸框
+                                        showFrame(livenessModel);
+
+
+                                    }
+                                });
+                    }
+                });
+    }
+
+    // ***************预览模式结果输出*************
+    private void checkCloseDebugResult(final LivenessModel livenessModel) {
+        // 当未检测到人脸UI显示
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+
+                if (livenessModel == null) {
+
+                    userNameLayout.setVisibility(View.GONE);
+                    return;
+                }
+                final User user = livenessModel.getUser();
+                if (user == null) {
+                    mUser = null;
+
+                    userNameLayout.setVisibility(View.VISIBLE);
+                    nameImage.setImageResource(R.mipmap.ic_tips_fail);
+                    nameText.setTextColor(Color.parseColor("#fec133"));
+                    nameText.setText("识别失败");
+                    attendanceTimeText.setText("持续识别中......");
+
+                } else {
+                    if(flag == false){
+                        return;
+                    }
+                    flag = false;
+                    mUser = user;
+                    cameraPreviewManager.stopPreview();
+
+                    userNameLayout.setVisibility(View.VISIBLE);
+                    String absolutePath = FileUtils.getBatchImportSuccessDirectory()
+                            + "/" + user.getImageName();
+                    Bitmap bitmap = BitmapFactory.decodeFile(absolutePath);
+                    nameImage.setImageBitmap(bitmap);
+                    nameText.setTextColor(Color.parseColor("#00BAF2"));
+                    nameText.setText(user.getUserName() + " 识别成功");
+                    new Thread(new Runnable() {
+                        @Override
+                        public void run() {
+                            if ("jieshu".equals(toPage)) {
+                                Map res = HttpUtils.requestGet("/api/smartLibrary/queryReaderInfo?readerCardId="+user.getUserName(),activity);
+                                if((Integer)res.get("code") == 200){
+                                    SharedPreferences sp = getSharedPreferences("reader", Context.MODE_PRIVATE);
+                                    SharedPreferences.Editor editor = sp.edit();
+                                    editor.putString("readerCardId", user.getUserName());
+                                    editor.putString("readername", ((Map)res.get("data")).get("realname")+"");
+                                    editor.commit();
+                                    try{
+                                        Thread.sleep(200);
+                                    }catch(Exception e){
+
+                                    }
+                                    finish();
+                                    startActivity(new Intent(FaceAuthReaderActivity.this, JieshuActivity.class));
+
+                                }else if((Integer)res.get("code") == 333){
+
+                                    Looper.prepare();
+                                    Toast.makeText(FaceAuthReaderActivity.this, "网络异常,请检查是否配置了云参数!", Toast.LENGTH_SHORT).show();
+                                    Looper.loop();
+                                }
+                                else{
+                                    finish();
+                                    startActivity(new Intent(FaceAuthReaderActivity.this, JswHomeActivity.class));
+                                    Looper.prepare();
+                                    Toast.makeText(FaceAuthReaderActivity.this, ""+res.get("msg"), Toast.LENGTH_LONG).show();
+                                    Looper.loop();
+                                }
+                            }else if("myjieyue".equals(toPage)){
+                                Map res = HttpUtils.requestGet("/api/smartLibrary/queryReaderInfo_jieyuelist?readerCardId="+user.getUserName(),activity);
+                                if((Integer)res.get("code") == 200){
+                                    SharedPreferences sp = getSharedPreferences("reader", Context.MODE_PRIVATE);
+                                    SharedPreferences.Editor editor = sp.edit();
+                                    editor.putString("readerCardId", user.getUserName());
+                                    editor.putString("readername", ((Map)res.get("data")).get("realname")+"");
+                                    try{
+                                        Thread.sleep(200);
+                                    }catch(Exception e) {
+
+                                    }
+                                    editor.commit();
+                                    finish();
+                                    startActivity(new Intent(FaceAuthReaderActivity.this, MyjieyueActivity.class));
+                                }else if((Integer)res.get("code") == 333){
+
+                                    Looper.prepare();
+                                    Toast.makeText(FaceAuthReaderActivity.this, "网络异常,请检查是否配置了云参数!", Toast.LENGTH_SHORT).show();
+                                    Looper.loop();
+                                }
+                                else{
+                                    finish();
+                                    startActivity(new Intent(FaceAuthReaderActivity.this, JswHomeActivity.class));
+                                    Looper.prepare();
+                                    Toast.makeText(FaceAuthReaderActivity.this, ""+res.get("msg"), Toast.LENGTH_SHORT).show();
+                                    Looper.loop();
+                                }
+                            }
+
+
+                        }
+                    }).start();
+                }
+
+            }
+        });
+    }
+
+    // ***************开发模式结果输出*************
+    private void checkOpenDebugResult(final LivenessModel livenessModel) {
+
+        // 当未检测到人脸UI显示
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                if (livenessModel == null) {
+                    layoutCompareStatus.setVisibility(View.GONE);
+                    isCheckImage.setVisibility(View.GONE);
+                    mFaceDetectImageView.setImageResource(R.mipmap.ic_image_video);
+                    mTvDetect.setText(String.format("检测耗时 :%s ms", 0));
+                    mTvLive.setText(String.format("RGB活体检测耗时 :%s ms", 0));
+                    mTvLiveScore.setText(String.format("RGB活体得分 :%s", 0));
+                    mTvFeature.setText(String.format("特征抽取耗时 :%s ms", 0));
+                    mTvAll.setText(String.format("特征比对耗时 :%s ms", 0));
+                    mTvAllTime.setText(String.format("总耗时 :%s ms", 0));
+                    return;
+                }
+
+                BDFaceImageInstance image = livenessModel.getBdFaceImageInstance();
+                if (image != null) {
+                    mFaceDetectImageView.setImageBitmap(BitmapUtils.getInstaceBmp(image));
+                    image.destory();
+                }
+                if (mLiveType == 0) {
+                    User user = livenessModel.getUser();
+                    if (user == null) {
+                        mUser = null;
+                        if (isCompareCheck) {
+                            layoutCompareStatus.setVisibility(View.VISIBLE);
+                            textCompareStatus.setTextColor(Color.parseColor("#fec133"));
+                            textCompareStatus.setText("识别未通过");
+                        }
+                    } else {
+                        mUser = user;
+                        if (isCompareCheck) {
+                            layoutCompareStatus.setVisibility(View.VISIBLE);
+                            textCompareStatus.setTextColor(Color.parseColor("#00BAF2"));
+                            textCompareStatus.setText("识别通过");
+                        }
+                    }
+
+                } else {
+                    float rgbLivenessScore = livenessModel.getRgbLivenessScore();
+                    if (rgbLivenessScore < mRgbLiveScore) {
+                        if (isCheck) {
+                            isCheckImage.setVisibility(View.VISIBLE);
+                            isCheckImage.setImageResource(R.mipmap.ic_icon_develop_fail);
+                        }
+
+                        if (isCompareCheck) {
+                            layoutCompareStatus.setVisibility(View.VISIBLE);
+                            textCompareStatus.setTextColor(Color.parseColor("#fec133"));
+                            textCompareStatus.setText("识别未通过");
+                        }
+
+                    } else {
+                        if (isCheck) {
+                            isCheckImage.setVisibility(View.VISIBLE);
+                            isCheckImage.setImageResource(R.mipmap.ic_icon_develop_success);
+                        }
+                        User user = livenessModel.getUser();
+                        if (user == null) {
+                            mUser = null;
+                            if (isCompareCheck) {
+                                layoutCompareStatus.setVisibility(View.VISIBLE);
+                                textCompareStatus.setTextColor(Color.parseColor("#fec133"));
+                                textCompareStatus.setText("识别未通过");
+                            }
+                        } else {
+                            mUser = user;
+                            if (isCompareCheck) {
+                                layoutCompareStatus.setVisibility(View.VISIBLE);
+                                textCompareStatus.setTextColor(Color.parseColor("#00BAF2"));
+                                textCompareStatus.setText("识别通过");
+                            }
+                        }
+                    }
+                }
+                mTvDetect.setText(String.format("检测耗时 :%s ms", livenessModel.getRgbDetectDuration()));
+                mTvLive.setText(String.format("RGB活体检测耗时 :%s ms", livenessModel.getRgbLivenessDuration()));
+                mTvLiveScore.setText(String.format("RGB活体得分 :%s", livenessModel.getRgbLivenessScore()));
+                mTvFeature.setText(String.format("特征抽取耗时 :%s ms", livenessModel.getFeatureDuration()));
+                mTvAll.setText(String.format("特征比对耗时 :%s ms", livenessModel.getCheckDuration()));
+                mTvAllTime.setText(String.format("总耗时 :%s ms", livenessModel.getAllDetectDuration()));
+            }
+        });
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        // 返回
+        if (id == R.id.btn_back) {
+            if (!com.jsw.jswlibrary.faceregist.FaceSDKManager.initModelSuccess) {
+                Toast.makeText(mContext, "SDK正在加载模型,请稍后再试",
+                        Toast.LENGTH_LONG).show();
+                return;
+            }
+            finish();
+            // 设置
+        } /*else if (id == R.id.btn_setting) {
+            if (!FaceSDKManager.initModelSuccess) {
+                Toast.makeText(mContext, "SDK正在加载模型,请稍后再试",
+                        Toast.LENGTH_LONG).show();
+                return;
+            }
+            startActivity(new Intent(mContext, AttendanceSettingActivity.class));
+            finish();
+        }*/ /*else if (id == R.id.preview_text) {
+            isCheckImage.setVisibility(View.GONE);
+            mFaceDetectImageView.setVisibility(View.GONE);
+            detectSurfaceText.setVisibility(View.GONE);
+            previewView.setVisibility(View.VISIBLE);
+            //developView.setVisibility(View.GONE);
+            layoutCompareStatus.setVisibility(View.GONE);
+            //deveLop.setTextColor(Color.parseColor("#a9a9a9"));
+            preText.setTextColor(Color.parseColor("#ffffff"));
+            preViewRelativeLayout.setVisibility(View.VISIBLE);
+            deveLopRelativeLayout.setVisibility(View.GONE);
+            outRelativelayout.setVisibility(View.VISIBLE);
+            isCheck = false;
+            isCompareCheck = false;
+        } *//*else if (id == R.id.develop_text) {
+            isCheck = true;
+            isCompareCheck = true;
+            isCheckImage.setVisibility(View.VISIBLE);
+            mFaceDetectImageView.setVisibility(View.VISIBLE);
+            detectSurfaceText.setVisibility(View.VISIBLE);
+            previewView.setVisibility(View.GONE);
+            //developView.setVisibility(View.VISIBLE);
+            //deveLop.setTextColor(Color.parseColor("#ffffff"));
+            preText.setTextColor(Color.parseColor("#a9a9a9"));
+            deveLopRelativeLayout.setVisibility(View.VISIBLE);
+            preViewRelativeLayout.setVisibility(View.GONE);
+            outRelativelayout.setVisibility(View.GONE);
+        }*/
+    }
+
+    /**
+     * 绘制人脸框
+     */
+    private void showFrame(final LivenessModel model) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Canvas canvas = mDrawDetectFaceView.lockCanvas();
+                if (canvas == null) {
+                    mDrawDetectFaceView.unlockCanvasAndPost(canvas);
+                    return;
+                }
+                if (model == null) {
+                    // 清空canvas
+                    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
+                    mDrawDetectFaceView.unlockCanvasAndPost(canvas);
+                    return;
+                }
+                FaceInfo[] faceInfos = model.getTrackFaceInfo();
+                if (faceInfos == null || faceInfos.length == 0) {
+                    // 清空canvas
+                    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
+                    mDrawDetectFaceView.unlockCanvasAndPost(canvas);
+                    return;
+                }
+                canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
+                FaceInfo faceInfo = faceInfos[0];
+
+                rectF.set(FaceOnDrawTexturViewUtil.getFaceRectTwo(faceInfo));
+                // 检测图片的坐标和显示的坐标不一样,需要转换。
+                FaceOnDrawTexturViewUtil.mapFromOriginalRect(rectF,
+                        mAutoCameraPreviewView, model.getBdFaceImageInstance());
+                // 人脸框颜色
+                FaceOnDrawTexturViewUtil.drawFaceColor(mUser, paint, paintBg, model);
+                // 绘制人脸框
+                FaceOnDrawTexturViewUtil.drawCircle(canvas, mAutoCameraPreviewView,
+                        rectF, paint, paintBg, faceInfo);
+                // 清空canvas
+                mDrawDetectFaceView.unlockCanvasAndPost(canvas);
+            }
+        });
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();THREAD_RUNNING = false;
+    }
+
+
+}

+ 140 - 0
app/src/main/java/com/jsw/jswlibrary/FaceSDKManager.java

@@ -0,0 +1,140 @@
+package com.jsw.jswlibrary;
+
+import android.content.Context;
+import android.text.TextUtils;
+
+
+
+import com.baidu.idl.main.facesdk.FaceAuth;
+import com.baidu.idl.main.facesdk.callback.Callback;
+import com.baidu.idl.main.facesdk.license.BDFaceLicenseAuthInfo;
+import com.baidu.idl.main.facesdk.model.BDFaceSDKCommon;
+import com.baidu.idl.main.facesdk.utils.PreferencesUtil;
+import com.jsw.jswlibrary.listener.SdkInitListener;
+import com.jsw.jswlibrary.utils.ToastUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+public class FaceSDKManager {
+
+    public static final int SDK_MODEL_LOAD_SUCCESS = 0;
+    public static final int SDK_UNACTIVATION = 1;
+    public static final int SDK_UNINIT = 2;
+    public static final int SDK_INITING = 3;
+    public static final int SDK_INITED = 4;
+    public static final int SDK_INIT_FAIL = 5;
+    public static final int SDK_INIT_SUCCESS = 6;
+
+    public static volatile int initStatus = SDK_UNACTIVATION;
+    private FaceAuth faceAuth;
+
+
+    private FaceSDKManager() {
+        faceAuth = new FaceAuth();
+        faceAuth.setActiveLog(BDFaceSDKCommon.BDFaceLogInfo.BDFACE_LOG_TYPE_ALL, 1);
+        faceAuth.setCoreConfigure(BDFaceSDKCommon.BDFaceCoreRunMode.BDFACE_LITE_POWER_LOW, 2);
+
+    }
+
+    private static class HolderClass {
+        private static final FaceSDKManager instance = new FaceSDKManager();
+    }
+
+    public static FaceSDKManager getInstance() {
+        return HolderClass.instance;
+    }
+    /**
+     * 初始化鉴权,如果鉴权通过,直接初始化模型
+     *
+     * @param context
+     * @param listener
+     */
+    public void init(final Context context, final SdkInitListener listener) {
+
+        PreferencesUtil.initPrefs(context.getApplicationContext());
+        final String licenseOfflineKey = PreferencesUtil.getString("activate_offline_key", "");
+        final String licenseOnlineKey = PreferencesUtil.getString("activate_online_key", "");
+        final String licenseBatchlineKey = PreferencesUtil.getString("activate_batchline_key", "");
+
+        // 如果licenseKey 不存在提示授权码为空,并跳转授权页面授权
+        if (TextUtils.isEmpty(licenseOfflineKey) && TextUtils.isEmpty(licenseOnlineKey)
+                && TextUtils.isEmpty(licenseBatchlineKey)) {
+            ToastUtils.toast(context, "未授权设备,请完成授权激活");
+            if (listener != null) {
+                listener.initLicenseFail(-1, "授权码不存在,请重新输入!");
+            }
+            return;
+        }
+        // todo 增加判空处理
+        if (listener != null) {
+            listener.initStart();
+        }
+
+        if (!TextUtils.isEmpty(licenseOnlineKey)) {
+            // 在线激活
+            faceAuth.initLicenseOnLine(context, licenseOnlineKey, new Callback() {
+                @Override
+                public void onResponse(int code, String response) {
+                    if (code == 0) {
+                        initStatus = SDK_INIT_SUCCESS;
+                        if (listener != null) {
+                            listener.initLicenseSuccess();
+                        }
+//                        initModel(context, listener);
+                        return;
+                    } else {
+                        listener.initLicenseFail(code, response);
+                    }
+                }
+            });
+        } else if (!TextUtils.isEmpty(licenseOfflineKey)) {
+            // 离线激活
+            faceAuth.initLicenseOffLine(context, new Callback() {
+                @Override
+                public void onResponse(int code, String response) {
+                    if (code == 0) {
+                        initStatus = SDK_INIT_SUCCESS;
+                        if (listener != null) {
+                            listener.initLicenseSuccess();
+                        }
+//                        initModel(context, listener);
+                        return;
+                    } else {
+                        listener.initLicenseFail(code, response);
+                    }
+                }
+            });
+        } else if (!TextUtils.isEmpty(licenseBatchlineKey)) {
+            // 应用激活
+            faceAuth.initLicenseBatchLine(context, licenseBatchlineKey, new Callback() {
+                @Override
+                public void onResponse(int code, String response) {
+                    if (code == 0) {
+                        initStatus = SDK_INIT_SUCCESS;
+                        if (listener != null) {
+                            listener.initLicenseSuccess();
+                        }
+//                        initModel(context, listener);
+                        return;
+                    } else {
+                        listener.initLicenseFail(code, response);
+                    }
+                }
+            });
+        } else {
+            if (listener != null) {
+                listener.initLicenseFail(-1, "授权码不存在,请重新输入!");
+            }
+        }
+    }
+
+    public String getLicenseData(Context context) {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
+        BDFaceLicenseAuthInfo bdFaceLicenseAuthInfo = faceAuth.getAuthInfo(context);
+        Date dateLong = new Date(bdFaceLicenseAuthInfo.expireTime * 1000L);
+        String dateTime = simpleDateFormat.format(dateLong);
+        return dateTime;
+    }
+}

+ 443 - 0
app/src/main/java/com/jsw/jswlibrary/HuanshuActivity.java

@@ -0,0 +1,443 @@
+package com.jsw.jswlibrary;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.text.InputType;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TableLayout;
+import android.widget.TableRow;
+import android.widget.TextView;
+import android.widget.Toast;
+
+
+import androidx.annotation.NonNull;
+
+import com.jsw.jswlibrary.common.MyTimer;
+import com.jsw.jswlibrary.common.PubData;
+import com.jsw.jswlibrary.utils.HttpUtils;
+import com.rightin.reader.hf.CommunicatorStruct;
+import com.rightin.reader.hf.myhf.HfConnector;
+import com.rightin.reader.hf.myhf.HfReader;
+import com.rightin.reader.hf.rfidenum.EnumModuleState;
+import com.rightin.reader.hf.rfidenum.EnumReaderStatus;
+import com.rightin.reader.hf.rfidenum.EnumResults;
+import com.rightin.reader.hf.rfidenum.EnumRfidCommand;
+import com.rightin.reader.hf.rfidenum.EnumSecStatus;
+import com.rightin.reader.hf.rfidenum.EnumTagType;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+
+public class HuanshuActivity extends BaseActivity implements HfReader.OnHfReaderListener, HfConnector.OnHfReaderListener, MyTimer.OnTimerTickListener{
+
+    protected final List<Map> list = new ArrayList();
+    private TableLayout huanshutable;
+    final Activity activity = this;
+
+    private int borderColor=Color.parseColor("#ececec");
+    private Map<String, Map> bookMap = new HashMap<>();
+    private List<String> taglist ;
+    //private boolean THREAD_RUNNING = false;
+    long submittime = 0;
+    private int i = 5;
+
+    boolean isOnclick_jieshu = false;
+    boolean isOnclick_return = false;
+    boolean isover_jieshu = false;
+    TextView daojishi;
+    int daojishinum = 4;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_huanshu);
+        createTopView();
+        list.clear();
+        //THREAD_RUNNING = true;
+        //UPDATE_UI_FLAG = true;
+        taglist = new ArrayList();
+        daojishi = findViewById(R.id.daojishi);
+        huanshutable = findViewById(R.id.huanshutable);
+        huanshutable.setStretchAllColumns(true);
+        HfReader.fix_name = chuankouhao_fix_name_rfid;
+        PubData.reader.setOnHfReaderListener(this);
+        PubData.reader.getMySerial().mDevNum = chuankouhao_rfid;
+        PubData.reader.open();
+        PubData.reader.setBaudRate(botelv_rfid);
+        PubData.reader._is_inventory = false;//是否持续读
+        PubData.reader.updateReadState(EnumModuleState.WORK);
+        PubData.reader.setReaderAddress((byte)1);//天线1
+        PubData.reader.inventory();
+        final Button huanshu_action = findViewById(R.id.huanshu_action);
+        huanshu_action.setOnClickListener(new View.OnClickListener() {
+
+            @Override
+            public void onClick(View v) {
+                //System.out.println("点击了还书.....");
+                //PubData.reader.stopInventory();
+
+                huanshu_action.setEnabled(false);
+                isOnclick_jieshu = true;
+                //THREAD_RUNNING = false;
+                if(submittime != 0 && System.currentTimeMillis()-submittime<1000){
+                    System.out.println("重复提交");
+                    return;
+                }
+                submittime = System.currentTimeMillis();
+
+            }
+        });
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                while(i>0){
+                    try {
+                        Thread.sleep(1000);
+                        i--;
+                        if(i == 0){
+                            closeAll();
+                        }
+                    }catch(Exception e){
+
+                    }
+                }
+
+
+                //倒计时3秒
+
+            }
+        }).start();
+
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        taglist = new ArrayList();
+
+    }
+
+    private void doHuanshuAction(){
+
+
+        new Thread(new Runnable(){
+            @Override
+            public void run() {
+                try {
+                    Thread.sleep(1000);
+                    for (int i = 0; i < list.size(); i++) {
+                        Map map = list.get(i);
+                        String rfid = (String) map.get("rfid");
+                        String status = map.get("status") + "";
+                        if (status.equals("")) {
+                            Map res = HttpUtils.requestGet("/api/smartLibrary/returnBooks?libraryid=" + libraryid + "&bookrfid=" + rfid, activity);
+                            if ((Integer) res.get("code") == 200) {
+                                System.out.println("准备修改afi");
+                                boolean f = reWriteAfi(rfid, 7);
+                                map.put("status", "还书成功");
+                                map.put("action", "1");
+                                map.put("f", f);
+                            } else {
+                                map.put("status", res.get("msg"));
+                                map.put("action", "0");
+                            }
+                        }
+                    }
+                    isOnclick_jieshu = false;
+                    isover_jieshu = true;
+                    mHandler.sendEmptyMessage(1);
+                    i = 5;
+                }catch(Exception e){
+                    e.printStackTrace();
+                }finally {
+
+                }
+
+                //System.out.println("还书按钮线程####################结束"+hhsss_format.format(new Date()));
+            }
+        }).start();
+
+    }
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+
+    }
+
+    private void closeAll(){
+        try {
+            submittime = 0;
+            System.out.println("HuanshuActivity执行销毁" + hhsss_format.format(new Date()));
+            //THREAD_RUNNING = false;
+            PubData.reader.stopInventory();
+            PubData.reader.close();
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try{
+                        while(daojishinum>0) {
+                            Thread.sleep(1000);
+                            daojishinum--;
+                            daojishihandler.sendEmptyMessage(1);
+
+                        }
+                        finish();
+                    }catch(Exception e){
+
+                    }
+                }
+            }).start();
+
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+    }
+    private void loadBookInfo(){
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                List<Map> tempList = new ArrayList<>();
+                tempList.addAll(list);
+
+                for(Map m : tempList){
+                    boolean is = false;
+                    for(String a : taglist) {
+                        if(a.equals((String)m.get("rfid"))){
+                            is = true;
+                        }
+                    }
+                    if(is == false){
+                        list.remove(m);
+                        bookMap.remove((String)m.get("rfid"));
+                    }
+                }
+
+                for(String a : taglist) {
+                    try {
+
+                        Map data = bookMap.get(a);
+                        if(data == null){
+                            Map res = HttpUtils.requestGet("/api/smartLibrary_rfid/queryBookInfo?bookId=" + a, activity);
+                            if((int)res.get("code") == 200) {
+                                data = (Map) res.get("data");
+                                bookMap.put(a, data);
+                                int status = (int)data.get("status");//图书状态,非请求状态
+                                if (status == 0) {
+                                    ((Map) res.get("data")).put("status", "未找到借阅记录");
+                                }else if(status == 1){
+                                    ((Map) res.get("data")).put("status", "");
+                                }else{
+                                    ((Map) res.get("data")).put("status", "该书状态异常");
+                                }
+                                list.add(data);
+                            }
+
+                        }
+
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+
+                }
+                mHandler.sendEmptyMessage(1);
+
+            }
+        }).start();
+
+    }
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
+        }
+        return super.dispatchKeyEvent(event);
+    }
+    Handler mHandler = new Handler(){
+        @Override
+        public void handleMessage(Message msg){
+            huanshutable.removeAllViews();
+            List<Map> tempList = new ArrayList();
+            tempList.addAll(list);
+
+            for(int i=0;i<tempList.size();i++){
+                Map data = tempList.get(i);
+                TableRow row = new TableRow(getApplicationContext());row.setBackgroundColor(borderColor);
+                if(i%2 == 1){
+                    row.setBackgroundColor(Color.parseColor("#f6f6f6"));
+                }
+                row.setBottom(1);
+                TextView barcode= new TextView(getApplicationContext());
+                barcode.setWidth(184);
+                barcode.setTextSize(24);
+                barcode.setGravity(0x11);barcode.setHeight(60);barcode.setTextColor(Color.parseColor("#333333"));
+                TextView ztm = new TextView(getApplicationContext());
+                ztm.setWidth(185);ztm.setTextSize(24);
+                ztm.setGravity(0x11);ztm.setHeight(60);ztm.setTextColor(Color.parseColor("#333333"));
+                TextView createtime = new TextView(getApplicationContext());
+                createtime.setWidth(184);
+                createtime.setGravity(0x11);createtime.setHeight(60);createtime.setTextColor(Color.parseColor("#333333"));
+                TextView author = new TextView(getApplicationContext());
+                author.setWidth(184);author.setTextSize(24);
+                author.setGravity(0x11);author.setHeight(60);author.setTextColor(Color.parseColor("#333333"));
+                TextView status=  new TextView(getApplicationContext());
+                status.setWidth(184);status.setTextSize(24);
+                status.setGravity(0x11);status.setHeight(60);status.setTextColor(Color.parseColor("#333333"));
+
+                barcode.setText(((String)data.get("barcode")).trim());
+                row.addView(barcode);
+                ztm.setText(((String)data.get("title")).trim());
+                row.addView(ztm);
+                String time = "";
+                if("".equals((String)data.get("status")) || "还书成功".equals((String)data.get("status"))){
+                    time = data.get("createtime")+"";
+                }
+                createtime.setText(time);createtime.setTextSize(24);
+                row.addView(createtime);
+                author.setText(((String)data.get("author")).trim());
+                row.addView(author);
+                status.setText((String)data.get("status"));
+                if("还书成功".equals((String)data.get("status"))){
+                    status.setTextColor(Color.parseColor("#008B00"));
+                }else{
+                    status.setTextColor(Color.RED);
+                }
+                row.addView(status);
+
+                row.setPadding(2,2,2,2);
+                huanshutable.addView(row);
+            }
+            taglist.clear();
+            //list.clear();
+
+            if(isOnclick_jieshu ) {
+                doHuanshuAction();
+            }else {
+                if(isover_jieshu == false) {
+                    try {
+                        PubData.reader.updateReadState(EnumModuleState.WORK);
+                        PubData.reader.inventory();
+                    } catch (Exception e) {
+                        System.out.println("报错啦。。。。。");
+                        e.printStackTrace();
+                    }
+                }else{
+                    i=-100;
+                    closeAll();
+                }
+            }
+
+            //barcode.requestFocus();
+        }
+    };
+
+
+
+
+    @Override
+    public void onTick(String s) {
+    }
+
+    //region 读写器事件
+    @Override
+    public void onDataSendedHandler(Object o, byte[] bytes) {
+
+    }
+
+    @Override
+    public void onDataBaseReceivedHandler(Object o, byte[] bytes) {
+
+    }
+
+    @Override
+    public void onDataReceivedHandler(Object sender, byte[] buffer) {
+    }
+
+    @Override
+    public void onDataErrorHandler(String s) {
+
+    }
+
+    @Override
+    public void onResponseListHandler(Object o, ArrayList<Byte> arrayList) {
+
+    }
+
+    @Override
+    public void onSystemInfoHandler(Object o, EnumResults enumResults, String s, int i, String s1, String s2, String s3, String s4, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onInventoryUIDHandler(Object sender, final EnumResults result, final EnumTagType tagType, final int dsfid, final String uid, final int tagCount, EnumReaderStatus readerStatus, final CommunicatorStruct structs) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    //System.out.println("***********************收到扫描结果:"+result+",isOnclick_return:"+isOnclick_return+","+System.currentTimeMillis());
+                    if(result == EnumResults.SingleTag){
+                        taglist.add(uid);
+                        i = 5;
+                    }else{
+                        //System.out.println("结束扫描:"+result);
+                        PubData.reader.updateReadState(EnumModuleState.IDLE);
+                        loadBookInfo();
+                    }
+
+                }catch (Exception ex){ }
+            }
+        });
+    }
+
+    @Override
+    public void onCommandSetHandler(Object o, EnumRfidCommand enumRfidCommand, EnumResults enumResults, int i, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onReadSingleBlocksHandler(Object o, EnumResults enumResults, EnumSecStatus enumSecStatus, String s, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onReadMultipleBlocksHandler(Object o, EnumResults enumResults, int i, ArrayList<EnumSecStatus> arrayList, ArrayList<String> arrayList1, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onGetTagInfoHanler(Object o, EnumResults enumResults, int i, String s, int i1, int i2, String s1, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onGetMulipleBlocksSecStatusHandler(Object o, EnumResults enumResults, int i, ArrayList<EnumSecStatus> arrayList, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onInventoryMultipleBlocksHandler(Object o, EnumResults enumResults, EnumTagType enumTagType, int i, String s, int i1, ArrayList<EnumSecStatus> arrayList, ArrayList<String> arrayList1, int i2, EnumReaderStatus enumReaderStatus, CommunicatorStruct communicatorStruct) {
+
+    }
+    Handler daojishihandler = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            daojishi.setText(daojishinum+"");
+        }
+    };
+}

+ 254 - 0
app/src/main/java/com/jsw/jswlibrary/JiansuoActivity.java

@@ -0,0 +1,254 @@
+package com.jsw.jswlibrary;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TableLayout;
+import android.widget.TableRow;
+import android.widget.TextView;
+import android.widget.Toast;
+
+
+import com.jsw.jswlibrary.utils.HttpUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+public class JiansuoActivity extends BaseActivity {
+
+
+    protected final List<Map> list = new ArrayList();
+    private TableLayout table;
+    final Activity activity = this;
+    private int pageNumber = 1;
+    private int totalRow = 0;
+    private boolean firstPage = true;
+    private boolean lastPage = true;
+    private EditText keyword ;
+    private LinearLayout prepage;
+    private LinearLayout nextpage;
+    private Context mContext;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_jiansuo);
+        createTopView();
+        list.clear();
+        mContext = this;
+        keyword = findViewById(R.id.keyword);
+        table = findViewById(R.id.jiansuotable);
+        table.setStretchAllColumns(true);
+        Button returnBtn = findViewById(R.id.toHomePage);
+        returnBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                startActivity(new Intent(JiansuoActivity.this, JswHomeActivity.class));
+            }
+        });
+        ImageView search = findViewById(R.id.search);
+        search.requestFocus();
+        search.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                closeSoftInput(mContext);
+                getData(1);
+            }
+        });
+
+
+        prepage = findViewById(R.id.prepage);
+
+        nextpage = findViewById(R.id.nextpage);
+
+
+
+    }
+    private void closeSoftInput(Context context){
+        if (context != null) {
+            InputMethodManager inputMethodManager = (InputMethodManager) context
+                    .getSystemService(Context.INPUT_METHOD_SERVICE);
+            if (inputMethodManager != null
+                    && ((Activity) context).getCurrentFocus() != null) {
+                inputMethodManager.hideSoftInputFromWindow(((Activity) context)
+                                .getCurrentFocus().getWindowToken(),
+                        InputMethodManager.HIDE_NOT_ALWAYS);
+            }
+        }
+
+    }
+    private void getData(int pntemp){
+        list.clear();
+        final int pn = pntemp;
+        final String key = keyword.getText().toString();
+        if(key  == null || "".equals(key)){
+            return;
+        }
+        new Thread(new Runnable(){
+            @Override
+            public void run() {
+                Map res = HttpUtils.requestGet("/api/smartLibrary/jiansuo?text="+key+"&pageNumber="+pn+"&pageSize=9",activity);
+                if((Integer)res.get("code") == 200){
+                    Map m = (Map)res.get("data");
+                    lastPage = (boolean)m.get("lastPage");
+                    firstPage = (boolean)m.get("firstPage");
+                    pageNumber = (int)m.get("pageNumber");
+                    List l = (List)m.get("list");
+                    list.addAll(l);
+
+                }else if((Integer)res.get("code") == 333){
+                    startActivity(new Intent(JiansuoActivity.this, JswHomeActivity.class));
+                    Looper.prepare();
+                    Toast.makeText(JiansuoActivity.this, "网络异常,请检查是否配置了云参数!", Toast.LENGTH_SHORT).show();
+                    Looper.loop();
+                }
+                else{
+                    Looper.prepare();
+                    Toast.makeText(JiansuoActivity.this, ""+res.get("msg"), Toast.LENGTH_SHORT).show();
+                    Looper.loop();
+                }
+                mHandler.sendEmptyMessage(1);
+            }
+
+        }).start();
+    }
+    Handler mHandler = new Handler(){
+        @Override
+        public void handleMessage(Message msg){
+            try {
+                table.removeAllViews();
+                if(list == null || list.size() ==0){
+                    //System.out.println("没有记录啊。。。。。");
+                    TableRow row = new TableRow(getApplicationContext());
+                    row.setBottom(1);
+                    TextView nothing = new TextView(getApplicationContext());
+                    nothing.setWidth(920);
+                    nothing.setGravity(0x11);
+                    nothing.setHeight(60);
+                    nothing.setTextColor(Color.parseColor("#333333"));
+                    nothing.setText("没有相关书籍");
+                    nothing.setTextSize(24);
+                    row.addView(nothing);
+                    table.addView(row);
+                }else {
+                    for (int i = 0; i < list.size(); i++) {
+                        Map data = list.get(i);
+
+                        TableRow row = new TableRow(getApplicationContext());
+                        if (i % 2 == 1) {
+                            row.setBackgroundColor(Color.parseColor("#f6f6f6"));
+                        }
+
+                        row.setBottom(1);
+                        TextView suoshuhao = new TextView(getApplicationContext());
+                        suoshuhao.setWidth(230);
+                        suoshuhao.setGravity(0x11);
+                        suoshuhao.setHeight(60);
+                        suoshuhao.setTextSize(24);
+                        suoshuhao.setTextColor(Color.parseColor("#333333"));
+                        TextView ztm = new TextView(getApplicationContext());
+                        ztm.setWidth(230);ztm.setTextSize(24);
+                        ztm.setGravity(0x11);
+                        ztm.setHeight(60);
+                        ztm.setTextColor(Color.parseColor("#333333"));
+                        TextView author = new TextView(getApplicationContext());
+                        author.setWidth(230);author.setTextSize(24);
+                        author.setGravity(0x11);
+                        author.setHeight(60);
+                        author.setTextColor(Color.parseColor("#333333"));
+                        TextView chubanshe = new TextView(getApplicationContext());
+                        chubanshe.setWidth(230);chubanshe.setTextSize(24);
+                        chubanshe.setGravity(0x11);
+                        chubanshe.setHeight(60);
+                        chubanshe.setTextColor(Color.parseColor("#333333"));
+                        suoshuhao.setText(((String) data.get("bookno")).trim());
+                        row.addView(suoshuhao);
+                        final String ti = ((String) data.get("title")).trim();
+                        if (ti.length() > 15) {
+                            ztm.setText(ti.substring(0, 13) + "...");
+                            ztm.setOnClickListener(new View.OnClickListener() {
+                                @Override
+                                public void onClick(View v) {
+                                    Toast t = Toast.makeText(mContext, ti, Toast.LENGTH_SHORT);
+                                    t.setGravity(Gravity.CENTER, 0, 0);
+                                    t.show();
+                                }
+                            });
+                        } else {
+                            ztm.setText(ti);
+                        }
+                        row.addView(ztm);
+                        author.setText(((String) data.get("author")).trim());
+                        row.addView(author);
+                        chubanshe.setText(((String) data.get("publisher")).trim());
+                        row.addView(chubanshe);
+                        row.setPadding(2, 2, 2, 2);
+                        table.addView(row);
+                    }
+
+                }
+                prepage.removeAllViews();
+                if(firstPage==false){
+                    Button shangyiye = new Button(getApplicationContext());
+                    shangyiye.setWidth(168);shangyiye.setHeight(80);shangyiye.setTextSize(48);
+                    shangyiye.setText("上一页");shangyiye.setBackgroundResource(R.drawable.btn1);
+                    shangyiye.setTextColor(Color.parseColor("#ffffff"));
+                    shangyiye.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            getData(pageNumber-1);
+                        }
+                    });
+                    prepage.addView(shangyiye);
+                }
+                nextpage.removeAllViews();
+                if(lastPage==false){
+                    Button xiayiye = new Button(getApplicationContext());
+                    xiayiye.setWidth(168);xiayiye.setHeight(80);xiayiye.setTextSize(48);
+                    xiayiye.setText("下一页");xiayiye.setBackgroundResource(R.drawable.btn2);
+                    xiayiye.setTextColor(Color.parseColor("#ffffff"));
+                    xiayiye.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            getData(pageNumber+1);
+                        }
+                    });
+                    nextpage.addView(xiayiye);
+                }
+            }catch(Exception e){
+                e.printStackTrace();
+            }
+        }
+    };
+
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+
+        if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
+
+            getData(1);
+
+        }
+
+        return super.dispatchKeyEvent(event);
+    }
+
+}

+ 449 - 0
app/src/main/java/com/jsw/jswlibrary/JieshuActivity.java

@@ -0,0 +1,449 @@
+package com.jsw.jswlibrary;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TableLayout;
+import android.widget.TableRow;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.jsw.jswlibrary.common.MyTimer;
+import com.jsw.jswlibrary.common.PubData;
+import com.jsw.jswlibrary.utils.HttpUtils;
+import com.rightin.reader.hf.CommunicatorStruct;
+import com.rightin.reader.hf.myhf.HfConnector;
+import com.rightin.reader.hf.myhf.HfReader;
+import com.rightin.reader.hf.rfidenum.EnumModuleState;
+import com.rightin.reader.hf.rfidenum.EnumReaderStatus;
+import com.rightin.reader.hf.rfidenum.EnumResults;
+import com.rightin.reader.hf.rfidenum.EnumRfidCommand;
+import com.rightin.reader.hf.rfidenum.EnumSecStatus;
+import com.rightin.reader.hf.rfidenum.EnumTagType;
+
+
+
+import java.util.ArrayList;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class JieshuActivity extends BaseActivity implements HfReader.OnHfReaderListener, HfConnector.OnHfReaderListener, MyTimer.OnTimerTickListener{
+
+    private TextView cardnumber;
+    private String readerCardId = "";
+    private TextView readername;
+    protected final List<Map> list = new ArrayList();
+    private TableLayout jieshutable;
+    final Activity activity = this;
+
+    private Map<String, Map> bookMap = new HashMap<>();
+    private List<String> taglist ;
+    private int i = 6;
+    private boolean THREAD_RUNNING = false;
+    long submittime = 0;
+    private boolean isOnclick_jieshu = false;
+    boolean isOnclick_return = false;
+    boolean isover_jieshu = false;
+    int daojishinum = 4;
+    TextView daojishi;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_jieshu);
+        createTopView();
+        list.clear();
+
+        THREAD_RUNNING = true;
+        cardnumber = findViewById(R.id.cardnumber_jieyue);
+        SharedPreferences sp_reader = getSharedPreferences("reader", Context.MODE_PRIVATE);
+        readerCardId = sp_reader.getString("readerCardId","");
+        cardnumber.setText(readerCardId);
+        readername = findViewById(R.id.readername_jieyue);
+        readername.setText(sp_reader.getString("readername",""));
+        daojishi = findViewById(R.id.daojishi);
+
+        jieshutable = findViewById(R.id.jieyueTable);
+
+
+        HfReader.fix_name = chuankouhao_fix_name_rfid;
+        PubData.reader.setOnHfReaderListener(this);
+        PubData.reader.getMySerial().mDevNum = chuankouhao_rfid;//0
+        PubData.reader.open();
+        PubData.reader.setBaudRate(botelv_rfid);//19200
+        PubData.reader._is_inventory = false;//是否持续读
+        PubData.reader.setReaderAddress((byte)1);//天线1
+        PubData.reader.updateReadState(EnumModuleState.WORK);
+
+        PubData.reader.inventory();
+
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                while(i>0){
+                    try {
+                        Thread.sleep(1000);
+                        i--;
+                        if(i == 0){
+                            closeAll();
+                        }
+
+                    }catch(Exception e){
+
+                    }
+                }
+
+            }
+        }).start();
+
+        final Button jieshuBtn = findViewById(R.id.jieshuBtn_jieshu);
+        jieshuBtn.setOnClickListener(new View.OnClickListener() {
+
+            @Override
+            public void onClick(View v) {
+                jieshuBtn.setEnabled(false);
+                isOnclick_jieshu = true;
+                THREAD_RUNNING = false;
+                if(submittime != 0 && System.currentTimeMillis()-submittime<1000){
+                    System.out.println("重复提交");
+                    return;
+                }
+                submittime = System.currentTimeMillis();
+
+            }
+        });
+
+    }
+    private void closeAll(){
+        try {
+            submittime = 0;
+            System.out.println("HuanshuActivity执行销毁" + hhsss_format.format(new Date()));
+            //THREAD_RUNNING = false;
+            PubData.reader.stopInventory();
+            PubData.reader.close();
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    try{
+                        while(daojishinum>0) {
+                            Thread.sleep(1000);
+                            daojishinum--;
+                            daojishihandler.sendEmptyMessage(1);
+
+                        }
+                        finish();
+                    }catch(Exception e){
+
+                    }
+                }
+            }).start();
+
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        taglist = new ArrayList();
+    }
+
+    private void doJieshuAction(){
+        new Thread(new Runnable(){
+            @Override
+            public void run() {
+                try {
+                    Thread.sleep(1000);
+                    for (int i = 0; i < list.size(); i++) {
+                        Map map = list.get(i);
+                        String barcode = (String) map.get("barcode");
+                        String rfid = (String) map.get("rfid");
+                        String status = map.get("status") != null ? (String) map.get("status") : "";
+                        if (status.equals("")) {
+                            Map res = HttpUtils.requestGet("/api/smartLibrary_rfid/borrowBooks?readerCardId=" + readerCardId + "&libraryid=" + libraryid + "&bookrfid=" + barcode, activity);
+                            if ((Integer) res.get("code") == 200) {
+                                try {
+                                    System.out.println("准备修改afi");
+                                    boolean f = reWriteAfi(rfid,2);//E0040150C8B7D936
+                                    map.put("f", f);
+                                }catch(Exception e){
+                                    e.printStackTrace();
+                                }
+
+                                map.put("status", "借书成功");
+                                map.put("action", "1");
+                            } else {
+                                map.put("status", res.get("msg"));
+                                map.put("action", "0");
+                            }
+                        }
+                    }
+                    isover_jieshu = true;
+                    isOnclick_jieshu = false;
+                    mHandler.sendEmptyMessage(1);
+                    i = 5;
+                }catch(Exception e){
+                    e.printStackTrace();
+                    System.out.println("报错了,已被抓住 ");
+                }finally {
+
+                }
+
+
+            }
+        }).start();
+    }
+
+
+    private void loadBookInfo(){
+
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                //taglist里面没有,而booklist里面有的就要删掉booklist中的
+                List<Map> tempList = new ArrayList<>();
+                tempList.addAll(list);
+
+                for(Map m : tempList){
+                    boolean is = false;
+                    for(String a : taglist) {
+                        if(a.equals((String)m.get("rfid"))){
+                            is = true;
+                        }
+                    }
+                    if(is == false){
+                        list.remove(m);
+                        bookMap.remove((String)m.get("rfid"));
+                    }
+                }
+
+                for(String a : taglist) {
+                    try {
+
+                        Map data = bookMap.get(a);
+                        if(data == null){
+                            Map res = HttpUtils.requestGet("/api/smartLibrary_rfid/queryBookInfo?bookId=" + a, activity);
+                            if((int)res.get("code") == 200) {
+                                data = (Map) res.get("data");
+                                bookMap.put(a, data);
+                                int status = (int) data.get("status");//图书状态,非请求状态
+                                if (status == 0) {
+                                    ((Map) res.get("data")).put("status", "");
+                                } else if (status == 1) {
+                                    ((Map) res.get("data")).put("status", "该书已借出,不能借阅");
+                                } else if (status == 2) {
+                                    ((Map) res.get("data")).put("status", "该书已被预约,不能借阅");
+                                } else if (status == 3) {
+                                    ((Map) res.get("data")).put("status", "该书已被注销,不能借阅");
+                                } else if (status > 0) {
+                                    ((Map) res.get("data")).put("status", "该书状态异常,不能借阅");
+                                }
+                                list.add(data);
+                            }
+
+                        }
+
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+
+                }
+                mHandler.sendEmptyMessage(1);
+
+            }
+        }).start();
+
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        try {
+            System.out.println("JieshuActivity执行销毁" + hhsss_format.format(new Date()));
+            submittime = 0;
+            i = 0;
+            THREAD_RUNNING = false;
+
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+
+    }
+
+
+    Handler mHandler = new Handler(){
+        @Override
+        public void handleMessage(Message msg){
+            jieshutable.removeAllViews();
+
+            for(int i=0;i<list.size();i++ ){
+                try {
+                    Map data = list.get(i);
+
+                    TableRow row = new TableRow(getApplicationContext());
+                    if (i % 2 == 1) {
+                        row.setBackgroundColor(Color.parseColor("#f6f6f6"));
+                    }
+                    row.setBottom(1);
+                    TextView barcode = new TextView(getApplicationContext());
+                    barcode.setWidth(230);barcode.setTextSize(24);
+                    barcode.setGravity(0x11);
+                    barcode.setHeight(60);
+                    barcode.setTextColor(Color.parseColor("#333333"));
+                    TextView ztm = new TextView(getApplicationContext());
+                    ztm.setWidth(231);ztm.setTextSize(24);
+                    ztm.setGravity(0x11);
+                    ztm.setTextColor(Color.parseColor("#333333"));
+                    TextView author = new TextView(getApplicationContext());
+                    author.setWidth(230);
+                    author.setGravity(0x11);author.setTextSize(24);
+                    author.setTextColor(Color.parseColor("#333333"));
+                    TextView status = new TextView(getApplicationContext());
+                    status.setWidth(230);
+                    status.setGravity(0x11);status.setTextSize(24);
+                    status.setTextColor(Color.parseColor("#333333"));
+                    barcode.setText(((String)data.get("barcode")).trim());
+                    row.addView(barcode);
+                    ztm.setText(((String)data.get("title")).trim());
+                    row.addView(ztm);
+                    author.setText(((String)data.get("author")).trim());
+                    row.addView(author);
+                    status.setText((String) data.get("status"));
+                    if ("借书成功".equals((String) data.get("status"))) {
+                        status.setTextColor(Color.parseColor("#008B00"));
+                    } else {
+                        status.setTextColor(Color.RED);
+                    }
+                    row.addView(status);
+                    row.setPadding(2, 2, 2, 2);
+                    jieshutable.addView(row);
+                }catch(Exception e){e.printStackTrace();}
+
+            }
+            taglist.clear();
+            if(isOnclick_jieshu ) {
+                doJieshuAction();
+            }else{
+                if(isover_jieshu == false) {
+                    try {
+                        PubData.reader.updateReadState(EnumModuleState.WORK);
+                        PubData.reader.inventory();
+                    } catch (Exception e) {
+                        System.out.println("报错啦。。。。。");
+                        e.printStackTrace();
+                    }
+                }else{
+                    i=-100;
+                    closeAll();
+                }
+            }
+        }
+    };
+
+    @Override
+    public void onTick(String s) {
+    }
+
+    //region 读写器事件
+    @Override
+    public void onDataSendedHandler(Object o, byte[] bytes) {
+
+    }
+
+    @Override
+    public void onDataBaseReceivedHandler(Object o, byte[] bytes) {
+    }
+
+    @Override
+    public void onDataReceivedHandler(Object sender, byte[] buffer) {
+    }
+
+    @Override
+    public void onDataErrorHandler(String s) {
+    }
+
+    @Override
+    public void onResponseListHandler(Object o, ArrayList<Byte> arrayList) {
+    }
+
+    @Override
+    public void onSystemInfoHandler(Object o, EnumResults enumResults, String s, int i, String s1, String s2, String s3, String s4, CommunicatorStruct communicatorStruct) {
+    }
+
+    @Override
+    public void onInventoryUIDHandler(Object sender, final EnumResults result, final EnumTagType tagType, final int dsfid, final String uid, final int tagCount, EnumReaderStatus readerStatus, final CommunicatorStruct structs) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    //System.out.println(result+ " ->uid:"+uid);
+                    if(result == EnumResults.SingleTag){
+                        //System.out.println("uid:"+uid);
+                        i = 5;
+                        taglist.add(uid);
+                    }else{
+                        PubData.reader.updateReadState(EnumModuleState.IDLE);
+
+                        loadBookInfo();
+
+                    }
+                }catch (Exception ex){
+                }
+            }
+        });
+    }
+
+    @Override
+    public void onCommandSetHandler(Object o, EnumRfidCommand enumRfidCommand, EnumResults enumResults, int i, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onReadSingleBlocksHandler(Object o, EnumResults enumResults, EnumSecStatus enumSecStatus, String s, CommunicatorStruct communicatorStruct) {
+
+    }
+
+
+
+
+    @Override
+    public void onReadMultipleBlocksHandler(Object o, EnumResults enumResults, int i, ArrayList<EnumSecStatus> arrayList, ArrayList<String> arrayList1, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onGetTagInfoHanler(Object o, EnumResults enumResults, int i, String s, int i1, int i2, String s1, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onGetMulipleBlocksSecStatusHandler(Object o, EnumResults enumResults, int i, ArrayList<EnumSecStatus> arrayList, CommunicatorStruct communicatorStruct) {
+
+    }
+
+    @Override
+    public void onInventoryMultipleBlocksHandler(Object o, EnumResults enumResults, EnumTagType enumTagType, int i, String s, int i1, ArrayList<EnumSecStatus> arrayList, ArrayList<String> arrayList1, int i2, EnumReaderStatus enumReaderStatus, CommunicatorStruct communicatorStruct) {
+
+    }
+    Handler daojishihandler = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            daojishi.setText(daojishinum+"");
+        }
+    };
+}

+ 713 - 0
app/src/main/java/com/jsw/jswlibrary/JswHomeActivity.java

@@ -0,0 +1,713 @@
+package com.jsw.jswlibrary;
+
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TableLayout;
+import android.widget.TableRow;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.jsw.jswlibrary.faceregist.FaceSDKManager;
+import com.jsw.jswlibrary.faceregist.manager.ImportFileManager;
+import com.jsw.jswlibrary.faceregist.register.FaceRegisterNewActivity;
+import com.jsw.jswlibrary.faceregist.register.FaceRegisterNewDepthActivity;
+import com.jsw.jswlibrary.faceregist.register.FaceRegisterNewNIRActivity;
+import com.jsw.jswlibrary.faceregist.register.FaceRegisterNewRgbNirDepthActivity;
+import com.jsw.jswlibrary.listener.SdkInitListener;
+import com.jsw.jswlibrary.model.SingleBaseConfig;
+import com.jsw.jswlibrary.utils.FileUtils;
+import com.jsw.jswlibrary.utils.HttpUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
+public class JswHomeActivity extends BaseActivity  {
+    private List<Long> adminOnclickTimes = new ArrayList<>();
+    private List<Long> adminOnclickTimes2 = new ArrayList<>();
+
+    private Context mContext;
+    final Activity activity = this;
+    private int mLiveType;
+
+    public boolean isTongbu = true;
+    String sdcardPath = System.getenv("EXTERNAL_STORAGE");
+    private ImageView relative_register;
+    private List<Map> cuihuanlist = new ArrayList();
+    private List<Map> xinshulist = new ArrayList();
+    private List<Map> remenlist = new ArrayList();
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_jswhome);
+        createTopView();
+        mContext = this;
+        initSubPage(model);
+        System.out.println("*************************");
+        //startActivity(new Intent(JswHomeActivity.this, SettingActivity.class));
+        ImageView jieyueImg = findViewById(R.id.jieshuBtn);
+        jieyueImg.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+
+                if(model == 0){
+                    startActivity(new Intent(JswHomeActivity.this, AuthReaderActivity.class).putExtra("toPage","jieshu"));
+                }else{
+                    mLiveType = SingleBaseConfig.getBaseConfig().getType();
+                    startActivity(new Intent(JswHomeActivity.this, FaceAuthReaderActivity.class).putExtra("toPage","jieshu"));
+                }
+            }
+        });
+        ImageView huanshuImg = findViewById(R.id.huangshuBtn);
+        huanshuImg.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                startActivity(new Intent(JswHomeActivity.this, HuanshuActivity.class));
+            }
+        });
+        ImageView myjieyueBtn = findViewById(R.id.myjieyueBtn);
+        myjieyueBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+
+                if(model == 0){
+                    startActivity(new Intent(JswHomeActivity.this, AuthReaderActivity.class).putExtra("toPage","myjieyue"));
+                }else{
+                    mLiveType = SingleBaseConfig.getBaseConfig().getType();
+                    startActivity(new Intent(JswHomeActivity.this, FaceAuthReaderActivity.class).putExtra("toPage","myjieyue"));
+                }
+            }
+        });
+        ImageView jiansuoBtn = findViewById(R.id.jiansuoBtn);
+        jiansuoBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                startActivity(new Intent(JswHomeActivity.this, JiansuoActivity.class));
+            }
+        });
+        //进入系统设置
+        TextView adminBtn = findViewById(R.id.adminBtn);
+        adminBtn.setOnClickListener(new View.OnClickListener(){
+            @Override
+            public void onClick(View v) {
+                long time = System.currentTimeMillis();
+                if(adminOnclickTimes.size() == 0){
+                    adminOnclickTimes.add(time);
+                }else{
+                    long pretime = adminOnclickTimes.get(adminOnclickTimes.size()-1);
+                    if(time-pretime>1000){
+                        adminOnclickTimes.clear();
+                        adminOnclickTimes.add(time);
+                    }else{
+                        adminOnclickTimes.add(time);
+                        if(adminOnclickTimes.size()>=5){
+                            adminOnclickTimes.clear();
+                            startActivity(new Intent(JswHomeActivity.this, CheckAdminPassword.class));
+                        }
+                    }
+                }
+            }
+        });
+        //后台运行
+        TextView adminBtn2 = findViewById(R.id.adminBtn2);
+        adminBtn2.setOnClickListener(new View.OnClickListener(){
+            @Override
+            public void onClick(View v) {
+                long time = System.currentTimeMillis();
+                if(adminOnclickTimes2.size() == 0){
+                    adminOnclickTimes2.add(time);
+                }else{
+                    long pretime = adminOnclickTimes2.get(adminOnclickTimes2.size()-1);
+                    if(time-pretime>1000){
+                        adminOnclickTimes2.clear();
+                        adminOnclickTimes2.add(time);
+                    }else{
+                        adminOnclickTimes2.add(time);
+                        if(adminOnclickTimes2.size()>=10){
+                            adminOnclickTimes2.clear();
+
+                            //android.os.Process.killProcess(android.os.Process.myPid());
+                            moveTaskToBack(true);
+                            System.exit(0);
+                        }
+                    }
+                }
+            }
+        });
+        //重新启动
+        TextView adminBtn3 = findViewById(R.id.adminBtn3);
+        adminBtn3.setOnClickListener(new View.OnClickListener(){
+            @Override
+            public void onClick(View v) {
+                long time = System.currentTimeMillis();
+                if(adminOnclickTimes2.size() == 0){
+                    adminOnclickTimes2.add(time);
+                }else{
+                    long pretime = adminOnclickTimes2.get(adminOnclickTimes2.size()-1);
+                    if(time-pretime>1000){
+                        adminOnclickTimes2.clear();
+                        adminOnclickTimes2.add(time);
+                    }else{
+                        adminOnclickTimes2.add(time);
+                        if(adminOnclickTimes2.size()>=10){
+                            adminOnclickTimes2.clear();
+                            PackageManager packageManager = mContext.getPackageManager();
+                            if (null == packageManager) {
+
+                                return;
+                            }
+                            final Intent intent = packageManager.getLaunchIntentForPackage(mContext.getPackageName());
+                            if (intent != null) {
+                                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                                mContext.startActivity(intent);
+                            }
+                        }
+                    }
+                }
+            }
+        });
+
+        //催还清单
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                Map res = HttpUtils.requestGet("/api/smartLibrary_rfid/findCuihuanList", activity);
+                try {
+                    if((int)res.get("code") == 200){
+                        cuihuanlist = (List)res.get("data");
+                        cuihuanHandle.sendEmptyMessage(1);
+                    }
+                }catch(Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+        //新书通报
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                Map res = HttpUtils.requestGet("/api/smartLibrary_rfid/xinshutongbao", activity);
+                try {
+                    if((int)res.get("code") == 200){
+                        xinshulist = (List)res.get("data");
+                        xinshuHandle.sendEmptyMessage(1);
+                    }
+                }catch(Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+
+        //新书通报
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                Map res = HttpUtils.requestGet("/api/smartLibrary_rfid/xinshutongbao", activity);
+                try {
+                    if((int)res.get("code") == 200){
+                        remenlist = (List)res.get("data");
+                        remenHandle.sendEmptyMessage(1);
+                    }
+                }catch(Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+
+        if(orgid != null && !"".equals(orgid) && (model == 1)){
+            if(isTongbu){
+                isTongbu = false;
+                new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            Thread.sleep(2000);
+                            //System.out.println("开始同步。。");
+                            //uploadImage(new File(sdcardPath + "/Success-Import/hhhh.jpg"));
+                            File dir = new File(sdcardPath + "/Success-Import/");
+                            String[] filenames = dir.list();
+                            StringBuilder sb = new StringBuilder();
+                            for(String name : filenames){
+                                if(!name.endsWith(".txt"))
+                                    sb.append(",'"+name.substring(0,name.indexOf("."))+"'");
+                            }
+                            File temp = new File(sdcardPath + "/Success-Import/temp.txt");
+                            if(temp.exists()){
+                                temp.delete();
+                            }
+                            temp.createNewFile();
+                            FileUtils.writeTxtFile(sb.toString(), temp.getPath());
+                            tongbu(temp);
+                        }catch(Exception e){
+                            e.printStackTrace();
+                        }
+                    }
+                }).start();
+            }
+        }
+
+
+    }
+
+
+    private void judgeLiveType(int type, Class<?> rgbCls, Class<?> nirCls, Class<?> depthCls, Class<?> rndCls) {
+        switch (type) {
+            case 0: { // 不使用活体
+                startActivity(new Intent(JswHomeActivity.this, rgbCls));
+                break;
+            }
+
+            case 1: { // RGB活体
+                startActivity(new Intent(JswHomeActivity.this, rgbCls));
+                break;
+            }
+
+            case 2: { // NIR活体
+                startActivity(new Intent(JswHomeActivity.this, nirCls));
+                break;
+            }
+
+            case 3: { // 深度活体
+                int cameraType = SingleBaseConfig.getBaseConfig().getCameraType();
+                judgeCameraType(cameraType, depthCls);
+                break;
+            }
+
+            case 4: { // rgb+nir+depth活体
+                int cameraType = SingleBaseConfig.getBaseConfig().getCameraType();
+                judgeCameraType(cameraType, rndCls);
+            }
+        }
+    }
+
+    private void judgeCameraType(int cameraType, Class<?> depthCls) {
+        switch (cameraType) {
+            case 1: { // pro
+                startActivity(new Intent(JswHomeActivity.this, depthCls));
+                break;
+            }
+
+            case 2: { // atlas
+                startActivity(new Intent(JswHomeActivity.this, depthCls));
+                break;
+            }
+
+            case 6: { // Pico
+                //  startActivity(new Intent(HomeActivity.this,
+                // PicoFaceDepthLivenessActivity.class));
+                break;
+            }
+
+            default:
+                startActivity(new Intent(JswHomeActivity.this, depthCls));
+                break;
+        }
+    }
+
+    Handler cuihuanHandle = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            TableLayout t = findViewById(R.id.cuihuanTable);
+            t.setStretchAllColumns(true);
+            for(int i=0;i<cuihuanlist.size();i++){
+                Map m = cuihuanlist.get(i);
+                TableRow row = new TableRow(getApplicationContext());
+                if(i%2 == 0){
+                    row.setBackgroundColor(Color.parseColor("#f6f6f6"));
+                }
+                TextView barcode = new TextView(getApplicationContext());barcode.setWidth(100);barcode.setHeight(-2);barcode.setMinHeight(60);barcode.setTextColor(Color.parseColor("#333333"));
+                TextView ztm = new TextView(getApplicationContext());ztm.setWidth(307);ztm.setTextColor(Color.parseColor("#333333"));
+                TextView reader = new TextView(getApplicationContext());reader.setWidth(307);reader.setHeight(-2);reader.setMinHeight(60);reader.setTextColor(Color.parseColor("#333333"));
+                TextView duetime = new TextView(getApplicationContext());duetime.setWidth(307);duetime.setHeight(-2);duetime.setMinHeight(60);duetime.setTextColor(Color.parseColor("#ff4848"));
+                barcode.setText(m.get("barcode")+"");
+                final String ti = m.get("title")+"";
+                if(ti.length()>15) {
+                    ztm.setText(ti.substring(0,13)+"...");
+                    ztm.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            Toast t = Toast.makeText(mContext, ti, Toast.LENGTH_SHORT);
+                            t.setGravity(Gravity.CENTER,560,0);
+                            t.show();
+                        }
+                    });
+                }else{
+                    ztm.setText(ti);
+                }
+
+                //System.out.println("***"+ztm.getHeight());
+                reader.setText(m.get("realname")+"");
+                duetime.setText(m.get("createtime")+"");
+                barcode.setGravity(0x11);
+                barcode.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
+                ztm.setGravity(0x11);
+                reader.setGravity(0x11);
+                duetime.setGravity(0x11);
+                ztm.setTextSize(24);
+                reader.setTextSize(24);
+                duetime.setTextSize(24);
+                //row.addView(barcode);
+                row.addView(ztm);
+                row.addView(reader);
+                row.addView(duetime);
+                t.addView(row);
+            }
+
+        }
+
+    };
+
+    Handler xinshuHandle = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            TableLayout t = findViewById(R.id.xinshuTable);
+            t.setStretchAllColumns(true);
+            for(int i=0;i<xinshulist.size();i++){
+                Map m = xinshulist.get(i);
+                TableRow row = new TableRow(getApplicationContext());
+                row.setMinimumHeight(60);
+                row.setGravity(Gravity.CENTER_VERTICAL);
+                ImageView newflag = new ImageView(getApplicationContext());
+                newflag.setImageResource(R.drawable.newflag);newflag.setMaxWidth(48);newflag.setMaxHeight(22);newflag.setPadding(15,0,0,0);
+                TextView ztm = new TextView(getApplicationContext());ztm.setWidth(255);ztm.setTextColor(Color.parseColor("#333333"));
+                ztm.setTextSize(24);
+                TextView author = new TextView(getApplicationContext());author.setWidth(155);author.setPadding(0,0,15,0);
+                author.setTextColor(Color.parseColor("#939393"));
+                final String ti = " "+(i+1)+"."+m.get("title");
+                if(ti.length()>15) {
+                    ztm.setText(ti.substring(0,13)+"...");
+                    ztm.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            Toast t = Toast.makeText(mContext, ti, Toast.LENGTH_SHORT);
+                            t.setGravity(Gravity.CENTER,-300,250);
+                            t.show();
+                        }
+                    });
+                }else{
+                    ztm.setText(ti);
+                }
+
+                final String zz = "著者:"+m.get("author");
+                if(zz.length()>7) {
+                    author.setText(zz.substring(0,6)+"... ");
+                    author.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            Toast t = Toast.makeText(mContext, zz, Toast.LENGTH_SHORT);
+                            t.setGravity(Gravity.CENTER,-300,250);
+                            t.show();
+                        }
+                    });
+                }else{
+                    author.setText(zz+" ");
+                }
+                author.setTextSize(24);
+                author.setGravity(0x05);
+                row.addView(newflag);
+                row.addView(ztm);
+                row.addView(author);
+                t.addView(row);
+                TextView textView = new TextView(getApplicationContext());
+                textView.setWidth(100);
+                textView.setHeight(1);
+                textView.setTop(0);
+                //textView.setGravity(0x11);
+                textView.setBackgroundColor(Color.parseColor("#939393"));
+                t.addView(textView);
+            }
+
+        }
+
+    };
+    Handler remenHandle = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            TableLayout t = findViewById(R.id.remenTable);
+            t.setStretchAllColumns(true);
+            for(int i=0;i<remenlist.size();i++){
+                Map m = remenlist.get(i);
+                TableRow row = new TableRow(getApplicationContext());
+                row.setMinimumHeight(60);
+                row.setGravity(Gravity.CENTER_VERTICAL);
+                ImageView newflag = new ImageView(getApplicationContext());newflag.setPadding(15,0,0,0);
+                newflag.setImageResource(R.drawable.huo);newflag.setMaxWidth(48);newflag.setMaxHeight(22);
+                TextView ztm = new TextView(getApplicationContext());ztm.setMaxWidth(255);ztm.setTextColor(Color.parseColor("#333333"));
+                ztm.setTextSize(24);
+                TextView author = new TextView(getApplicationContext());author.setWidth(175);
+                author.setTextColor(Color.parseColor("#939393"));
+                final String ti = " "+(i+1)+"."+m.get("title");
+                if(ti.length()>15) {
+                    ztm.setText(ti.substring(0,13)+"...");
+                    ztm.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            Toast t = Toast.makeText(mContext, ti, Toast.LENGTH_SHORT);
+                            t.setGravity(Gravity.CENTER,-300,250);
+                            t.show();
+                        }
+                    });
+                }else{
+                    ztm.setText(ti);
+                }
+
+                final String zz = "著者:"+m.get("author");
+                if(zz.length()>9) {
+                    author.setText(zz.substring(0,8)+"... ");
+                    author.setOnClickListener(new View.OnClickListener() {
+                        @Override
+                        public void onClick(View v) {
+                            Toast t = Toast.makeText(mContext, zz, Toast.LENGTH_SHORT);
+                            t.setGravity(Gravity.CENTER,-300,250);
+                            t.show();
+                        }
+                    });
+                }else{
+                    author.setText(zz+" ");
+                }
+                author.setGravity(0x05);
+                author.setPadding(0,0,15,0);
+                author.setTextSize(24);
+                row.addView(newflag);row.addView(ztm);
+                row.addView(author);
+                t.addView(row);
+                TextView textView = new TextView(getApplicationContext());
+                textView.setWidth(100);
+                textView.setHeight(1);
+                textView.setTop(0);
+                //textView.setGravity(0x11);
+                textView.setBackgroundColor(Color.parseColor("#939393"));
+                t.addView(textView);
+            }
+
+        }
+
+    };
+
+
+    public void initSubPage(int model){
+
+        LinearLayout home_sub_layout = findViewById(R.id.home_sub);
+        if(model == 1) {
+            home_sub_layout.addView(View.inflate(this, R.layout.home_sub2, null));
+            relative_register = findViewById(R.id.relative_register);
+            relative_register.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    SharedPreferences sharedPreferences = getSharedPreferences("type", MODE_PRIVATE);
+                    mLiveType = sharedPreferences.getInt("type", 0);
+                    judgeLiveType(mLiveType, FaceRegisterNewActivity.class, FaceRegisterNewNIRActivity.class,
+                            FaceRegisterNewDepthActivity.class, FaceRegisterNewRgbNirDepthActivity.class);
+                }
+            });
+        }else{
+            home_sub_layout.addView(View.inflate(this, R.layout.home_sub, null));
+        }
+    }
+
+    public  void uploadImage(File file) {
+        //System.out.println("即将上传的图片路径:"+file.getPath());
+        String cardnumber = file.getName().substring(0,file.getName().lastIndexOf("."));
+        OkHttpClient httpClient = new OkHttpClient();
+        MediaType mediaType = MediaType.parse("application/octet-stream");//设置类型,类型为八位字节流
+        RequestBody requestBody = RequestBody.create(mediaType, file);//把文件与类型放入请求体
+
+        MultipartBody multipartBody = new MultipartBody.Builder()
+                .setType(MultipartBody.FORM)
+                .addFormDataPart("file", file.getName(), requestBody)//文件名
+                .build();
+        String pathall = host+"/api/smartLibrary/uploadHeaderImg?orgid="+host+"&cardnumber="+cardnumber;
+        Request request = new Request.Builder()
+                .url(pathall)
+                .post(multipartBody)
+                .build();
+        Call call = httpClient.newCall(request);
+        call.enqueue(new Callback() {
+
+            @Override
+            public void onFailure(Call call, IOException e) {
+                System.out.println(e);
+
+            }
+            @Override
+            public void onResponse(Call call, Response response) throws IOException {
+                //在这里根据返回内容执行具体的操作
+                final String resdata=response.body().string();
+                System.out.println(resdata);
+                if (response.code()==200){
+
+                }
+            }
+        });
+
+
+    }
+
+    public  void tongbu(File file) {
+        OkHttpClient httpClient = new OkHttpClient();
+        MediaType mediaType = MediaType.parse("application/octet-stream");//设置类型,类型为八位字节流
+        RequestBody requestBody = RequestBody.create(mediaType, file);//把文件与类型放入请求体
+
+        MultipartBody multipartBody = new MultipartBody.Builder()
+                .setType(MultipartBody.FORM)
+                .addFormDataPart("file", file.getName(), requestBody)//文件名
+                .build();
+        String pathall = host+"/api/smartLibrary/uploadTongbuTxt?orgid="+orgid;
+        Request request = new Request.Builder()
+                .url(pathall)
+                .post(multipartBody)
+                .build();
+        Call call = httpClient.newCall(request);
+        call.enqueue(new Callback() {
+
+            @Override
+            public void onFailure(Call call, IOException e) {
+                System.out.println(e);
+
+            }
+            @Override
+            public void onResponse(Call call, Response response) throws IOException {
+                //在这里根据返回内容执行具体的操作
+                final String resdata=response.body().string();
+                System.out.println("同步数据第一个请求结果返回信息:"+ resdata);
+                try {
+
+                    System.out.println(resdata);
+                    if (response.code() == 200) {
+                        JSONObject res = JSON.parseObject(resdata);
+                        if (res.getInteger("code") == 200) {
+                            String names = res.getString("data1");//本机器有,而服务器上没有的照片
+                            System.out.println("需要上传的读者号:"+names);
+                            if (names != null && !"".equals(names)) {
+                                String arr[] = names.split(",");
+                                for (String a : arr) {
+                                    try {
+                                        File t = new File(sdcardPath + "/Success-Import/" + a + ".jpg");
+                                        if (!t.exists()) {
+                                            t = new File(sdcardPath + "/Success-Import/" + a + ".jpeg");
+                                        }
+                                        if (!t.exists()) {
+                                            t = new File(sdcardPath + "/Success-Import/" + a + ".png");
+                                        }
+                                        if (t.exists()) {
+                                            uploadImage(t);
+                                        }
+                                    }catch(Exception e){
+                                        e.printStackTrace();
+                                    }
+                                }
+                            }
+                            String names2 = res.getString("data2");//本机器没有,而服务器上有的照片
+                            System.out.println("需要下载的用户ID:"+names2);
+                            if (names2 != null && !"".equals(names2)) {
+                                String arr[] = names2.split(",");
+                                File faceimport = new File(sdcardPath + "/Face-Import/");
+                                if(!faceimport.exists()) {
+                                    faceimport.mkdir();
+                                }
+                                File[] fs = faceimport.listFiles();
+                                for(File f : fs){
+                                    f.delete();
+                                }
+
+                                for (String a : arr) {
+                                    try {
+                                        Map r = HttpUtils.requestGet("/api/smartLibrary/downReaderHeader?readerid=" + a, activity);
+                                        if ((Integer) r.get("code") == 200) {
+                                            Map data = (Map)r.get("data");
+                                            String name = (String)data.get("cardnumber");
+                                            String base64 = (String)data.get("base64");
+                                            String flag = (String)data.get("flag");
+                                            //注册图片
+                                            if(base64 != null && !"".equals(base64)) {
+                                                FileUtils.base64ToFile(base64, name + "." + flag, sdcardPath + "/Face-Import/");
+                                            }
+                                            //System.out.println("成功注册一个用户:"+name);
+                                        } else{
+                                            System.out.println(res.get("msg"));
+                                        }
+
+                                    }catch(Exception e){
+                                        e.printStackTrace();
+                                    }
+
+
+                                }
+                                /*if (com.jsw.jswlibrary.faceregist.FaceSDKManager.initStatus != com.jsw.jswlibrary.faceregist.FaceSDKManager.SDK_MODEL_LOAD_SUCCESS) {
+                                    //System.out.println("准备批量导入了");
+
+                                }*/
+                                com.jsw.jswlibrary.faceregist.FaceSDKManager.getInstance().initModel(getApplicationContext(), new SdkInitListener() {
+                                    @Override
+                                    public void initStart() {
+                                    }
+
+                                    @Override
+                                    public void initLicenseSuccess() {
+                                    }
+
+                                    @Override
+                                    public void initLicenseFail(int errorCode, String msg) {
+                                    }
+
+                                    @Override
+                                    public void initModelSuccess() {
+                                        com.jsw.jswlibrary.faceregist.FaceSDKManager.initModelSuccess = true;
+                                        //ToastUtils.toast(BatchImportActivity.this, "模型加载成功,欢迎使用");
+                                        //System.out.println("准备批量导入了222");
+                                        ImportFileManager.getInstance().batchImport();
+                                    }
+
+                                    @Override
+                                    public void initModelFail(int errorCode, String msg) {
+                                        FaceSDKManager.initModelSuccess = false;
+                                        if (errorCode != -12) {
+                                            //ToastUtils.toast(BatchImportActivity.this, "模型加载失败,请尝试重启应用");
+                                        }
+                                    }
+                                });
+
+
+
+                            }
+                        }
+                    }
+                }catch(Exception e){
+                    e.printStackTrace();
+                    ImportFileManager.getInstance().release();
+                }
+            }
+        });
+
+
+    }
+
+}

+ 186 - 0
app/src/main/java/com/jsw/jswlibrary/LoadFaceActivity.java

@@ -0,0 +1,186 @@
+package com.jsw.jswlibrary;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.jsw.jswlibrary.faceregist.FaceSDKManager;
+import com.jsw.jswlibrary.faceregist.manager.ImportFileManager;
+import com.jsw.jswlibrary.listener.OnImportListener;
+import com.jsw.jswlibrary.listener.SdkInitListener;
+import com.jsw.jswlibrary.utils.ToastUtils;
+
+import java.io.File;
+
+
+public class LoadFaceActivity extends BaseActivity implements OnImportListener {
+
+
+    private Activity activity;
+    private String msg = "";
+    //private LinearLayout sv;
+    private Context mContext ;
+    private String endMsg = "";
+    private int successC = 0;
+    private int failureC = 0;
+    private Button loadfaceReturn;
+    private TextView success_num,fail_num,end_tv;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        activity = this;
+        mContext = this;
+        initListener();
+        com.jsw.jswlibrary.faceregist.FaceSDKManager.getInstance().initDataBases(this);
+        setContentView(R.layout.activity_loadface);
+        //sv = findViewById(R.id.loadface_sv);
+        success_num = findViewById(R.id.success_num);
+        fail_num = findViewById(R.id.fail_num);
+        end_tv = findViewById(R.id.end_tv);
+        createTopView();
+        ImportFileManager.getInstance().setOnImportListener(this);
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Thread.sleep(2000);
+                    System.out.println("进入导入本地数据的页面。。");
+
+
+                    //第一步:删除Face-Import文件夹
+                    File faceimport_dir = new File(sdcardPath + "/Face-Import/");
+                    if(faceimport_dir.exists()){
+                        File fls[] = faceimport_dir.listFiles();
+                        for(File f : fls){
+                            f.delete();
+                        }
+                        faceimport_dir.delete();
+                    }
+                    //第二步:将Success-Import文件夹修改为Face-Import文件夹
+                    File successimport = new File(sdcardPath + "/Success-Import/");
+                    if(!successimport.exists()){
+                        finish();
+                        startActivity(new Intent(LoadFaceActivity.this, JswHomeActivity.class));
+                    }
+                    successimport.renameTo(faceimport_dir);
+                    File[] fs = faceimport_dir.listFiles();
+                    if(fs.length == 0){
+                        finish();
+                        startActivity(new Intent(LoadFaceActivity.this, JswHomeActivity.class));
+                    }
+                    //第三步:创建Success-Import文件夹;
+                    File successimport_new = new File(sdcardPath + "/Success-Import/");
+                    successimport_new.mkdir();
+
+                    ImportFileManager.getInstance().batchImport();
+
+                }catch(Exception e){
+                    System.out.println("*************难道是这里");
+                    e.printStackTrace();
+
+                }
+            }
+        }).start();
+        loadfaceReturn = findViewById(R.id.loadfaceReturn);
+        loadfaceReturn.setVisibility(View.GONE);
+        loadfaceReturn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                finish();
+                startActivity(new Intent(LoadFaceActivity.this, JswHomeActivity.class));
+            }
+        });
+
+    }
+
+    private void initListener() {
+        if (FaceSDKManager.initStatus != FaceSDKManager.SDK_MODEL_LOAD_SUCCESS) {
+            com.jsw.jswlibrary.faceregist.FaceSDKManager.getInstance().initModel(this, new SdkInitListener() {
+                @Override
+                public void initStart() {
+
+                }
+
+                @Override
+                public void initLicenseSuccess() {
+
+                }
+
+                @Override
+                public void initLicenseFail(int errorCode, String msg) {
+                }
+
+                @Override
+                public void initModelSuccess() {
+                    com.jsw.jswlibrary.faceregist.FaceSDKManager.initModelSuccess = true;
+
+                    //ToastUtils.toast(FaceAuthReaderActivity.this, "模型加载成功,欢迎使用");
+                    //Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
+                }
+
+                @Override
+                public void initModelFail(int errorCode, String msg) {
+                    com.jsw.jswlibrary.faceregist.FaceSDKManager.initModelSuccess = false;
+                    if (errorCode != -12) {
+                        ToastUtils.toast(LoadFaceActivity.this, "模型加载失败,请尝试重启应用");
+                    }
+                }
+            });
+        }
+    }
+
+
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+    }
+
+    @Override
+    public void showProgressView() {
+
+    }
+
+    @Override
+    public void showToastMessage(String message) {
+
+    }
+
+    @Override
+    public void onImporting(int finishCount, int successCount, int failureCount, float progress) {
+        successC = successCount;
+        failureC = failureCount;
+        msgHandler.sendEmptyMessage(1);
+    }
+
+    Handler msgHandler = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            success_num.setText(successC+"");
+            fail_num.setText(failureC+"");
+        }
+    };
+    Handler endHandler = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            end_tv.setText("导入完成,请重启设备");
+            loadfaceReturn.setVisibility(View.VISIBLE);
+        }
+    };
+    @Override
+    public void endImport(int finishCount, int successCount, int failureCount) {
+
+        endHandler.sendEmptyMessage(1);
+
+    }
+
+}

+ 159 - 0
app/src/main/java/com/jsw/jswlibrary/MyjieyueActivity.java

@@ -0,0 +1,159 @@
+package com.jsw.jswlibrary;
+
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TableLayout;
+import android.widget.TableRow;
+import android.widget.TextView;
+import android.widget.Toast;
+
+
+import com.jsw.jswlibrary.utils.HttpUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+public class MyjieyueActivity extends BaseActivity {
+
+    private TextView cardnumber;
+    private String readerCardId = "";
+    private TextView readername;
+    protected final List<Map> list = new ArrayList();
+    private TableLayout table;
+    final Activity activity = this;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_myjieyue);
+        createTopView();
+        list.clear();
+        cardnumber = findViewById(R.id.cardnumber_myjieyue);
+        SharedPreferences sp_reader = getSharedPreferences("reader", Context.MODE_PRIVATE);
+        readerCardId = sp_reader.getString("readerCardId","");
+        cardnumber.setText(readerCardId);
+        readername = findViewById(R.id.readername_myjieyue);
+        System.out.println(sp_reader.getString("readername",""));
+        readername.setText(sp_reader.getString("readername",""));
+        table = findViewById(R.id.myjieyuetable);
+        Button returnBtn = findViewById(R.id.returnBtn);
+        returnBtn.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                startActivity(new Intent(MyjieyueActivity.this, JswHomeActivity.class));
+            }
+        });
+
+        new Thread(new Runnable(){
+            @Override
+            public void run() {
+                Map res = HttpUtils.requestGet("/api/smartLibrary/myjieyue?readerCardId="+readerCardId,activity);
+                if((Integer)res.get("code") == 200){
+                    list.addAll((List)res.get("data"));
+                    mHandler.sendEmptyMessage(1);
+                }else if((Integer)res.get("code") == 333){
+                    startActivity(new Intent(MyjieyueActivity.this, JswHomeActivity.class));
+                    Looper.prepare();
+                    Toast.makeText(MyjieyueActivity.this, "网络异常,请检查是否配置了云参数!", Toast.LENGTH_SHORT).show();
+                    Looper.loop();
+                }
+                else{
+                    Looper.prepare();
+                    Toast.makeText(MyjieyueActivity.this, ""+res.get("msg"), Toast.LENGTH_SHORT).show();
+                    Looper.loop();
+                }
+
+            }
+        }).start();
+
+    }
+    Handler mHandler = new Handler(){
+        @Override
+        public void handleMessage(Message msg){
+            try {
+                for (int i = 0; i < list.size(); i++) {
+                    Map data = list.get(i);
+                    TableRow row = new TableRow(getApplicationContext());
+                    if (i % 2 == 1) {
+                        row.setBackgroundColor(Color.parseColor("#f6f6f6"));
+                    }
+                    row.setBottom(1);
+                    //row.setBackgroundColor(Color.parseColor("#dd6b70"));
+                    TextView txm = new TextView(getApplicationContext());
+                    txm.setWidth(183);
+                    txm.setTextSize(24);
+                    txm.setGravity(0x11);
+                    txm.setHeight(60);
+                    txm.setTextColor(Color.parseColor("#333333"));
+                    TextView ztm = new TextView(getApplicationContext());
+                    ztm.setWidth(183);
+                    ztm.setTextSize(24);
+                    ztm.setGravity(0x11);
+                    ztm.setHeight(60);
+                    ztm.setTextColor(Color.parseColor("#333333"));
+                    TextView author = new TextView(getApplicationContext());
+                    author.setWidth(183);
+                    author.setGravity(0x11);
+                    author.setHeight(60);
+                    author.setTextColor(Color.parseColor("#333333"));
+                    TextView status = new TextView(getApplicationContext());
+                    status.setWidth(183);
+                    status.setGravity(0x11);
+                    status.setHeight(60);
+                    status.setTextColor(Color.parseColor("#333333"));
+                    TextView jieyuetime = new TextView(getApplicationContext());
+                    jieyuetime.setWidth(183);
+                    jieyuetime.setGravity(0x11);
+                    jieyuetime.setHeight(60);
+                    jieyuetime.setTextColor(Color.parseColor("#333333"));
+                    TextView daoqitime = new TextView(getApplicationContext());
+                    daoqitime.setWidth(183);
+                    daoqitime.setGravity(0x11);
+                    daoqitime.setHeight(60);
+                    daoqitime.setTextColor(Color.parseColor("#333333"));
+                    ztm.setText(((String) data.get("title")).trim());
+                    txm.setText(((String) data.get("barcode")).trim());
+                    row.addView(txm);
+                    row.addView(ztm);
+                    author.setText(((String) data.get("author")).trim());
+                    row.addView(author);
+                    author.setTextSize(24);
+                    jieyuetime.setText(data.get("createtime") + "");
+                    row.addView(jieyuetime);
+                    jieyuetime.setTextSize(24);
+                    daoqitime.setText(data.get("duetime") + "");
+                    row.addView(daoqitime);
+                    daoqitime.setTextSize(24);
+                    if ((data.get("isoverdue") + "").equals("1")) {
+                        status.setTextColor(Color.parseColor("#ff4949"));
+                        status.setText("超期");
+                    } else {
+                        status.setText("正常");
+                        status.setTextColor(Color.parseColor("#87d82e"));
+                    }
+                    status.setTextSize(24);
+                    row.addView(status);
+                    row.setPadding(2, 2, 2, 2);
+                    table.addView(row);
+                }
+            }catch(Exception e){
+                e.printStackTrace();
+                Toast.makeText(MyjieyueActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
+            }
+
+        }
+    };
+
+
+}

+ 210 - 0
app/src/main/java/com/jsw/jswlibrary/SettingActivity.java

@@ -0,0 +1,210 @@
+package com.jsw.jswlibrary;
+
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Looper;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Spinner;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.alibaba.fastjson.JSON;
+import com.jsw.jswlibrary.baiduregist.ActivitionActivity;
+import com.jsw.jswlibrary.faceregist.activity.UserManagerActivity;
+import com.jsw.jswlibrary.utils.FileUtils;
+import com.jsw.jswlibrary.utils.HttpUtils;
+
+import org.json.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.math.BigDecimal;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class SettingActivity extends BaseActivity{
+
+
+    private Context mContext;
+    final Activity activity = this;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_setting);
+        mContext = this;
+        createTopView();
+        Button returnBtn = findViewById(R.id.returnBtn);
+        returnBtn.setOnClickListener(new Button.OnClickListener(){
+            @Override
+            public void onClick(View v) {
+                startActivity(new Intent(SettingActivity.this,JswHomeActivity.class));
+                finish();
+            }
+        });
+        Button saveBtn = findViewById(R.id.saveBtn);
+        final EditText apptitle = findViewById(R.id.apptitle_setting);
+        apptitle.setText(BaseActivity.apptitle);
+        saveBtn.setOnClickListener(new Button.OnClickListener(){
+            @Override
+            public void onClick(View v) {
+                try {
+                    BaseActivity.apptitle = apptitle.getText().toString().trim();
+                    modityJson();
+                    Toast.makeText(SettingActivity.this, "保存成功!", Toast.LENGTH_SHORT).show();
+                }catch(Exception e){
+                    e.printStackTrace();
+                    Toast.makeText(SettingActivity.this, "保存失败!", Toast.LENGTH_SHORT).show();
+                }
+            }
+        });
+        Button shengji = findViewById(R.id.shengji);
+        shengji.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                new Thread(new Runnable(){
+                    @Override
+                    public void run() {
+                        Map res = requestGet_my("http://jsw.jyzbgl.cn/appversion/findNew?appname="+appname,activity);
+
+                        if((Integer)res.get("code") == 200){
+                            Map data = (Map)res.get("data");
+                            lastversion = ((BigDecimal)data.get("appversion")).doubleValue();
+                            if(lastversion <= appversion){
+                                Looper.prepare();
+                                Toast.makeText(SettingActivity.this, "已是最新版本!", Toast.LENGTH_LONG).show();
+                                Looper.loop();
+                            }else{
+                                update_path = data.get("path")+"";
+                                startActivity(new Intent(SettingActivity.this, UpdateActivity.class));
+
+                            }
+                        }
+                        else{
+                            Looper.prepare();
+                            Toast.makeText(SettingActivity.this, "未检测到新版本!", Toast.LENGTH_SHORT).show();
+                            Looper.loop();
+                        }
+
+
+                    }
+                }).start();
+            }
+        });
+        Button facelibrary = findViewById(R.id.facelibrary);
+        facelibrary.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                startActivity(new Intent(SettingActivity.this, UserManagerActivity.class));
+            }
+        });
+        Button jihuobaidu = findViewById(R.id.jihuobaidu);
+        jihuobaidu.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                startActivity(new Intent(mContext, ActivitionActivity.class));
+            }
+        });
+
+        SharedPreferences sp_jihuo = getSharedPreferences("jihuo", Context.MODE_PRIVATE);
+        String jihuostatus = sp_jihuo.getString("jihuostatus","111");
+        System.out.println("*************hahaha:"+jihuostatus);
+        if("0".equals(jihuostatus)){
+        }else{
+            jihuobaidu.setVisibility(View.GONE);
+        }
+
+
+        //检查更新
+        //后台运行
+        TextView adminBtn2 = findViewById(R.id.setting_update_btn);
+        adminBtn2.setText("v"+String.valueOf(appversion));
+
+
+    }
+
+    public static Map requestGet_my(String path,  Activity activity) {
+
+        HttpURLConnection conn=null;
+        Map result ;
+        try {
+            URL url = new URL(path);
+            System.out.println("请求地址:"+path);
+            conn=(HttpURLConnection)url.openConnection();
+            conn.setRequestMethod("GET");
+            InputStream is = conn.getInputStream();
+            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+            StringBuilder sb = new StringBuilder();
+            String line = null;
+            while((line=reader.readLine()) != null){
+                sb.append(line);
+            }
+            String responseText = sb.toString();
+            System.out.println("请求结果:"+responseText);
+            result = JSON.parseObject(responseText);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            result= new HashMap();
+            result.put("code",333);
+            result.put("msg", "网络异常");
+        }finally {
+            if(conn != null)
+                conn.disconnect();
+        }
+        return result;
+    }
+    /**
+     * 修改配置文件内容并重新读取配置
+     */
+    String folder = Environment.getExternalStorageDirectory() + File.separator + "Settings";
+    String filePath = folder + "/" + "skjhjconfig.txt";
+    public boolean modityJson() {
+
+        JSONObject jsonObject = new JSONObject();
+
+        try {
+            jsonObject.put("model_camear_facing", BaseActivity.model_camear_facing);
+            jsonObject.put("host",BaseActivity.host);
+            jsonObject.put("orgid",BaseActivity.orgid);
+            jsonObject.put("libraryid",BaseActivity.libraryid);
+            jsonObject.put("cardtype", BaseActivity.cardtype);//0:需反转,1:不需要反转
+            jsonObject.put("apptitle", BaseActivity.apptitle);
+            jsonObject.put("model",BaseActivity.model);
+            jsonObject.put("hasIDCard", BaseActivity.hasIDCard);
+            jsonObject.put("hasICCard", BaseActivity.hasICCard);
+            jsonObject.put("botelv_rfid",BaseActivity.botelv_rfid);
+            jsonObject.put("botelv_idreader", botelv_idreader);
+            jsonObject.put("chuankouhao_fix_name_rfid",BaseActivity.chuankouhao_fix_name_rfid);
+            jsonObject.put("chuankouhao_rfid", BaseActivity.chuankouhao_rfid);
+            jsonObject.put("chuankouhao_fix_name_idreader",BaseActivity.chuankouhao_fix_name_idreader);
+            jsonObject.put("chuankouhao_idreader", BaseActivity.chuankouhao_idreader);
+            // 修改内容写入配置文件
+            FileUtils.writeTxtFile(jsonObject.toString(), filePath);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+}

+ 260 - 0
app/src/main/java/com/jsw/jswlibrary/UpdateActivity.java

@@ -0,0 +1,260 @@
+package com.jsw.jswlibrary;
+
+import android.app.Activity;
+import android.app.DownloadManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.core.content.FileProvider;
+
+
+import java.io.File;
+
+
+public class UpdateActivity extends BaseActivity{
+
+    BroadcastReceiver broadcastReceiver;
+    BroadcastReceiver mDownloadDetailsReceiver;
+    DownloadManager manager ;
+
+    public static long downloadid =0;
+    private Context mContext;
+    final Activity activity = this;
+    TextView update_msg;
+    private final QueryRunnable mQueryProgressRunnable = new QueryRunnable();
+    private final Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+            if (msg.what == 1001) {
+                update_msg.setText("正在下载: "+String.format("%.2f", (msg.arg1*1.0d/1024/1024))+"M / "+String.format("%.2f", (msg.arg2*1.0d/1024/1024))+"M");
+            }
+        }
+    };
+    //更新下载进度
+    private void startQuery() {
+        if (downloadid != 0) {
+            mHandler.post(mQueryProgressRunnable);
+        }
+    }
+    //查询下载进度
+    private class QueryRunnable implements Runnable {
+        @Override
+        public void run() {
+            queryState();
+            mHandler.postDelayed(mQueryProgressRunnable,100);
+        }
+    }
+
+    //查询下载进度
+    private void queryState() {
+        // 通过ID向下载管理查询下载情况,返回一个cursor
+        Cursor c = manager.query(new DownloadManager.Query().setFilterById(downloadid));
+        if (c == null) {
+            Toast.makeText(this, "下载失败",Toast.LENGTH_SHORT).show();
+            update_msg.setText("下载失败!");
+            stopQuery();
+        } else { // 以下是从游标中进行信息提取
+            if (!c.moveToFirst()) {
+                Toast.makeText(this,"下载失败",Toast.LENGTH_SHORT).show();
+                update_msg.setText("下载失败!");
+                stopQuery();
+                if(!c.isClosed()) {
+                    c.close();
+                }
+                return;
+            }
+            int mDownload_so_far = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
+            int mDownload_all = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
+            Message msg=Message.obtain();
+            if(mDownload_all>0) {
+                msg.what = 1001;
+                msg.arg1=mDownload_so_far;
+                msg.arg2=mDownload_all;
+                mHandler.sendMessage(msg);
+            }
+            if(!c.isClosed()){
+                c.close();
+            }
+        }
+    }
+    //停止查询下载进度
+    private void stopQuery() {
+        mHandler.removeCallbacks(mQueryProgressRunnable);
+    }
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mContext = this;
+
+        setContentView(R.layout.activity_update);
+        createTopView();
+        Button returnBtn = findViewById(R.id.returnBtn_update);
+        returnBtn.setOnClickListener(new Button.OnClickListener(){
+            @Override
+            public void onClick(View v) {
+                //finish();
+                startActivity(new Intent(UpdateActivity.this,SettingActivity.class));
+            }
+        });
+        Button updateBtn = findViewById(R.id.updateBtn);
+        final TextView currversion = findViewById(R.id.currversion);
+        currversion.setText(appversion+"");
+        currversion.setEnabled(false);
+        final TextView lastversion_view = findViewById(R.id.lastversion);
+        lastversion_view.setText(lastversion+"");
+        lastversion_view.setEnabled(false);
+        final String apkname = "jsw.apk";
+        updateBtn.setOnClickListener(new Button.OnClickListener(){
+            @Override
+            public void onClick(View v) {
+                try {
+                    update_msg= findViewById(R.id.update_msg);
+                    update_msg.setText("正在更新请稍后!");
+                    downloadid = downLoadApk(mContext,apkname,update_path);
+                    System.out.println("下载完成:"+downloadid);
+                    listener(downloadid);
+
+                }catch(Exception e){
+                    e.printStackTrace();
+                    Toast.makeText(UpdateActivity.this, "更新异常!", Toast.LENGTH_SHORT).show();
+                }
+            }
+        });
+    }
+
+    private void listener(final long Id) {
+        // 注册广播监听系统的下载完成事件。
+        IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
+        IntentFilter downloadDetailsFilter = new IntentFilter(DownloadManager.ACTION_NOTIFICATION_CLICKED);
+        manager = (DownloadManager)mContext.getSystemService(Context.DOWNLOAD_SERVICE);
+        broadcastReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                // 这里是通过下面这个方法获取下载的id,
+                long ID = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
+                // 这里把传递的id和广播中获取的id进行对比是不是我们下载apk的那个id,如果是的话,就开始获取这个下载的路径
+                if (ID == Id) {
+
+                    DownloadManager.Query query = new DownloadManager.Query();
+                    query.setFilterById(Id);
+
+                    Cursor cursor = manager.query(query);
+                    if (cursor.moveToFirst()){
+                        // 获取文件下载路径
+                        String fileName = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
+                        // 如果文件名不为空,说明文件已存在,则进行自动安装apk
+                        if (fileName != null){
+                            update_msg.setText("下载完成!");
+                            stopQuery();
+                            openAPK(fileName);
+                        }
+                    }
+                    cursor.close();
+                }
+            }
+        };
+        mDownloadDetailsReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                String action = intent.getAction();
+                if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) {
+                    lookDownload();
+                }
+            }
+        };
+        registerReceiver(mDownloadDetailsReceiver, downloadDetailsFilter);
+        registerReceiver(broadcastReceiver, intentFilter);
+        startQuery();
+    }
+    //进入下载详情
+    private void lookDownload() {
+        Intent intent=new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
+        if(intent.resolveActivity(getPackageManager())!=null){
+            startActivity(intent);
+        }
+    }
+
+    /**
+     * 安装apk
+     * @param fileSavePath
+     */
+    private void openAPK(String fileSavePath){
+        File file=new File(Uri.parse(fileSavePath).getPath());
+        String filePath = file.getAbsolutePath();
+        System.out.println("准备打开的文件路径:"+filePath);
+        Intent intent = new Intent(Intent.ACTION_VIEW);
+        Uri data = null;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//判断版本大于等于7.0
+            // 生成文件的uri,,
+            // 注意 下面参数com.ausee.fileprovider 为apk的包名加上.fileprovider,
+            data = FileProvider.getUriForFile(UpdateActivity.this, "com.jsw.jswlibrary.fileprovider", new File(filePath));
+            intent.setDataAndType(data, "application/vnd.android.package-archive");
+            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
+
+        } else {
+            data = Uri.fromFile(file);
+        }
+        intent.setDataAndType(data, "application/vnd.android.package-archive");
+        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+        startActivity(intent);
+    }
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        try {
+            if(broadcastReceiver != null) {
+                unregisterReceiver(broadcastReceiver);
+            }
+            if(mDownloadDetailsReceiver!= null){
+                unregisterReceiver(mDownloadDetailsReceiver);
+            }
+
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+
+    }
+    /**
+     * 更新下载apk
+     * @param context  上下文对象
+     * @param title    程序的名字
+     * @param url       下载的url地址
+     *
+     */
+
+    public static long downLoadApk(Context context, String title, String url){
+
+        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
+        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
+        request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS,"ausee.apk");
+        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+        // 设置 Notification 信息
+        request.setTitle(title);
+        request.setDescription("下载完成后请点击打开");
+        request.setVisibleInDownloadsUi(true);
+        request.allowScanningByMediaScanner();
+        request.setMimeType("application/vnd.android.package-archive");
+
+        // 实例化DownloadManager 对象
+        DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
+        final long refrence = downloadManager.enqueue(request);
+
+        return refrence;
+    }
+}

+ 664 - 0
app/src/main/java/com/jsw/jswlibrary/baiduregist/ActivitionActivity.java

@@ -0,0 +1,664 @@
+package com.jsw.jswlibrary.baiduregist;
+
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.graphics.drawable.BitmapDrawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Vibrator;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.text.method.ReplacementTransformationMethod;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.PopupWindow;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+
+
+import com.baidu.idl.main.facesdk.FaceAuth;
+import com.baidu.idl.main.facesdk.callback.Callback;
+import com.jsw.jswlibrary.BaseActivity;
+import com.jsw.jswlibrary.LoadFaceActivity;
+import com.jsw.jswlibrary.R;
+import com.jsw.jswlibrary.utils.NetUtil;
+import com.jsw.jswlibrary.utils.ToastUtils;
+
+public class ActivitionActivity extends BaseActivity implements View.OnClickListener {
+
+    public static Context mContext;
+    private FaceAuth faceAuth;
+    private TextView accredit_deviceTv;
+    private Button accredit_offBtn;
+    private TextView accredit_hintTv;
+    private TextView accredit_offTv;
+    private ImageView accredit_offView;
+    private TextView accredit_onTv;
+    private ImageView accredit_onView;
+    private TextView accredit_useTv;
+    private ImageView accredit_useView;
+    private TextView accredit_offhiteTv;
+    private TextView accredit_onhintTv;
+    private Button accredit_onBtn;
+    private TextView accredit_onhiteTv;
+    private Button accredit_useBtn;
+    private TextView accredit_usehiteTv;
+    private TextView accredit_useErrorTv;
+    private PopupWindow popupWindow;
+    RelativeLayout rel;
+    boolean isFlag = false;
+    boolean isTrue = true;
+    private View view1;
+    int count = 0;
+    private RelativeLayout accreditOffRl;
+    private RelativeLayout accreditOnRl;
+    private RelativeLayout accreditUseRl;
+
+    private EditText activity_et_one;
+    private EditText activity_et_two;
+    private EditText activity_et_three;
+    private EditText activity_et_four;
+
+    private long lastClickTime = 0L;
+    private static final int FAST_CLICK_DELAY_TIME = 1000; // 快速点击间隔
+    private Vibrator vibrator;
+    // 拼接后的激活码
+    private String end;
+    private View activity_one_view;
+    private View activity_two_view;
+    private View activity_three_view;
+    private View activity_four_view;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_activition);
+        mContext = this;
+        initView();
+        // 点击激活按钮3次无响应弹出popupwindow
+        initPopupWindow();
+        vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+
+    }
+
+    private void initPopupWindow() {
+        SharedPreferences sharedPreferences = getSharedPreferences("ws", MODE_PRIVATE);
+        boolean accredit = sharedPreferences.getBoolean("accredit", false);
+        if (accredit == false) {
+            // 以view将view_layout中的布局和activity_main布局进行桥接
+            view1 = View.inflate(this, R.layout.layout_popup_hint, null);
+            popupWindow = new PopupWindow(view1, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+            // 点击框外可以使得popupwindow消失
+            popupWindow.setFocusable(false);
+            popupWindow.setTouchable(true);
+            popupWindow.setBackgroundDrawable(new BitmapDrawable());
+            popupWindow.setOutsideTouchable(false);
+
+            TextView hintHelpTv = view1.findViewById(R.id.hint_helpTv);
+            hintHelpTv.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    bangListener();
+                }
+            });
+        }
+    }
+
+    private void initHandler() {
+        new Handler(new Handler.Callback() {
+            @Override
+            public boolean handleMessage(Message msg) {
+                // 实现页面跳转
+                popupWindow.dismiss();
+                accredit_offhiteTv.setTextColor(Color.parseColor("#999999"));
+                accredit_onhiteTv.setTextColor(Color.parseColor("#999999"));
+                accredit_usehiteTv.setTextColor(Color.parseColor("#999999"));
+                return false;
+
+            }
+        }).sendEmptyMessageDelayed(0, 3000);
+    }
+
+
+    private void initView() {
+        // 复制按钮
+        faceAuth = new FaceAuth();
+        // 复制序列码
+        accredit_deviceTv = findViewById(R.id.accredit_deviceTv);
+        accredit_deviceTv.setText(faceAuth.getDeviceId(this));
+
+        // 长按点击复制
+        accredit_deviceTv.setOnLongClickListener(new View.OnLongClickListener() {
+            @Override
+            public boolean onLongClick(View view) {
+                ClipboardManager clipboardManager = (ClipboardManager)
+                        getSystemService(Context.CLIPBOARD_SERVICE);
+                clipboardManager.setText(accredit_deviceTv.getText());
+                ToastUtils.toast(mContext, "deviceID 复制成功");
+                return false;
+            }
+        });
+        // 激活失败提示
+        accredit_hintTv = findViewById(R.id.accredit_hintTv);
+        // 离线激活
+        accredit_offTv = findViewById(R.id.accredit_offTv);
+        accredit_offTv.setOnClickListener(this);
+        accredit_offView = findViewById(R.id.accredit_offView);
+
+        accredit_offBtn = findViewById(R.id.accredit_offBtn);
+        accredit_offBtn.setOnClickListener(this);
+        accredit_offhiteTv = findViewById(R.id.accredit_offhiteTv);
+        accredit_offhiteTv.setOnClickListener(this);
+
+        accreditOffRl = findViewById(R.id.accredit_offRl);
+        // 在线激活
+        accredit_onTv = findViewById(R.id.accredit_onTv);
+        accredit_onTv.setOnClickListener(this);
+        accredit_onView = findViewById(R.id.accredit_onView);
+        accredit_onhintTv = findViewById(R.id.accredit_onhintTv);
+        accredit_onBtn = findViewById(R.id.accredit_onBtn);
+        accredit_onBtn.setOnClickListener(this);
+        accredit_onhiteTv = findViewById(R.id.accredit_onhiteTv);
+        accredit_onhiteTv.setOnClickListener(this);
+        accreditOnRl = findViewById(R.id.accredit_onRl);
+        // 应用激活
+        accredit_useTv = findViewById(R.id.accredit_useTv);
+        accredit_useTv.setOnClickListener(this);
+        accredit_useView = findViewById(R.id.accredit_useView);
+        accredit_useBtn = findViewById(R.id.accredit_useBtn);
+        accredit_useBtn.setOnClickListener(this);
+        accredit_usehiteTv = findViewById(R.id.accredit_usehiteTv);
+        accredit_usehiteTv.setOnClickListener(this);
+        accreditUseRl = findViewById(R.id.accredit_useRl);
+
+        rel = findViewById(R.id.parentView);
+        accredit_useErrorTv = findViewById(R.id.accredit_useErrorTv);
+        // 输入序列码
+        activity_et_one = findViewById(R.id.activity_et_one);
+        activity_et_two = findViewById(R.id.activity_et_two);
+        activity_et_three = findViewById(R.id.activity_et_three);
+        activity_et_four = findViewById(R.id.activity_et_four);
+        activity_et_two.setFocusable(false);
+        activity_et_two.setFocusableInTouchMode(false);
+        activity_et_two.requestFocus();
+
+        activity_et_three.setFocusable(false);
+        activity_et_three.setFocusableInTouchMode(false);
+        activity_et_three.requestFocus();
+
+        activity_et_four.setFocusable(false);
+        activity_et_four.setFocusableInTouchMode(false);
+        activity_et_four.requestFocus();
+
+        activity_one_view = findViewById(R.id.activity_one_view);
+        activity_two_view = findViewById(R.id.activity_two_view);
+        activity_three_view = findViewById(R.id.activity_three_view);
+        activity_four_view = findViewById(R.id.activity_four_view);
+
+        initActivation();
+    }
+
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            // 离线激活
+            case R.id.accredit_offBtn:
+                faceAuth.initLicenseOffLine(this, new Callback() {
+                    @Override
+                    public void onResponse(final int code, final String response) {
+                        if (code == 0) {
+                            runOnUiThread(new Runnable() {
+                                @Override
+                                public void run() {
+                                    isFlag = true;
+                                    // 授权成功跳转功能入口页面
+                                    accredit_hintTv.setText("");
+                                    SharedPreferences sp_jihuo = getSharedPreferences("jihuo", Context.MODE_PRIVATE);
+                                    SharedPreferences.Editor editor = sp_jihuo.edit();
+                                    editor.putString("jihuostatus","111");
+                                    editor.commit();
+                                    startActivity(new Intent(mContext, LoadFaceActivity.class));
+                                    finish();
+                                }
+                            });
+                        } else {
+                            runOnUiThread(new Runnable() {
+                                @Override
+                                public void run() {
+                                    if (code == 7) {
+                                        accredit_hintTv.setText("激活失败,设备硬件指纹与License.zip不符");
+                                    } else if (code == 11) {
+                                        accredit_hintTv.setText("激活失败,License.zip文件对应的序列号不在有效期范围内");
+                                    } else if (code == -1) {
+                                        accredit_hintTv.setText("未检测到License.zip文件");
+                                    } else if (code == 14) {
+                                        accredit_hintTv.setText("激活失败,License.zip文件对应的序列号不在有效期范围内");
+                                    } else if (code == 4) {
+                                        accredit_hintTv.setText("激活失败,设备硬件指纹与License.zip不符");
+                                    } else {
+                                        accredit_hintTv.setText(code);
+                                    }
+                                    isTrue = false;
+                                    SharedPreferences sharedPreferences = getSharedPreferences("ws", MODE_PRIVATE);
+                                    SharedPreferences.Editor editor = sharedPreferences.edit();
+                                    editor.putBoolean("accredit", isTrue);
+                                }
+                            });
+
+                        }
+                    }
+                });
+                if (System.currentTimeMillis() - lastClickTime < FAST_CLICK_DELAY_TIME) {
+                    count++;
+                }
+                lastClickTime = System.currentTimeMillis();
+
+                if (count == 3) {
+                    popupWindow.showAsDropDown(accredit_offhiteTv, -15, 10);
+                    count = 0;
+                    initHandler();
+                    accredit_offhiteTv.setTextColor(Color.parseColor("#00BAF2"));
+                }
+                break;
+            // 离线激活
+            case R.id.accredit_offTv:
+                accredit_offView.setVisibility(View.VISIBLE);
+                accredit_onView.setVisibility(View.GONE);
+                accredit_useView.setVisibility(View.GONE);
+                accreditOffRl.setVisibility(View.VISIBLE);
+                accreditOnRl.setVisibility(View.GONE);
+                accreditUseRl.setVisibility(View.GONE);
+                accredit_offTv.setTextColor(getResources().getColor(R.color.white));
+                accredit_onTv.setTextColor(Color.parseColor("#808080"));
+                accredit_useTv.setTextColor(Color.parseColor("#808080"));
+                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+                imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
+                imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
+                popupWindow.dismiss();
+                break;
+            // 在线激活
+            case R.id.accredit_onTv:
+                accredit_offView.setVisibility(View.GONE);
+                accredit_onView.setVisibility(View.VISIBLE);
+                accredit_useView.setVisibility(View.GONE);
+                accreditOffRl.setVisibility(View.GONE);
+                accreditOnRl.setVisibility(View.VISIBLE);
+                accreditUseRl.setVisibility(View.GONE);
+                accredit_offTv.setTextColor(Color.parseColor("#808080"));
+                accredit_onTv.setTextColor(getResources().getColor(R.color.white));
+                accredit_useTv.setTextColor(Color.parseColor("#808080"));
+                popupWindow.dismiss();
+                break;
+            // 应用激活
+            case R.id.accredit_useTv:
+                accredit_offView.setVisibility(View.GONE);
+                accredit_onView.setVisibility(View.GONE);
+                accredit_useView.setVisibility(View.VISIBLE);
+                accreditOffRl.setVisibility(View.GONE);
+                accreditOnRl.setVisibility(View.GONE);
+                accreditUseRl.setVisibility(View.VISIBLE);
+                accredit_offTv.setTextColor(Color.parseColor("#808080"));
+                accredit_onTv.setTextColor(Color.parseColor("#808080"));
+                accredit_useTv.setTextColor(getResources().getColor(R.color.white));
+                InputMethodManager imm1 = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+                imm1.showSoftInput(view, InputMethodManager.SHOW_FORCED);
+                imm1.hideSoftInputFromWindow(view.getWindowToken(), 0);
+                popupWindow.dismiss();
+                break;
+            // 在线激活按钮
+            case R.id.accredit_onBtn:
+                if (System.currentTimeMillis() - lastClickTime < FAST_CLICK_DELAY_TIME) {
+                    count++;
+                }
+                lastClickTime = System.currentTimeMillis();
+                if (count == 3) {
+                    popupWindow.showAsDropDown(accredit_onhiteTv, -15, 10);
+                    count = 0;
+                    initHandler();
+                    accredit_onhiteTv.setTextColor(Color.parseColor("#00BAF2"));
+                }
+                if (activity_et_one.getText().toString().trim().length() == 4 &&
+                        activity_et_two.getText().toString().trim().length() == 4
+                        && activity_et_three.getText().toString().trim().length() == 4
+                        && activity_et_four.getText().toString().trim().length() == 4) {
+                    String et_one = activity_et_one.getText().toString().trim();
+                    String et_two = activity_et_two.getText().toString().trim();
+                    String et_three = activity_et_three.getText().toString().trim();
+                    String et_four = activity_et_four.getText().toString().trim();
+                    end = et_one + "-" + et_two + "-" + et_three + "-" + et_four;
+
+
+                }
+                boolean onNetworkConnected = NetUtil.isNetworkConnected(mContext);
+                if (onNetworkConnected) {
+                    faceAuth.initLicenseOnLine(this, end, new Callback() {
+                        @Override
+                        public void onResponse(final int code, final String response) {
+                            if (code == 0) {
+                                runOnUiThread(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        isFlag = true;
+                                        accredit_onhintTv.setText("");
+                                        SharedPreferences sp_jihuo = getSharedPreferences("jihuo", Context.MODE_PRIVATE);
+                                        SharedPreferences.Editor editor = sp_jihuo.edit();
+                                        editor.putString("jihuostatus","111");
+                                        editor.commit();
+                                        startActivity(new Intent(mContext, LoadFaceActivity.class));
+                                        finish();
+                                    }
+                                });
+                            } else {
+                                runOnUiThread(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        if (response.equals("key invalid")) {
+                                            accredit_onhintTv.setText("序列号有误,请重新输入");
+                                        } else if (response.equals("license has actived on other device")) {
+                                            accredit_onhintTv.setText("激活失败,该序列号已在其它设备激活,请使用其它有效序列号");
+                                        } else if (code == 14) {
+                                            accredit_onhintTv.setText("激活失败,该序列号不在有效期范围内");
+                                        } else if (response.equals("在线激活失败")) {
+                                            accredit_onhintTv.setText("激活失败,该序列号不在有效期范围内");
+                                        } else if (response.equals("auth expired time")) {
+                                            accredit_onhintTv.setText("激活失败,该序列号不在有效期范围内");
+                                        } else {
+                                            accredit_onhintTv.setText(response);
+                                        }
+                                        initShake();
+                                    }
+                                });
+                            }
+                        }
+                    });
+                } else {
+                    accredit_onhintTv.setText("激活失败,请保证设备网络通畅");
+
+                    initShake();
+                }
+                break;
+            // 离线激活遇到问题
+            case R.id.accredit_offhiteTv:
+                bangListener();
+                break;
+            // 在线激活遇到问题
+            case R.id.accredit_onhiteTv:
+                bangListener();
+                break;
+            // 应用激活遇到问题
+            case R.id.accredit_usehiteTv:
+                bangListener();
+                break;
+            // 应用激活
+            case R.id.accredit_useBtn:
+                if (count == 3) {
+                    popupWindow.showAsDropDown(accredit_usehiteTv, -15, 10);
+                    count = 0;
+                    initHandler();
+                    accredit_usehiteTv.setTextColor(Color.parseColor("#00BAF2"));
+                }
+                boolean networkConnected = NetUtil.isNetworkConnected(mContext);
+                if (networkConnected) {
+                    accredit_useErrorTv.setText("");
+                    // todo 提示填写官网申请的批量授权的license ID
+                    faceAuth.initLicenseBatchLine(mContext, "", new Callback() {
+                        @Override
+                        public void onResponse(final int code, final String response) {
+                            if (code == 0) {
+                                runOnUiThread(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        isFlag = true;
+                                        accredit_useErrorTv.setText("");
+                                        SharedPreferences sp_jihuo = getSharedPreferences("jihuo", Context.MODE_PRIVATE);
+                                        SharedPreferences.Editor editor = sp_jihuo.edit();
+                                        editor.putString("jihuostatus","111");
+                                        editor.commit();
+                                        startActivity(new Intent(mContext, LoadFaceActivity.class));
+                                        finish();
+                                    }
+                                });
+                            } else {
+                                runOnUiThread(new Runnable() {
+                                    @Override
+                                    public void run() {
+                                        if (code == 2) {
+                                            accredit_useErrorTv.setText("激活失败,没有有效的激活次数,请购买激活次数");
+                                        } else if (code == 11) {
+                                            accredit_useErrorTv.setText("激活失败,该应用授权已超出授权有效期");
+                                        } else if (code == 14) {
+                                            accredit_useErrorTv.setText("激活失败,该应用授权已超出授权有效期");
+                                        } else {
+                                            accredit_useErrorTv.setText(response);
+                                        }
+                                    }
+                                });
+                            }
+                        }
+                    });
+                } else {
+                    accredit_useErrorTv.setText("激活失败,请保证网络连接正常");
+                }
+                if (System.currentTimeMillis() - lastClickTime < FAST_CLICK_DELAY_TIME) {
+                    count++;
+                }
+                lastClickTime = System.currentTimeMillis();
+                break;
+        }
+    }
+
+    // 为组件设置一个抖动效果
+    private void initShake() {
+        Animation shake = AnimationUtils.loadAnimation(getApplicationContext(),
+                R.anim.shake);
+        activity_et_one.startAnimation(shake);
+        activity_et_two.startAnimation(shake);
+        activity_et_three.startAnimation(shake);
+        activity_et_four.startAnimation(shake);
+        // 改变view的颜色
+        activity_one_view.setBackgroundColor(Color.parseColor("#F34B56"));
+        activity_two_view.setBackgroundColor(Color.parseColor("#FF0033"));
+        activity_three_view.setBackgroundColor(Color.parseColor("#FF0033"));
+        activity_four_view.setBackgroundColor(Color.parseColor("#FF0033"));
+
+    }
+
+    private void bangListener() {
+        Intent intent = new Intent(mContext, StartSettingActivity.class);
+        startActivity(intent);
+    }
+
+    /**
+     * 点击空白区域隐藏键盘.
+     *
+     * @param event the event
+     * @return true, if successful
+     */
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+        if (event.getAction() == MotionEvent.ACTION_DOWN) {
+            if (ActivitionActivity.this.getCurrentFocus() != null) {
+                if (ActivitionActivity.this.getCurrentFocus().getWindowToken() != null) {
+                    imm.hideSoftInputFromWindow(ActivitionActivity.this.getCurrentFocus()
+                            .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
+                }
+            }
+        }
+        return super.onTouchEvent(event);
+    }
+
+    // 激活
+    private void initActivation() {
+        activity_et_one.setTransformationMethod(new AllCapTransformationMethod(true));
+        activity_et_two.setTransformationMethod(new AllCapTransformationMethod(true));
+        activity_et_three.setTransformationMethod(new AllCapTransformationMethod(true));
+        activity_et_four.setTransformationMethod(new AllCapTransformationMethod(true));
+        activity_et_one.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                if (activity_et_one.length() == 0) {
+                    activity_one_view.setBackgroundColor(Color.parseColor("#666666"));
+                } else if (activity_et_one.length() == 4) {
+                    activity_one_view.setBackgroundColor(Color.parseColor("#666666"));
+                    activity_et_two.setFocusable(true);
+                    activity_et_two.setFocusableInTouchMode(true);
+                    activity_et_two.requestFocus();
+                    activity_et_two.setText(activity_et_two.getText().toString().trim() + " ");
+                    activity_et_two.setSelection(activity_et_two.getText().length());
+                } else if (activity_et_one.length() < 4) {
+                    activity_one_view.setBackgroundColor(Color.parseColor("#FFFFFF"));
+                }
+            }
+        });
+        activity_et_two.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                if (activity_et_two.length() == 0) {
+                    activity_et_one.setFocusable(true);
+                    activity_et_one.setFocusableInTouchMode(true);
+                    activity_et_one.requestFocus();
+                    activity_two_view.setBackgroundColor(Color.parseColor("#666666"));
+                } else if (activity_et_two.getText().toString().trim().length() == 4) {
+                    activity_two_view.setBackgroundColor(Color.parseColor("#666666"));
+                    activity_et_three.setFocusable(true);
+                    activity_et_three.setFocusableInTouchMode(true);
+                    activity_et_three.requestFocus();
+                    activity_et_three.setText(activity_et_three.getText().toString().trim() + " ");
+                    activity_et_three.setSelection(activity_et_three.getText().length());
+                } else if (activity_et_two.getText().toString().trim().length() < 4) {
+                    activity_two_view.setBackgroundColor(Color.parseColor("#FFFFFF"));
+                }
+
+
+            }
+        });
+        activity_et_three.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                if (activity_et_three.length() == 0) {
+                    activity_et_two.setFocusable(true);
+                    activity_et_two.setFocusableInTouchMode(true);
+                    activity_et_two.requestFocus();
+                    activity_three_view.setBackgroundColor(Color.parseColor("#666666"));
+
+                } else if (activity_et_three.getText().toString().trim().length() == 4) {
+                    activity_three_view.setBackgroundColor(Color.parseColor("#666666"));
+                    activity_et_four.setFocusable(true);
+                    activity_et_four.setFocusableInTouchMode(true);
+                    activity_et_four.requestFocus();
+                    activity_et_four.setText(activity_et_four.getText().toString().trim() + " ");
+                    activity_et_four.setSelection(activity_et_four.getText().length());
+                } else if (activity_et_three.getText().toString().trim().length() < 4) {
+                    activity_three_view.setBackgroundColor(Color.parseColor("#FFFFFF"));
+                }
+            }
+        });
+        activity_et_four.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                if (activity_et_four.length() == 0) {
+                    activity_et_three.setFocusable(true);
+                    activity_et_three.setFocusableInTouchMode(true);
+                    activity_et_three.requestFocus();
+                    activity_four_view.setBackgroundColor(Color.parseColor("#666666"));
+                } else if (activity_et_four.getText().toString().trim().length() == 4) {
+                    activity_four_view.setBackgroundColor(Color.parseColor("#666666"));
+                    accredit_onBtn.setEnabled(true);
+                    accredit_onBtn.setBackground(getResources().getDrawable(R.mipmap.btn_main_normal));
+                    accredit_onBtn.setTextColor(Color.parseColor("#FFFFFF"));
+                } else if (activity_et_four.getText().toString().trim().length() < 4) {
+                    activity_four_view.setBackgroundColor(Color.parseColor("#FFFFFF"));
+                    accredit_onBtn.setBackground(getResources().getDrawable(R.mipmap.btn_all_d));
+                    accredit_onBtn.setEnabled(false);
+                    accredit_onBtn.setTextColor(Color.parseColor("#666666"));
+                }
+            }
+        });
+    }
+
+    // 转大写
+    public static class AllCapTransformationMethod extends ReplacementTransformationMethod {
+
+        private char[] lower = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
+                'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
+        private char[] upper = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
+                'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
+        private boolean allUpper = false;
+
+        public AllCapTransformationMethod(boolean needUpper) {
+            this.allUpper = needUpper;
+        }
+
+        @Override
+        protected char[] getOriginal() {
+            if (allUpper) {
+                return lower;
+            } else {
+                return upper;
+            }
+        }
+
+        @Override
+        protected char[] getReplacement() {
+            if (allUpper) {
+                return upper;
+            } else {
+                return lower;
+            }
+        }
+    }
+}

+ 265 - 0
app/src/main/java/com/jsw/jswlibrary/baiduregist/StartActivity.java

@@ -0,0 +1,265 @@
+package com.jsw.jswlibrary.baiduregist;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.Environment;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.jsw.jswlibrary.BaseActivity;
+import com.jsw.jswlibrary.CodeBindActivity;
+import com.jsw.jswlibrary.FaceSDKManager;
+import com.jsw.jswlibrary.JswHomeActivity;
+import com.jsw.jswlibrary.R;
+import com.jsw.jswlibrary.listener.SdkInitListener;
+import com.jsw.jswlibrary.utils.AttendanceConfigUtils;
+import com.jsw.jswlibrary.utils.FileUtils;
+import com.jsw.jswlibrary.utils.RegisterConfigUtils;
+import com.jsw.jswlibrary.utils.ToastUtils;
+
+import org.json.JSONObject;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Timer;
+import java.util.TimerTask;
+
+public class StartActivity extends BaseActivity {
+
+    private Context mContext;
+    String folder = Environment.getExternalStorageDirectory() + File.separator + "Settings";
+    String filePath = folder + "/" + "skjhjetkconfig.txt";
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_start);
+        mContext = this;
+        initMyConfig();
+        boolean isAttendanceConfigExit = AttendanceConfigUtils.isConfigExit();
+        boolean isAttendanceInitConfig = AttendanceConfigUtils.initConfig();
+
+        boolean isRegisterConfigExit = RegisterConfigUtils.isConfigExit();
+        boolean isRegisterInitConfig = RegisterConfigUtils.initConfig();
+
+
+        if (isAttendanceInitConfig && isAttendanceConfigExit
+                && isRegisterInitConfig && isRegisterConfigExit
+               ) {
+            Toast.makeText(StartActivity.this, "初始配置加载成功", Toast.LENGTH_SHORT).show();
+        } else {
+            Toast.makeText(StartActivity.this, "初始配置失败,将重置文件内容为默认配置", Toast.LENGTH_SHORT).show();
+
+            AttendanceConfigUtils.modityJson();
+
+            RegisterConfigUtils.modityJson();
+
+        }
+
+        initLicense();
+    }
+
+    private void initLicense() {
+        FaceSDKManager.getInstance().init(mContext, new SdkInitListener() {
+            @Override
+            public void initStart() {
+
+            }
+
+            public void initLicenseSuccess() {
+
+                TimerTask task = new TimerTask() {
+                    @Override
+                    public void run() {
+                        SharedPreferences sp = getSharedPreferences("jihuo", Context.MODE_PRIVATE);
+                        SharedPreferences.Editor editor = sp.edit();
+                        editor.putString("jihuostatus", "1");
+                        editor.commit();
+
+                        com.jsw.jswlibrary.faceregist.FaceSDKManager.getInstance().initModel(mContext, new SdkInitListener() {
+                            @Override
+                            public void initStart() {
+
+                            }
+
+                            @Override
+                            public void initLicenseSuccess() {
+
+                            }
+
+                            @Override
+                            public void initLicenseFail(int errorCode, String msg) {
+                            }
+
+                            @Override
+                            public void initModelSuccess() {
+                                com.jsw.jswlibrary.faceregist.FaceSDKManager.initModelSuccess = true;
+
+
+
+                                //startService(new Intent(mContext, LiantianService.class));
+                                ToastUtils.toast(StartActivity.this, "模型加载成功,欢迎使用");
+                                //Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
+                            }
+
+                            @Override
+                            public void initModelFail(int errorCode, String msg) {
+                                com.jsw.jswlibrary.faceregist.FaceSDKManager.initModelSuccess = false;
+                                if (errorCode != -12) {
+                                    ToastUtils.toast(StartActivity.this, "模型加载失败,请尝试重启应用");
+                                }
+                            }
+                        });
+
+                        /**
+                         *要执行的操作
+                         */
+                        startActivity(new Intent(mContext, JswHomeActivity.class));
+                        finish();
+                    }
+                };
+                Timer timer = new Timer();
+                timer.schedule(task, 2000);
+            }
+
+            @Override
+            public void initLicenseFail(int errorCode, String msg) {
+                TimerTask task = new TimerTask() {
+                    @Override
+                    public void run() {
+
+                        SharedPreferences sp = getSharedPreferences("jihuo", Context.MODE_PRIVATE);
+                        SharedPreferences.Editor editor = sp.edit();
+                        editor.putString("jihuostatus", "0");
+                        editor.commit();
+
+                        /**
+                         *要执行的操作
+                         */
+                        if(model == 1){
+                            startActivity(new Intent(StartActivity.this, ActivitionActivity.class));
+                        }else {
+                            startActivity(new Intent(mContext, JswHomeActivity.class));
+                        }
+                        //startActivity(new Intent(mContext, CodeBindActivity.class));
+                        finish();
+                    }
+                };
+                Timer timer = new Timer();
+                timer.schedule(task, 2000);
+            }
+
+            @Override
+            public void initModelSuccess() {
+            }
+
+            @Override
+            public void initModelFail(int errorCode, String msg) {
+
+            }
+        });
+    }
+
+
+    private void initMyConfig(){
+
+        //配置文件
+        File file1 = new File(folder);
+        if (!file1.exists()) {
+            file1.mkdirs();
+        }
+        File file = new File(filePath);
+        /*if(file.exists()) {
+            file.deleteOnExit();
+        }
+        try {
+            file.createNewFile();
+            modityJson();
+        } catch (IOException e) {
+            e.printStackTrace();
+
+        }*/
+        if (file.exists()) {
+            initConfig();
+        } else {
+            try {
+                file.createNewFile();
+                modityJson();
+            } catch (IOException e) {
+                e.printStackTrace();
+
+            }
+
+        }
+    }
+    /**
+     * 修改配置文件内容并重新读取配置
+     */
+    public boolean modityJson() {
+
+        JSONObject jsonObject = new JSONObject();
+
+        try {
+            jsonObject.put("model_camear_facing", 1);
+            jsonObject.put("host","http://hnts.jyzbgl.cn");
+            //jsonObject.put("orgid","");
+            jsonObject.put("orgid","");
+            jsonObject.put("libraryid","");
+            jsonObject.put("cardtype", 1);//0:需反转,1:不需要反转
+            jsonObject.put("apptitle", "自助借还机");
+            jsonObject.put("model",0);
+            jsonObject.put("hasIDCard", false);
+            jsonObject.put("hasICCard", true);
+            jsonObject.put("botelv_rfid",19200);
+            jsonObject.put("botelv_idreader", 115200);
+            jsonObject.put("chuankouhao_fix_name_rfid","/dev/ttyXRUSB");
+            jsonObject.put("chuankouhao_rfid", 0);
+            jsonObject.put("chuankouhao_fix_name_idreader","/dev/ttyXRUSB");
+            jsonObject.put("chuankouhao_idreader", 2);
+            // 修改内容写入配置文件
+            FileUtils.writeTxtFile(jsonObject.toString(), filePath);
+            // 重新读取配置文件内容
+            initConfig();
+
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+    public Boolean initConfig() {
+        String configMessage = FileUtils.txt2String(filePath);
+        if (configMessage.equals("")) {
+            Log.e("facesdk", "文件不存在");
+            return false;
+        }
+        JSONObject jsonObject = null;
+        try {
+            jsonObject = new JSONObject(configMessage);
+
+            BaseActivity.model_camear_facing = jsonObject.getInt("model_camear_facing");
+            BaseActivity.host = jsonObject.getString("host");
+            BaseActivity.orgid = jsonObject.getString("orgid");
+            BaseActivity.libraryid = jsonObject.getString("libraryid");
+            BaseActivity.cardtype = jsonObject.getInt("cardtype");
+            BaseActivity.apptitle = jsonObject.getString("apptitle");
+            BaseActivity.model = jsonObject.getInt("model");
+            BaseActivity.hasICCard = jsonObject.getBoolean("hasICCard");
+            BaseActivity.hasIDCard = jsonObject.getBoolean("hasIDCard");
+            BaseActivity.botelv_rfid = jsonObject.getInt("botelv_rfid");
+            BaseActivity.botelv_idreader = jsonObject.getInt("botelv_idreader");
+            BaseActivity.chuankouhao_fix_name_rfid = jsonObject.getString("chuankouhao_fix_name_rfid");
+            BaseActivity.chuankouhao_rfid = jsonObject.getInt("chuankouhao_rfid");
+            BaseActivity.chuankouhao_fix_name_idreader = jsonObject.getString("chuankouhao_fix_name_idreader");
+            BaseActivity.chuankouhao_idreader = jsonObject.getInt("chuankouhao_idreader");
+            BaseActivity.hasICCard = jsonObject.getBoolean("hasICCard");
+            BaseActivity.hasIDCard = jsonObject.getBoolean("hasIDCard");
+        } catch (Exception e) {
+            e.printStackTrace();
+            Log.e("facesdk", "文件内容异常,请检测是否规范");
+            return false;
+        }
+        return true;
+    }
+}

+ 45 - 0
app/src/main/java/com/jsw/jswlibrary/baiduregist/StartSettingActivity.java

@@ -0,0 +1,45 @@
+package com.jsw.jswlibrary.baiduregist;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.jsw.jswlibrary.BaseActivity;
+import com.jsw.jswlibrary.R;
+
+
+public class StartSettingActivity extends BaseActivity implements View.OnClickListener {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_start_setting);
+        initView();
+    }
+
+    private void initView() {
+        TextView setting_urlTv = findViewById(R.id.setting_urlTv);
+        setting_urlTv.setOnClickListener(this);
+        ImageView startSettingBack = findViewById(R.id.start_setting_back);
+        startSettingBack.setOnClickListener(this);
+    }
+
+    @Override
+    public void onClick(View view) {
+        switch (view.getId()) {
+            case R.id.setting_urlTv:
+                Intent intent = new Intent();
+                intent.setAction("android.intent.action.VIEW");
+                Uri content_url = Uri.parse("https://login.bce.baidu.com/");
+                intent.setData(content_url);
+                startActivity(intent);
+                break;
+            case R.id.start_setting_back:
+                finish();
+                break;
+        }
+    }
+}

+ 54 - 0
app/src/main/java/com/jsw/jswlibrary/common/GsonUtil.java

@@ -0,0 +1,54 @@
+package com.jsw.jswlibrary.common;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.internal.LinkedTreeMap;
+import com.google.gson.reflect.TypeToken;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Auther: Anders Ni
+ * @Date: 2020/1/9
+ * @Description: com.rightin.uitl
+ * @Version: V1.0
+ * json解析帮助类
+ */
+public class GsonUtil {
+    // 将Json数据解析成相应的映射对象
+    public static <T> T parseJsonWithGson(String jsonData, Class<T> type) {
+        Gson gson = new Gson();
+        T result = gson.fromJson(jsonData, type);
+        return result;
+    }
+    // 将Map转化为实体对象
+    public static <T> T parseLinkedTreeMap(LinkedTreeMap<String, Object> map, Class<T> type){
+        Gson gson = new Gson();
+        String jsonData = gson.toJson(map);
+        T result = gson.fromJson(jsonData, type);
+        return result;
+    }
+    // 将Json数组解析成相应的映射对象列表
+    public static <T> List<T> parseJsonArrayWithGson(String jsonData,
+                                                     Class<T> type) {
+        Gson gson = new Gson();
+        List<T> result = gson.fromJson(jsonData, new TypeToken<List<T>>() {}.getType());
+        List<T> result2 = new ArrayList<T>();
+        //返回的是LinkedTreeMap类型
+        for(T m : result){
+            Gson gson1 = new GsonBuilder().enableComplexMapKeySerialization().create();
+            String jsonString = gson1.toJson(m);
+            T m0 = gson1.fromJson(jsonString, type);
+            result2.add(m0);
+        }
+        return result2;
+    }
+    public static String toJson(Object object) {
+        GsonBuilder gsonBuilder = new GsonBuilder();
+        gsonBuilder.setPrettyPrinting();
+        Gson gson = gsonBuilder.create();
+        return gson.toJson(object);
+    }
+
+}

+ 86 - 0
app/src/main/java/com/jsw/jswlibrary/common/MyTimer.java

@@ -0,0 +1,86 @@
+package com.jsw.jswlibrary.common;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * Created by anders on 2018-4-10.
+ * 定时器控件
+ */
+
+public class MyTimer {
+    private boolean _Enabled;
+    private int _Interval = 100;
+    private Timer timer1;
+    private String tagName;
+
+    public String getTagName() {
+        return tagName;
+    }
+
+    public void setTagName(String tagName) {
+        this.tagName = tagName;
+    }
+
+    //定义接口,相当于C#委托
+    public interface OnTimerTickListener{
+        public void onTick(String tagName);
+    }
+    private OnTimerTickListener timeListener;
+    public void setOnTimerTickListener(OnTimerTickListener _timeListener) {
+        timeListener = _timeListener;
+    }
+    public MyTimer(){}
+
+    public MyTimer(String tagName) {
+        this.tagName = tagName;
+    }
+
+    public MyTimer(int paramInt) {
+        this._Interval = paramInt;
+    }
+
+    public void start() {
+        if (this.timer1 != null) {
+            this.timer1.cancel();
+        }
+        this.timer1 = new Timer();
+        this.timer1.schedule(new TimerTask() {
+            public void run() {
+                if (MyTimer.this.timeListener != null) {
+                    MyTimer.this.timeListener.onTick(tagName);
+                }
+            }
+        }, this._Interval, this._Interval);
+        this._Enabled = true;
+    }
+
+    public void stop()
+    {
+        if (this.timer1 != null) {
+            this.timer1.cancel();
+        }
+        this._Enabled = false;
+    }
+
+    public boolean getEnabled() {
+        return this._Enabled;
+    }
+
+    public int getInterval() {
+        return this._Interval;
+    }
+
+    public void setEnabled(boolean paramBoolean) {
+        this._Enabled = paramBoolean;
+        if (paramBoolean) {
+            start();
+            return;
+        }
+        stop();
+    }
+
+    public void setInterval(int paramInt) {
+        this._Interval = paramInt;
+    }
+}

+ 33 - 0
app/src/main/java/com/jsw/jswlibrary/common/PubData.java

@@ -0,0 +1,33 @@
+package com.jsw.jswlibrary.common;
+
+
+
+import com.rightin.reader.hf.myhf.HfConnector;
+
+import com.rightin.reader.hf.myhf.HfReader;
+import com.rightin.serialportapi.SerialPortFinder;
+
+/**
+ * 作者:anders on 2018/10/6 21:52
+ * 邮箱:nifangzhen@126.com
+ */
+public class PubData {
+    public static HfReader reader = new HfReader();
+    public static HfConnector reader_tcp = new HfConnector();
+
+    public static String GetSerialPortList(){
+        SerialPortFinder finder = new SerialPortFinder();
+        String[] strs2 = finder.getAllDevicesPath();
+        String temp = "";
+        for(String s : strs2){
+//            Log.i("getAllDevicesPath", s);
+            //   /dev/ttyCOM0  //12
+            String fix = s.substring(0, s.length() - 1);
+            String idx = s.substring(s.length() - 1, s.length());
+            fix = fix + ":" + idx;
+            temp += "<option value='" + idx + "'>" + fix + "</option>\r\n";
+        }
+//        Log.i("select", temp);
+        return temp;
+    }
+}

+ 80 - 0
app/src/main/java/com/jsw/jswlibrary/common/TagData.java

@@ -0,0 +1,80 @@
+package com.jsw.jswlibrary.common;
+
+/**
+ * 作者:anders on 2020/2/16 20:54
+ * 邮箱:nifangzhen@126.com
+ */
+public class TagData {
+    private int id;
+    private String uid;
+    private int dsfid;
+    private String tag_type;
+    private int ant_id;
+    private String block_data;
+    private int times;
+    private String date_time;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getUid() {
+        return uid;
+    }
+
+    public void setUid(String uid) {
+        this.uid = uid;
+    }
+
+    public int getDsfid() {
+        return dsfid;
+    }
+
+    public void setDsfid(int dsfid) {
+        this.dsfid = dsfid;
+    }
+
+    public String getTag_type() {
+        return tag_type;
+    }
+
+    public void setTag_type(String tag_type) {
+        this.tag_type = tag_type;
+    }
+
+    public int getAnt_id() {
+        return ant_id;
+    }
+
+    public void setAnt_id(int ant_id) {
+        this.ant_id = ant_id;
+    }
+
+    public String getBlock_data() {
+        return block_data;
+    }
+
+    public void setBlock_data(String block_data) {
+        this.block_data = block_data;
+    }
+
+    public int getTimes() {
+        return times;
+    }
+
+    public void setTimes(int times) {
+        this.times = times;
+    }
+
+    public String getDate_time() {
+        return date_time;
+    }
+
+    public void setDate_time(String date_time) {
+        this.date_time = date_time;
+    }
+}

File diff suppressed because it is too large
+ 1350 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/FaceSDKManager.java


+ 33 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/activity/BaseOrbbecActivity.java

@@ -0,0 +1,33 @@
+package com.jsw.jswlibrary.faceregist.activity;
+
+import android.os.Bundle;
+
+import com.jsw.jswlibrary.BaseActivity;
+
+import org.openni.OpenNI;
+
+public class BaseOrbbecActivity extends BaseActivity {
+
+    private boolean isFirstOpenOrbbecSDK = true;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (isFirstOpenOrbbecSDK) {
+            initializeOpenNI();
+            isFirstOpenOrbbecSDK = false;
+        }
+    }
+
+    /**
+     * 只需要初始化一次即可
+     */
+    public void initializeOpenNI() {
+        // 设置SDK Log 日志是否输出
+        OpenNI.setLogAndroidOutput(true);
+        // 设置Log日志输出级别
+        OpenNI.setLogMinSeverity(0);
+        // 初始化SDK
+        OpenNI.initialize();
+    }
+}

+ 341 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/activity/BatchImportActivity.java

@@ -0,0 +1,341 @@
+package com.jsw.jswlibrary.faceregist.activity;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import com.jsw.jswlibrary.R;
+import com.jsw.jswlibrary.BaseActivity;
+
+import com.jsw.jswlibrary.faceregist.FaceSDKManager;
+import com.jsw.jswlibrary.faceregist.api.FaceApi;
+import com.jsw.jswlibrary.faceregist.db.DBManager;
+import com.jsw.jswlibrary.faceregist.manager.ImportFileManager;
+import com.jsw.jswlibrary.faceregist.manager.ShareManager;
+import com.jsw.jswlibrary.faceregist.view.CircularProgressView;
+import com.jsw.jswlibrary.faceregist.view.TipDialog;
+import com.jsw.jswlibrary.listener.OnImportListener;
+import com.jsw.jswlibrary.listener.SdkInitListener;
+import com.jsw.jswlibrary.utils.FileUtils;
+import com.jsw.jswlibrary.utils.ToastUtils;
+
+
+/**
+ * 批量导入
+ * Created by v_liujialu01 on 2019/5/27.
+ */
+
+public class BatchImportActivity extends BaseActivity implements View.OnClickListener, OnImportListener,
+        TipDialog.OnTipDialogClickListener {
+
+    // view
+    private TextView mButtonImport;             // 导入数据的按钮
+    private RelativeLayout mRelativeImport;   // 显示进度的布局
+    private View mViewBg;                      // 灰色背景
+    private RelativeLayout mRelativeShow;      // 显示已上传文件
+
+    // import
+    private CircularProgressView mProgressBar;
+    private TextView mTextImportFinish;   // 已处理
+    private TextView mTextImportSuccess;  // 成功
+    private TextView mTextImportFailure;  // 失败
+    private TextView mTextImportTitle;
+    private TextView mTextFinishTitle;
+    private TextView mTextProgress;
+    private Button mBtnDialogClose;
+
+    private TipDialog mTipDialog;
+
+    private Context mContext;
+    private volatile boolean mImporting;   // 导入状态,是否正在导入
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        initListener();
+        setContentView(R.layout.activity_batch_imports);
+        mContext = this;
+        initView();
+        initData();
+    }
+
+    private void initListener() {
+        if (FaceSDKManager.initStatus != FaceSDKManager.SDK_MODEL_LOAD_SUCCESS) {
+            FaceSDKManager.getInstance().initModel(this, new SdkInitListener() {
+                @Override
+                public void initStart() {
+                }
+
+                @Override
+                public void initLicenseSuccess() {
+                }
+
+                @Override
+                public void initLicenseFail(int errorCode, String msg) {
+                }
+
+                @Override
+                public void initModelSuccess() {
+                    FaceSDKManager.initModelSuccess = true;
+                    ToastUtils.toast(BatchImportActivity.this, "模型加载成功,欢迎使用");
+                }
+
+                @Override
+                public void initModelFail(int errorCode, String msg) {
+                    FaceSDKManager.initModelSuccess = false;
+                    if (errorCode != -12) {
+                        ToastUtils.toast(BatchImportActivity.this, "模型加载失败,请尝试重启应用");
+                    }
+                }
+            });
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        mContext = null;
+        // 释放
+        ImportFileManager.getInstance().setIsNeedImport(false);
+        ImportFileManager.getInstance().release();
+    }
+
+    private void initView() {
+        mTipDialog = new TipDialog(mContext);
+        mTipDialog.setOnTipDialogClickListener(this);
+        ImageView imageBack = findViewById(R.id.image_import_back);
+        imageBack.setOnClickListener(this);
+        mButtonImport = findViewById(R.id.button_import);
+        mButtonImport.setOnClickListener(this);
+        mRelativeImport = findViewById(R.id.relative_progress);
+        mProgressBar = findViewById(R.id.progress_bar);
+        mTextImportFinish = findViewById(R.id.text_import_finish);
+        mTextImportSuccess = findViewById(R.id.text_import_success);
+        mTextImportFailure = findViewById(R.id.text_import_failure);
+        mTextImportTitle = findViewById(R.id.text_progress_title);
+        mTextFinishTitle = findViewById(R.id.text_title_finish);
+        mTextProgress = findViewById(R.id.text_progress);
+        mViewBg = findViewById(R.id.view_bg);
+        mBtnDialogClose = findViewById(R.id.button_prog_close);
+        mBtnDialogClose.setOnClickListener(this);
+        mRelativeShow = findViewById(R.id.linear_show);
+        ImageView imageClose = findViewById(R.id.image_delete);
+        imageClose.setOnClickListener(this);
+    }
+
+    private void initData() {
+        // 判断是否存在face.db文件
+        if (ShareManager.getInstance(mContext).getDBState()) {
+            mRelativeShow.setVisibility(View.VISIBLE);
+            mButtonImport.setText("重新导入");
+        }
+        ImportFileManager.getInstance().setOnImportListener(this);
+    }
+
+    @Override
+    public void onClick(View view) {
+        int id = view.getId();
+        if (id == R.id.button_import) {   // 点击导入数据按钮
+            if (!mImporting) {
+                if (!FileUtils.isSdCardAvailable()) {
+                    ToastUtils.toast(mContext, "请插入SD卡");
+                    return;
+                }
+
+                if ("重新导入".equals(mButtonImport.getText())) {
+                    mTipDialog.show();
+                    mTipDialog.setTextTitle("重新导入");
+                    mTipDialog.setTextMessage("旧人脸数据将被覆盖,确认重新导入?");
+                    mTipDialog.setTextConfirm("导入");
+                    mTipDialog.setCancelable(false);
+                    return;
+                }
+
+                mImporting = true;
+                // 开始导入
+                ImportFileManager.getInstance().batchImport();
+            }
+        } else if (id == R.id.image_import_back) {
+            finish();
+        } else if (id == R.id.button_prog_close) {
+            animatorTranslateDown(mRelativeImport);
+        } else if (id == R.id.image_delete) {    // 删除导入的库
+            mTipDialog.show();
+            mTipDialog.setTextTitle("确定删除");
+            mTipDialog.setTextMessage("删除后人脸库将被清空,确认删除?");
+            mTipDialog.setTextConfirm("删除");
+            mTipDialog.setCancelable(false);
+        }
+    }
+
+    /**
+     * 解压完毕,显示导入进度View
+     */
+    @Override
+    public void showProgressView() {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                if (mViewBg == null || mRelativeImport == null
+                        || mTextImportTitle == null || mTextFinishTitle == null) {
+                    return;
+                }
+                animatorTranslateUp(mRelativeImport);
+                mTextImportTitle.setVisibility(View.VISIBLE);
+                mTextFinishTitle.setVisibility(View.GONE);
+            }
+        });
+    }
+
+    /**
+     * 正在导入,实时更新导入状态
+     */
+    @Override
+    public void onImporting(final int totalCount, final int successCount, final int failureCount,
+                            final float progress) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                if (mProgressBar == null || mTextImportFinish == null
+                        || mTextImportSuccess == null || mTextImportFailure == null) {
+                    return;
+                }
+                // mBtnDialogClose.setEnabled(false);    // 设置进度条“关闭”不可点击
+                mProgressBar.setProgress((int) (progress * 100));
+                mTextImportFinish.setText("数据总数:" + totalCount);
+                mTextImportSuccess.setText("导入成功:" + successCount);
+                mTextImportFailure.setText("导入失败:" + failureCount);
+                mTextProgress.setText("" + ((int) (progress * 100)));
+            }
+        });
+    }
+
+    /**
+     * 导入结束,显示导入结果
+     */
+    @Override
+    public void endImport(final int totalCount, final int successCount, final int failureCount) {
+        // 数据变化,更新内存
+        FaceApi.getInstance().initDatabases(true);
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                if (mTextImportTitle == null || mTextFinishTitle == null) {
+                    return;
+                }
+                mBtnDialogClose.setEnabled(true);    // 设置进度条“关闭”可点击
+                mTextImportTitle.setVisibility(View.INVISIBLE);
+                mTextFinishTitle.setVisibility(View.VISIBLE);
+                mTextImportFinish.setText("数据总数:" + totalCount);
+                mTextImportSuccess.setText("导入成功:" + successCount);
+                mTextImportFailure.setText("导入失败:" + failureCount);
+                mTextImportFailure.setTextColor(Color.parseColor("#F34B56"));
+                mRelativeShow.setVisibility(View.VISIBLE);
+                mButtonImport.setText("重新导入");
+                // 设置数据库状态
+                ShareManager.getInstance(mContext).setDBState(true);
+                mImporting = false;
+            }
+        });
+    }
+
+    /**
+     * 提示导入过程中的错误信息
+     */
+    @Override
+    public void showToastMessage(final String message) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                if (message == null) {
+                    return;
+                }
+                ToastUtils.toast(mContext, message);
+                mImporting = false;
+            }
+        });
+    }
+
+    /**
+     * 从底部向上出现的动画
+     * @param view
+     */
+    private void animatorTranslateUp(View view) {
+        ObjectAnimator translateAnimator = ObjectAnimator.ofFloat(view, "translationY",
+                view.getHeight(), 0);
+        translateAnimator.setDuration(300);
+        translateAnimator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+                super.onAnimationStart(animation);
+                mViewBg.setVisibility(View.VISIBLE);
+                mRelativeImport.setVisibility(View.VISIBLE);
+            }
+        });
+        translateAnimator.start();
+    }
+
+    /**
+     * 从上向下的动画
+     * @param view
+     */
+    private void animatorTranslateDown(View view) {
+        ObjectAnimator translateAnimator = ObjectAnimator.ofFloat(view, "translationY",
+                0, view.getHeight());
+        translateAnimator.setDuration(300);
+        translateAnimator.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                super.onAnimationEnd(animation);
+                mViewBg.setVisibility(View.GONE);
+                mRelativeImport.setVisibility(View.GONE);
+                ImportFileManager.getInstance().setIsNeedImport(false);
+                ImportFileManager.getInstance().release();
+            }
+        });
+        translateAnimator.start();
+    }
+
+    @Override
+    public void onCancel() {
+        if (mTipDialog != null) {
+            mTipDialog.dismiss();
+        }
+    }
+
+    @Override
+    public void onConfirm(String tipType) {
+        if (mTipDialog != null) {
+            mTipDialog.dismiss();
+        }
+        // 根据对话框的内容来判断操作
+        if ("重新导入".equals(tipType)) {
+            if (!mImporting) {
+                if (!FileUtils.isSdCardAvailable()) {
+                    ToastUtils.toast(mContext, "请插入SD卡");
+                    return;
+                }
+                mImporting = true;
+                // 开始导入
+                ImportFileManager.getInstance().setIsNeedImport(true);
+                ImportFileManager.getInstance().batchImport();
+            }
+        } else if ("确定删除".equals(tipType)) {
+            // 清空用户表
+            DBManager.getInstance().clearTable();
+            // 设置数据库状态
+            ShareManager.getInstance(mContext).setDBState(false);
+            mRelativeShow.setVisibility(View.GONE);
+            mButtonImport.setText("导入数据");
+            mImporting = false;
+        }
+    }
+}

+ 689 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/activity/UserManagerActivity.java

@@ -0,0 +1,689 @@
+package com.jsw.jswlibrary.faceregist.activity;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.PopupWindow;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.annotation.CallSuper;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.jsw.jswlibrary.R;
+import com.jsw.jswlibrary.BaseActivity;
+import com.jsw.jswlibrary.faceregist.FaceSDKManager;
+import com.jsw.jswlibrary.faceregist.api.FaceApi;
+import com.jsw.jswlibrary.faceregist.manager.ShareManager;
+import com.jsw.jswlibrary.faceregist.manager.UserInfoManager;
+import com.jsw.jswlibrary.faceregist.register.FaceRegisterNewActivity;
+import com.jsw.jswlibrary.faceregist.register.FaceRegisterNewDepthActivity;
+import com.jsw.jswlibrary.faceregist.register.FaceRegisterNewNIRActivity;
+import com.jsw.jswlibrary.faceregist.register.FaceRegisterNewRgbNirDepthActivity;
+import com.jsw.jswlibrary.faceregist.view.CircleImageView;
+import com.jsw.jswlibrary.faceregist.view.TipDialog;
+import com.jsw.jswlibrary.listener.OnItemClickListener;
+import com.jsw.jswlibrary.listener.OnRemoveListener;
+import com.jsw.jswlibrary.listener.SdkInitListener;
+import com.jsw.jswlibrary.model.SingleBaseConfig;
+import com.jsw.jswlibrary.model.User;
+import com.jsw.jswlibrary.utils.BitmapUtils;
+import com.jsw.jswlibrary.utils.DensityUtils;
+import com.jsw.jswlibrary.utils.FileUtils;
+import com.jsw.jswlibrary.utils.KeyboardsUtils;
+import com.jsw.jswlibrary.utils.ToastUtils;
+
+import java.util.List;
+
+/**
+ * 用户管理页面
+ * Created by liujialu on 2020/02/10.
+ */
+
+public class UserManagerActivity extends BaseActivity implements View.OnClickListener,
+        CompoundButton.OnCheckedChangeListener, OnItemClickListener,
+        TipDialog.OnTipDialogClickListener, OnRemoveListener {
+    private static final String TAG = UserManagerActivity.class.getName();
+
+    // view
+    private RecyclerView mRecyclerUserManager;
+    private ImageView mImageIconSearch;        // title中的搜索按钮
+    private RelativeLayout mRelativeStandard; // title中的常规布局
+    private LinearLayout mLinearSearch;       // title中的搜索布局
+    private ImageView mImageMenu;             // title中的菜单
+    private boolean isCheck = false;            // title菜单点击状态
+    private TextView mTextCancel;             // title中的取消按钮
+    private RelativeLayout mRelativeEmpty;   // 暂无内容
+    private TextView mTextEmpty;
+    private EditText mEditTitleSearch;
+
+    private PopupWindow mPopupMenu;
+    private RelativeLayout mRelativeDelete;   // 删除布局
+    private CheckBox mCheckAll;               // 全选
+    private TextView mTextDelete;             // 删除
+    private TipDialog mTipDialog;
+
+    // pop
+    private RelativeLayout mPopRelativeImport;
+
+    private Context mContext;
+    private UserListListener mUserListListener;
+    private FaceUserAdapter mFaceUserAdapter;
+    private List<User> mUserInfoList;
+    private int mSelectCount;                // 选中的个数
+    private boolean mIsLongClick;           // 是否是长按
+    private int mLiveType;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        initListener();
+        FaceSDKManager.getInstance().initDataBases(this);
+        setContentView(R.layout.activity_user_manager);
+        mContext = this;
+        initView();
+        initData();
+    }
+
+    private void initListener() {
+        if (FaceSDKManager.initStatus != FaceSDKManager.SDK_MODEL_LOAD_SUCCESS) {
+            FaceSDKManager.getInstance().initModel(this, new SdkInitListener() {
+                @Override
+                public void initStart() {
+                }
+
+                @Override
+                public void initLicenseSuccess() {
+                }
+
+                @Override
+                public void initLicenseFail(int errorCode, String msg) {
+                }
+
+                @Override
+                public void initModelSuccess() {
+                    FaceSDKManager.initModelSuccess = true;
+                    ToastUtils.toast(UserManagerActivity.this, "模型加载成功,欢迎使用");
+                }
+
+                @Override
+                public void initModelFail(int errorCode, String msg) {
+                    FaceSDKManager.initModelSuccess = false;
+                    if (errorCode != -12) {
+                        ToastUtils.toast(UserManagerActivity.this, "模型加载失败,请尝试重启应用");
+                    }
+                }
+            });
+        }
+    }
+
+    @Override
+    protected void onRestart() {
+        super.onRestart();
+        // 读取数据库,获取用户信息
+        UserInfoManager.getInstance().getUserListInfo(null, mUserListListener);
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        // 数据变化,更新内存
+        FaceApi.getInstance().initDatabases(true);
+    }
+
+    private void initView() {
+        mRecyclerUserManager = findViewById(R.id.recycler_user_manager);
+        mRecyclerUserManager.setOnClickListener(this);
+        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(mContext);
+        mRecyclerUserManager.setLayoutManager(layoutManager);
+        // title相关的控件
+        mRelativeStandard = findViewById(R.id.relative_standard);
+        mLinearSearch = findViewById(R.id.linear_title_search);
+        mImageIconSearch = findViewById(R.id.image_icon_research);
+        mImageIconSearch.setOnClickListener(this);
+        mImageMenu = findViewById(R.id.image_menu);
+        mImageMenu.setOnClickListener(this);
+        mTextCancel = findViewById(R.id.text_cancel);
+        mTextCancel.setOnClickListener(this);
+
+        mRelativeEmpty = findViewById(R.id.relative_empty);
+        mTextEmpty = findViewById(R.id.text_empty);
+        // 删除相关的控件
+        mRelativeDelete = findViewById(R.id.relative_botton_delete);
+        mRelativeDelete.setOnClickListener(this);
+        mCheckAll = findViewById(R.id.check_all);
+        mCheckAll.setOnCheckedChangeListener(this);
+        mTextDelete = findViewById(R.id.text_delete);
+        mTextDelete.setOnClickListener(this);
+        // title中的搜索框取消按钮
+        Button btnTitleCancel = findViewById(R.id.btn_title_cancel);
+        btnTitleCancel.setOnClickListener(this);
+        ImageView imageBack = findViewById(R.id.image_back);
+        imageBack.setOnClickListener(this);
+        ImageView imageInputDelete = findViewById(R.id.image_input_delete);
+        imageInputDelete.setOnClickListener(this);
+        // 初始化PopupWindow
+        initPopupWindow();
+        mTipDialog = new TipDialog(mContext);
+        mTipDialog.setOnTipDialogClickListener(this);
+
+        mFaceUserAdapter = new FaceUserAdapter();
+        mRecyclerUserManager.setAdapter(mFaceUserAdapter);
+        mFaceUserAdapter.setItemClickListener(this);
+        mFaceUserAdapter.setOnRemoveListener(this);
+
+        // title中的搜索框
+        mEditTitleSearch = findViewById(R.id.edit_title_search);
+        // 搜索框输入监听事件
+        mEditTitleSearch.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+                if (mUserListListener != null && s != null) {
+                    // 读取数据库,获取用户信息
+                    UserInfoManager.getInstance().getUserListInfo(s.toString(), mUserListListener);
+                }
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+
+            }
+        });
+    }
+
+    /**
+     * 初始化PopupWindow
+     */
+    private void initPopupWindow() {
+        View contentView = LayoutInflater.from(mContext).inflate(R.layout.userpopup_menu, null);
+        mPopupMenu = new PopupWindow(contentView,
+                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
+        mPopupMenu.setFocusable(true);
+        mPopupMenu.setOutsideTouchable(true);
+        mPopupMenu.setBackgroundDrawable(getResources().getDrawable(R.drawable.menu_round));
+
+        RelativeLayout relativeRegister = contentView.findViewById(R.id.relative_register);
+        mPopRelativeImport = contentView.findViewById(R.id.relative_import);
+        RelativeLayout relativeDelete = contentView.findViewById(R.id.relative_delete);
+
+        relativeRegister.setOnClickListener(this);
+        mPopRelativeImport.setOnClickListener(this);
+        relativeDelete.setOnClickListener(this);
+        mPopupMenu.setContentView(contentView);
+    }
+
+    private void initData() {
+        mLiveType = SingleBaseConfig.getBaseConfig().getType();
+        mUserListListener = new UserListListener();
+        // 读取数据库,获取用户信息
+        UserInfoManager.getInstance().getUserListInfo(null, mUserListListener);
+    }
+
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.btn_title_cancel) {  // 取消按钮
+            mEditTitleSearch.setText("");
+            mLinearSearch.setVisibility(View.GONE);
+            mRelativeStandard.setVisibility(View.VISIBLE);
+            UserInfoManager.getInstance().getUserListInfo(null, mUserListListener);
+        } else if (id == R.id.image_icon_research) {  // 搜索按钮
+            mLinearSearch.setVisibility(View.VISIBLE);
+            mRelativeStandard.setVisibility(View.GONE);
+        } else if (id == R.id.image_back) {
+            // 返回
+            finish();
+        } else if (id == R.id.image_menu) {
+            if (!isCheck) {
+                isCheck = true;
+                mImageMenu.setImageResource(R.mipmap.icon_titlebar_menu_hl);
+                showPopupWindow(mImageMenu);
+            }
+        } else if (id == R.id.relative_register) {      // 进入注册页面
+            dismissPopupWindow();
+            judgeLiveType(mLiveType, FaceRegisterNewActivity.class, FaceRegisterNewNIRActivity.class,
+                    FaceRegisterNewDepthActivity.class, FaceRegisterNewRgbNirDepthActivity.class);
+        } else if (id == R.id.relative_import) {        // 进入批量导入页面
+            dismissPopupWindow();
+            Intent intent2 = new Intent(mContext, BatchImportActivity.class);
+            startActivity(intent2);
+        } else if (id == R.id.relative_delete) {       // 显示删除UI
+            dismissPopupWindow();
+            updateDeleteUI(true);
+        } else if (id == R.id.text_cancel) {           // 批量删除取消
+            updateDeleteUI(false);
+        } else if (id == R.id.text_delete) {           // 批量删除
+            if (mSelectCount == 0) {
+                ToastUtils.toast(getApplicationContext(), "请选择要删除的用户");
+                return;
+            }
+            mTipDialog.show();
+            mTipDialog.setTextTitle("确认删除");
+            mTipDialog.setTextMessage("删除后人脸数据不可恢复,确认删除?");
+            mTipDialog.setTextConfirm("删除(" + mSelectCount + ")");
+            mTipDialog.setCancelable(false);
+        } else if (id == R.id.image_input_delete) {
+            mEditTitleSearch.setText("");
+        } else if (id == R.id.recycler_user_manager) {
+            KeyboardsUtils.hintKeyBoards(v);
+        } else if (id == R.id.relative_botton_delete) {
+            Log.e(TAG, "relative_botton_delete");
+        }
+    }
+
+    /**
+     * 全选多选框的监听事件
+     */
+    @Override
+    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+        if (isChecked) {      // 全选
+            mSelectCount = mUserInfoList.size();
+            for (int i = 0; i < mUserInfoList.size(); i++) {
+                mUserInfoList.get(i).setChecked(true);
+                mTextDelete.setText("删除(" + mSelectCount + ")");
+                mTextDelete.setTextColor(Color.parseColor("#F34B56"));
+            }
+        } else {             // 取消全选
+            mSelectCount = 0;
+            for (int i = 0; i < mUserInfoList.size(); i++) {
+                mUserInfoList.get(i).setChecked(false);
+                mTextDelete.setText("删除(" + mSelectCount + ")");
+                mTextDelete.setTextColor(Color.parseColor("#666666"));
+            }
+        }
+        mFaceUserAdapter.notifyDataSetChanged();
+    }
+
+    // 用于adapter的item点击事件
+    @Override
+    public void onItemClick(View view, int position) {
+        if (mRelativeDelete.getVisibility() != View.VISIBLE) {
+            return;
+        }
+        // 如果当前item未选中,则选中
+        if (!mUserInfoList.get(position).isChecked()) {
+            mUserInfoList.get(position).setChecked(true);
+            mSelectCount++;
+            mTextDelete.setText("删除(" + mSelectCount + ")");
+            mTextDelete.setTextColor(Color.parseColor("#F34B56"));
+        } else {
+            // 如果当前item已经选中,则取消选中
+            mUserInfoList.get(position).setChecked(false);
+            mSelectCount--;
+            mTextDelete.setText("删除(" + mSelectCount + ")");
+            if (mSelectCount == 0) {
+                mTextDelete.setTextColor(Color.parseColor("#666666"));
+            }
+        }
+        mFaceUserAdapter.notifyDataSetChanged();
+    }
+
+    @Override
+    public void onRemove(int position) {
+        mUserInfoList.get(position).setChecked(true);
+        mSelectCount = 1;
+        mIsLongClick = true;
+        mTipDialog.show();
+        mTipDialog.setTextTitle("确认删除");
+        mTipDialog.setTextMessage("删除后人脸数据不可恢复,确认删除?");
+        mTipDialog.setTextConfirm("删除");
+        mTipDialog.setCancelable(false);
+    }
+
+    // 对话框“取消”按钮
+    @Override
+    public void onCancel() {
+        if (mIsLongClick) {
+            resetDeleteData();
+            mIsLongClick = false;
+        }
+        mFaceUserAdapter.notifyDataSetChanged();
+        if (mTipDialog != null) {
+            mTipDialog.dismiss();
+        }
+    }
+
+    // 对话框“删除”按钮
+    @Override
+    public void onConfirm(String tipType) {
+        if (mTipDialog != null) {
+            mTipDialog.dismiss();
+        }
+        if (mSelectCount != 0) {
+            UserInfoManager.getInstance().deleteUserListInfo(mUserInfoList, mUserListListener,
+                    mSelectCount);
+        } else {
+            updateDeleteUI(false);
+        }
+        if (mSelectCount == mUserInfoList.size()) {
+            // 设置数据库状态
+            ShareManager.getInstance(mContext).setDBState(false);
+        }
+    }
+
+    // 更新删除相关的UI
+    private void updateDeleteUI(boolean isShowDeleteUI) {
+        if (isShowDeleteUI) {
+            mRelativeDelete.setVisibility(View.VISIBLE);
+            mImageMenu.setVisibility(View.GONE);
+            mImageIconSearch.setVisibility(View.GONE);
+            mTextCancel.setVisibility(View.VISIBLE);
+            // 列表显示复选框
+            mFaceUserAdapter.setShowCheckBox(true);
+            mFaceUserAdapter.notifyDataSetChanged();
+        } else {
+            mRelativeDelete.setVisibility(View.GONE);
+            mImageMenu.setVisibility(View.VISIBLE);
+            mImageIconSearch.setVisibility(View.VISIBLE);
+            mTextCancel.setVisibility(View.GONE);
+            // 列表隐藏复选框
+            mFaceUserAdapter.setShowCheckBox(false);
+            mFaceUserAdapter.notifyDataSetChanged();
+            if (mUserInfoList != null) {
+                for (int i = 0; i < mUserInfoList.size(); i++) {
+                    mUserInfoList.get(i).setChecked(false);
+                }
+            }
+            mCheckAll.setChecked(false);
+            mSelectCount = 0;
+            mTextDelete.setText("删除");
+        }
+    }
+
+    private void showPopupWindow(ImageView imageView) {
+        if (mPopupMenu != null && imageView != null) {
+//            if (mUserInfoList == null || mUserInfoList.size() == 0) {
+//                mPopRelativeImport.setBackgroundColor(Color.parseColor("#777777"));
+//            } else {
+//                mPopRelativeImport.setBackgroundColor(Color.parseColor("#666666"));
+//                mPopRelativeImport.setBackground(this.getResources()
+//                        .getDrawable(R.drawable.button_selector_homemenu_item2));
+//            }
+            int marginRight = DensityUtils.dip2px(mContext, 20);
+            int marginTop = DensityUtils.dip2px(mContext, 56);
+
+            mPopupMenu.setOnDismissListener(new PopupWindow.OnDismissListener() {
+                @Override
+                public void onDismiss() {
+                    isCheck = false;
+                    mImageMenu.setImageResource(R.mipmap.icon_titlebar_menu);
+                }
+            });
+
+            mPopupMenu.showAtLocation(imageView, Gravity.END | Gravity.TOP,
+                    marginRight, marginTop);
+        }
+    }
+
+    private void dismissPopupWindow() {
+        if (mPopupMenu != null) {
+            mPopupMenu.dismiss();
+        }
+    }
+
+    private void resetDeleteData() {
+        mSelectCount = 0;
+        for (int i = 0; i < mUserInfoList.size(); i++) {
+            mUserInfoList.get(i).setChecked(false);
+        }
+        mTextDelete.setText("删除");
+    }
+
+    // 用于返回读取用户的结果
+    private class UserListListener extends UserInfoManager.UserInfoListener {
+        // 读取用户列表成功
+        @Override
+        public void userListQuerySuccess(final String userName, final List<User> listUserInfo) {
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+
+                    mUserInfoList = listUserInfo;
+                    if (listUserInfo == null || listUserInfo.size() == 0) {
+                        mRelativeEmpty.setVisibility(View.VISIBLE);
+                        mRecyclerUserManager.setVisibility(View.GONE);
+                        // 显示无内容判断
+                        if (userName == null) {
+                            mTextEmpty.setText("暂无内容");
+                            updateDeleteUI(false);
+                        } else {
+                            mTextEmpty.setText("暂无搜索结果");
+                            mRelativeDelete.setVisibility(View.GONE);
+                        }
+                        return;
+                    }
+
+                    // 恢复默认状态
+                    resetDeleteData();
+                    mRelativeEmpty.setVisibility(View.GONE);
+                    mRecyclerUserManager.setVisibility(View.VISIBLE);
+                    if (userName == null || userName.length() == 0) {
+                        updateDeleteUI(false);
+                    } else {
+                        updateDeleteUI(true);
+                    }
+                    mFaceUserAdapter.setDataList(listUserInfo);
+                    mFaceUserAdapter.notifyDataSetChanged();
+                }
+            });
+        }
+
+        // 读取用户列表失败
+        @Override
+        public void userListQueryFailure(final String message) {
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    if (mContext == null) {
+                        return;
+                    }
+                    ToastUtils.toast(mContext, message);
+                }
+            });
+        }
+
+        // 删除用户列表成功
+        @Override
+        public void userListDeleteSuccess() {
+            UserInfoManager.getInstance().getUserListInfo(null, mUserListListener);
+        }
+
+        // 删除用户列表失败
+        @Override
+        public void userListDeleteFailure(final String message) {
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    if (mContext == null) {
+                        return;
+                    }
+                    ToastUtils.toast(mContext, message);
+                }
+            });
+        }
+    }
+
+    /**
+     * 点击非编辑区域收起键盘
+     * 获取点击事件
+     */
+    @CallSuper
+    @Override
+    public boolean dispatchTouchEvent(MotionEvent ev) {
+        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+            View view = getCurrentFocus();
+            if (KeyboardsUtils.isShouldHideKeyBord(view, ev)) {
+                KeyboardsUtils.hintKeyBoards(view);
+            }
+        }
+        return super.dispatchTouchEvent(ev);
+    }
+
+    // ----------------------------------------adapter相关------------------------------------------
+    private static class FaceUserViewHolder extends RecyclerView.ViewHolder {
+        private View itemView;
+        private CircleImageView circleUserHead;
+        private TextView textUserName;
+        private CheckBox checkView;
+        private View viewLine;
+
+        private FaceUserViewHolder(View itemView) {
+            super(itemView);
+            this.itemView = itemView;
+            circleUserHead = itemView.findViewById(R.id.circle_user);
+            textUserName = itemView.findViewById(R.id.text_user_name);
+            checkView = itemView.findViewById(R.id.check_btn);
+            viewLine = itemView.findViewById(R.id.view_line);
+        }
+    }
+
+    public class FaceUserAdapter extends RecyclerView.Adapter<FaceUserViewHolder> implements
+            View.OnClickListener, View.OnLongClickListener {
+        private List<User> mList;
+        private boolean mShowCheckBox;
+        private OnItemClickListener mItemClickListener;
+        private OnRemoveListener mOnRemoveListener;
+
+        private void setDataList(List<User> list) {
+            mList = list;
+        }
+
+        private void setShowCheckBox(boolean showCheckBox) {
+            mShowCheckBox = showCheckBox;
+        }
+
+        private void setItemClickListener(OnItemClickListener itemClickListener) {
+            mItemClickListener = itemClickListener;
+        }
+
+        public void setOnRemoveListener(OnRemoveListener onRemoveListener) {
+            this.mOnRemoveListener = onRemoveListener;
+        }
+
+        @Override
+        public FaceUserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
+            View view = layoutInflater.inflate(R.layout.item_register_user_list, parent, false);
+            FaceUserViewHolder viewHolder = new FaceUserViewHolder(view);
+            view.setOnClickListener(this);
+            view.setOnLongClickListener(this);
+            return viewHolder;
+        }
+
+        @Override
+        public void onBindViewHolder(FaceUserViewHolder holder, int position) {
+            holder.itemView.setTag(position);
+            if (position == 0) {
+                holder.viewLine.setVisibility(View.GONE);
+            } else {
+                holder.viewLine.setVisibility(View.VISIBLE);
+            }
+            // 是否显示多选按钮
+            if (mShowCheckBox) {
+                holder.checkView.setVisibility(View.VISIBLE);
+                if (mList.get(position).isChecked()) {
+                    holder.checkView.setChecked(true);
+                } else {
+                    holder.checkView.setChecked(false);
+                }
+            } else {
+                holder.checkView.setVisibility(View.GONE);
+            }
+            // 添加数据
+            holder.textUserName.setText(mList.get(position).getUserName());
+            Bitmap bitmap = BitmapFactory.decodeFile(FileUtils.getBatchImportSuccessDirectory()
+                    + "/" + mList.get(position).getImageName());
+            Bitmap descBmp = BitmapUtils.calculateInSampleSize(bitmap, 100, 100);
+            if (descBmp != null) {
+                holder.circleUserHead.setImageBitmap(descBmp);
+            }
+        }
+
+        @Override
+        public int getItemCount() {
+            return mList != null ? mList.size() : 0;
+        }
+
+        @Override
+        public void onClick(View v) {
+            if (mItemClickListener != null) {
+                mItemClickListener.onItemClick(v, (Integer) v.getTag());
+            }
+        }
+
+        @Override
+        public boolean onLongClick(View view) {
+            if (mOnRemoveListener != null) {
+                mOnRemoveListener.onRemove((Integer) view.getTag());
+            }
+            return true;
+        }
+    }
+
+    private void judgeLiveType(int type, Class<?> rgbCls, Class<?> nirCls, Class<?> depthCls, Class<?> rndCls) {
+        switch (type) {
+            case 1: { // RGB活体
+                startActivity(new Intent(UserManagerActivity.this, rgbCls));
+                break;
+            }
+
+            case 2: { // NIR活体
+                startActivity(new Intent(UserManagerActivity.this, nirCls));
+                break;
+            }
+
+            case 3: { // 深度活体
+                int cameraType = SingleBaseConfig.getBaseConfig().getCameraType();
+                judgeCameraType(cameraType, depthCls);
+                break;
+            }
+
+            case 4: { // rgb+nir+depth活体
+                int cameraType = SingleBaseConfig.getBaseConfig().getCameraType();
+                judgeCameraType(cameraType, rndCls);
+            }
+        }
+    }
+
+    private void judgeCameraType(int cameraType, Class<?> depthCls) {
+        switch (cameraType) {
+            case 1: { // pro
+                startActivity(new Intent(mContext, depthCls));
+                break;
+            }
+
+            case 2: { // atlas
+                startActivity(new Intent(mContext, depthCls));
+                break;
+            }
+
+            default:
+                startActivity(new Intent(mContext, depthCls));
+                break;
+        }
+    }
+}

+ 371 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/api/FaceApi.java

@@ -0,0 +1,371 @@
+/*
+ * Copyright (C) 2018 Baidu, Inc. All Rights Reserved.
+ */
+package com.jsw.jswlibrary.faceregist.api;
+
+import android.graphics.Bitmap;
+import android.text.TextUtils;
+
+import com.baidu.idl.main.facesdk.FaceInfo;
+import com.baidu.idl.main.facesdk.model.BDFaceImageInstance;
+import com.baidu.idl.main.facesdk.model.BDFaceSDKCommon;
+import com.baidu.idl.main.facesdk.model.Feature;
+import com.jsw.jswlibrary.faceregist.FaceSDKManager;
+import com.jsw.jswlibrary.faceregist.db.DBManager;
+import com.jsw.jswlibrary.model.ImportFeatureResult;
+import com.jsw.jswlibrary.model.User;
+
+import com.jsw.jswlibrary.model.Group;
+import com.jsw.jswlibrary.utils.BitmapUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class FaceApi {
+    private static FaceApi instance;
+    private ExecutorService es = Executors.newSingleThreadExecutor();
+    private Future future;
+
+    private int mUserNum;
+    private boolean isinitSuccess = false;
+
+
+    private FaceApi() {
+
+    }
+
+    public static synchronized FaceApi getInstance() {
+        if (instance == null) {
+            instance = new FaceApi();
+        }
+        return instance;
+    }
+
+    /**
+     * 添加用户组
+     */
+    public boolean groupAdd(Group group) {
+        if (group == null || TextUtils.isEmpty(group.getGroupId())) {
+            return false;
+        }
+        Pattern pattern = Pattern.compile("^[0-9a-zA-Z_-]{1,}$");
+        Matcher matcher = pattern.matcher(group.getGroupId());
+        if (!matcher.matches()) {
+            return false;
+        }
+        boolean ret = DBManager.getInstance().addGroup(group);
+
+        return ret;
+    }
+
+    /**
+     * 查询用户组(默认最多取1000个组)
+     */
+    public List<Group> getGroupList(int start, int length) {
+        if (start < 0 || length < 0) {
+            return null;
+        }
+        if (length > 1000) {
+            length = 1000;
+        }
+        List<Group> groupList = DBManager.getInstance().queryGroups(start, length);
+        return groupList;
+    }
+
+    /**
+     * 根据groupId查询用户组
+     */
+    public List<Group> getGroupListByGroupId(String groupId) {
+        if (TextUtils.isEmpty(groupId)) {
+            return null;
+        }
+        return DBManager.getInstance().queryGroupsByGroupId(groupId);
+    }
+
+    /**
+     * 根据groupId删除用户组
+     */
+    public boolean groupDelete(String groupId) {
+        if (TextUtils.isEmpty(groupId)) {
+            return false;
+        }
+        boolean ret = DBManager.getInstance().deleteGroup(groupId);
+        return ret;
+    }
+
+    /**
+     * 添加用户
+     */
+    public boolean userAdd(User user) {
+        if (user == null || TextUtils.isEmpty(user.getGroupId())) {
+            return false;
+        }
+        Pattern pattern = Pattern.compile("^[0-9a-zA-Z_-]{1,}$");
+        Matcher matcher = pattern.matcher(user.getUserId());
+        if (!matcher.matches()) {
+            return false;
+        }
+        boolean ret = DBManager.getInstance().addUser(user);
+        return ret;
+    }
+
+    /**
+     * 查找所有用户
+     */
+    public List<User> getAllUserList() {
+        return DBManager.getInstance().queryAllUsers();
+    }
+
+    /**
+     * 根据userName查找用户(精确查找)
+     */
+    public List<User> getUserListByUserName(String userName) {
+        if (TextUtils.isEmpty(userName)) {
+            return null;
+        }
+        return DBManager.getInstance().queryUserByUserNameAccu(userName);
+    }
+
+    /**
+     * 根据userName查找用户(模糊查找)
+     */
+    public List<User> getUserListByUserNameVag(String userName) {
+        if (TextUtils.isEmpty(userName)) {
+            return null;
+        }
+        return DBManager.getInstance().queryUserByUserNameVag(userName);
+    }
+
+    /**
+     * 根据_id查找用户
+     */
+    public User getUserListById(int _id) {
+        if (_id < 0) {
+            return null;
+        }
+        List<User> userList = DBManager.getInstance().queryUserById(_id);
+        if (userList != null && userList.size() > 0) {
+            return userList.get(0);
+        }
+        return null;
+    }
+
+    /**
+     * 更新用户
+     */
+    public boolean userUpdate(User user) {
+        if (user == null) {
+            return false;
+        }
+
+        boolean ret = DBManager.getInstance().updateUser(user);
+        return ret;
+    }
+
+    /**
+     * 更新用户
+     */
+    public boolean userUpdate(String userName, String imageName, byte[] feature) {
+        if (userName == null || imageName == null || feature == null) {
+            return false;
+        }
+
+        boolean ret = DBManager.getInstance().updateUser(userName, imageName, feature);
+        return ret;
+    }
+
+    /**
+     * 删除用户
+     */
+    public boolean userDelete(String userId) {
+        if (TextUtils.isEmpty(userId)) {
+            return false;
+        }
+
+        boolean ret = DBManager.getInstance().deleteUser(userId);
+        return ret;
+    }
+
+    /**
+     * 远程删除用户
+     */
+    public boolean userDeleteByName(String userName) {
+        if (TextUtils.isEmpty(userName)) {
+            return false;
+        }
+
+        boolean ret = DBManager.getInstance().userDeleteByName(userName);
+        return ret;
+    }
+
+    /**
+     * 是否是有效姓名
+     *
+     * @param username 用户名
+     * @return 有效或无效信息
+     */
+    public String isValidName(String username) {
+        if (username == null || "".equals(username.trim())) {
+            return "姓名为空";
+        }
+
+        // 姓名过长
+        if (username.length() > 10) {
+            return "姓名过长";
+        }
+
+        String regex0 = "[ `~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()—"
+                + "—+|{}【】‘;:”“’。,、?]|\n|\r|\t";
+        Pattern p0 = Pattern.compile(regex0);
+        Matcher m0 = p0.matcher(username);
+        if (m0.find()) {
+            return "姓名中含有特殊符号";
+        }
+
+        // 含有特殊符号
+        String regex = "^[0-9a-zA-Z_\\u3E00-\\u9FA5]+$";
+        Pattern p = Pattern.compile(regex);
+        Matcher m = p.matcher(username);
+        if (!m.find()) {
+            return "姓名中含有特殊符号";
+        }
+        return "0";
+    }
+
+    /**
+     * 提取特征值
+     */
+    public ImportFeatureResult getFeature(Bitmap bitmap, byte[] feature, BDFaceSDKCommon.FeatureType featureType) {
+        if (bitmap == null) {
+            return new ImportFeatureResult(-1, null);
+        }
+
+        System.out.println("要报错啦:"+FaceSDKManager.getInstance().getFaceDetect());
+        BDFaceImageInstance imageInstance = new BDFaceImageInstance(bitmap);
+        // 最大检测人脸,获取人脸信息
+        FaceInfo[] faceInfos = FaceSDKManager.getInstance().getFaceDetect()
+                .detect(BDFaceSDKCommon.DetectType.DETECT_VIS, imageInstance);
+        if (faceInfos == null || faceInfos.length == 0) {
+            imageInstance.destory();
+            return new ImportFeatureResult(-2, null);
+        }
+        FaceInfo faceInfo = faceInfos[0];
+        // 人脸识别,提取人脸特征值
+        float ret = FaceSDKManager.getInstance().getFaceFeature().feature(
+                featureType, imageInstance,
+                faceInfo.landmarks, feature);
+        // 人脸抠图
+        BDFaceImageInstance cropInstance = FaceSDKManager.getInstance().getFaceCrop()
+                .cropFaceByLandmark(imageInstance, faceInfo.landmarks,
+                        2.0f, true, new AtomicInteger());
+        if (cropInstance == null) {
+            imageInstance.destory();
+            return new ImportFeatureResult(-3, null);
+        }
+
+        Bitmap cropBmp = BitmapUtils.getInstaceBmp(cropInstance);
+        cropInstance.destory();
+        imageInstance.destory();
+        return new ImportFeatureResult(ret, cropBmp);
+    }
+
+
+    public boolean registerUserIntoDBmanager(String groupName, String userName, String picName,
+                                             String userInfo, byte[] faceFeature) {
+        boolean isSuccess = false;
+
+        User user = new User();
+        user.setGroupId(DBManager.GROUP_ID);
+        // 用户id(由数字、字母、下划线组成),长度限制128B
+        // uid为用户的id,百度对uid不做限制和处理,应该与您的帐号系统中的用户id对应。
+        final String uid = UUID.randomUUID().toString();
+        user.setUserId(uid);
+        user.setUserName(userName);
+        user.setFeature(faceFeature);
+        user.setImageName(picName);
+        if (userInfo != null) {
+            user.setUserInfo(userInfo);
+        }
+        // 添加用户信息到数据库
+        return FaceApi.getInstance().userAdd(user);
+    }
+
+    /**
+     * 获取底库数量
+     *
+     * @return
+     */
+    public int getmUserNum() {
+        return mUserNum;
+    }
+
+    public boolean isinitSuccess() {
+        return isinitSuccess;
+    }
+
+    /**
+     * 数据库发现变化时候,重新把数据库中的人脸信息添加到内存中,id+feature
+     */
+    public void initDatabases(final boolean isFeaturePush) {
+
+        if (future != null && !future.isDone()) {
+            future.cancel(true);
+        }
+
+        isinitSuccess = false;
+        future = es.submit(new Runnable() {
+            @Override
+            public void run() {
+                ArrayList<Feature> features = new ArrayList<>();
+                List<User> listUser = FaceApi.getInstance().getAllUserList();
+                for (int j = 0; j < listUser.size(); j++) {
+                    Feature feature = new Feature();
+                    feature.setId(listUser.get(j).getId());
+                    feature.setFeature(listUser.get(j).getFeature());
+                    features.add(feature);
+                }
+                if (isFeaturePush) {
+                    FaceSDKManager.getInstance().getFaceFeature().featurePush(features);
+                }
+                mUserNum = features.size();
+                isinitSuccess = true;
+            }
+        });
+    }
+
+    // 删除识别记录
+    public boolean deleteRecords(String userName) {
+        boolean ret = false;
+        if (TextUtils.isEmpty(userName)) {
+            return ret;
+        }
+        ret = DBManager.getInstance().deleteRecords(userName);
+        return ret;
+    }
+
+    // 删除识别记录
+    public boolean deleteRecords(String startTime, String endTime) {
+        boolean ret = false;
+        if (TextUtils.isEmpty(startTime) && TextUtils.isEmpty(endTime)) {
+            return ret;
+        }
+//        ret = DBManager.getInstance().deleteRecords(startTime, endTime);
+        return ret;
+    }
+
+    // 清除识别记录
+    public int cleanRecords() {
+        boolean ret = false;
+        int num = DBManager.getInstance().cleanRecords();
+        return num;
+    }
+
+
+}

+ 18 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/callback/CameraDataCallback.java

@@ -0,0 +1,18 @@
+package com.jsw.jswlibrary.faceregist.callback;
+
+import android.hardware.Camera;
+
+/**
+ * Time: 2019/1/25
+ * Author: v_chaixiaogang
+ * Description: camera1数据结果回调
+ */
+public interface CameraDataCallback {
+    /**
+     * @param data   预览数据
+     * @param camera 相机设备
+     * @param width  预览宽
+     * @param height 预览高
+     */
+    void onGetCameraData(byte[] data, Camera camera, int width, int height);
+}

+ 21 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/callback/FaceDetectCallBack.java

@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2018 Baidu, Inc. All Rights Reserved.
+ */
+package com.jsw.jswlibrary.faceregist.callback;
+
+
+import com.jsw.jswlibrary.model.LivenessModel;
+
+/**
+ * 人脸检测回调接口。
+ *
+ * @Time: 2019/1/25
+ * @Author: v_chaixiaogang
+ */
+public interface FaceDetectCallBack {
+    public void onFaceDetectCallback(LivenessModel livenessModel);
+
+    public void onTip(int code, String msg);
+
+    void onFaceDetectDarwCallback(LivenessModel livenessModel);
+}

+ 17 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/callback/FaceFeatureCallBack.java

@@ -0,0 +1,17 @@
+/*
+ * Copyright (C) 2019 Baidu, Inc. All Rights Reserved.
+ */
+package com.jsw.jswlibrary.faceregist.callback;
+
+
+/**
+ * 人脸特征抽取回调接口。
+ *
+ * @Time: 2019/5/30
+ * @Author: v_zhangxiaoqing01
+ */
+public interface FaceFeatureCallBack {
+
+    public void onFaceFeatureCallBack(float featureSize, byte[] feature, long time);
+
+}

+ 167 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/camera/AutoTexturePreviewView.java

@@ -0,0 +1,167 @@
+/*
+ * Copyright (C) 2017 Baidu, Inc. All Rights Reserved.
+ */
+package com.jsw.jswlibrary.faceregist.camera;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Path;
+import android.graphics.Region;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
+import android.util.AttributeSet;
+import android.view.TextureView;
+import android.widget.FrameLayout;
+
+/**
+ * 基于 系统TextureView实现的预览View。
+ *
+ * @Time: 2019/1/28
+ * @Author: v_chaixiaogang
+ */
+public class AutoTexturePreviewView extends FrameLayout {
+
+    public TextureView textureView;
+
+    private int videoWidth = 0;
+    private int videoHeight = 0;
+
+
+    public static int previewWidth = 0;
+    private int previewHeight = 0;
+    private static int scale = 2;
+
+    public static float circleRadius;
+    public static float circleX;
+    public static float circleY;
+    public boolean isDraw = false;
+    private boolean mIsRegister;   // 注册
+
+    private float[] pointXY = new float[3];
+
+    public AutoTexturePreviewView(Context context) {
+        super(context);
+        init();
+    }
+
+    public AutoTexturePreviewView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public AutoTexturePreviewView(Context context, AttributeSet attrs,
+                                  int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init();
+    }
+
+
+    private Handler handler = new Handler(Looper.getMainLooper());
+
+    private void init() {
+        setWillNotDraw(false);
+        textureView = new TextureView(getContext());
+        addView(textureView);
+    }
+
+    public void setIsRegister(boolean isRegister) {
+        mIsRegister = isRegister;
+        invalidate();
+    }
+
+    public boolean getIsRegister() {
+        return mIsRegister;
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        super.onLayout(changed, left, top, right, bottom);
+
+        previewWidth = getWidth();
+        previewHeight = getHeight();
+
+        if (videoWidth == 0 || videoHeight == 0 || previewWidth == 0 || previewHeight == 0) {
+            return;
+        }
+
+        if (previewWidth * videoHeight > previewHeight * videoWidth) {
+            int scaledChildHeight = videoHeight * previewWidth / videoWidth;
+            textureView.layout(0, (previewHeight - scaledChildHeight) / scale,
+                    previewWidth, (previewHeight + scaledChildHeight) / scale);
+        } else {
+            int scaledChildWidth = videoWidth * previewHeight / videoHeight;
+            textureView.layout((previewWidth - scaledChildWidth) / scale, 0,
+                    (previewWidth + scaledChildWidth) / scale, previewHeight);
+
+        }
+
+
+    }
+
+    public TextureView getTextureView() {
+        return textureView;
+    }
+
+    public int getPreviewWidth() {
+        return previewWidth;
+    }
+
+    public int getPreviewHeight() {
+        return previewHeight;
+    }
+
+    public void setPreviewSize(int width, int height) {
+        if (this.videoWidth == width && this.videoHeight == height) {
+            return;
+        }
+        this.videoWidth = width;
+        this.videoHeight = height;
+        handler.post(new Runnable() {
+            @Override
+            public void run() {
+                requestLayout();
+            }
+        });
+
+    }
+
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        if (isDraw) {
+            Path path = new Path();
+            // 设置裁剪的圆心坐标,半径
+            path.addCircle(getWidth() / 2, getHeight() / 2, getWidth() / 3, Path.Direction.CCW);
+            // 裁剪画布,并设置其填充方式
+            canvas.clipPath(path, Region.Op.REPLACE);
+
+            // 圆的半径
+            circleRadius = getWidth() / 3;
+            // 圆心的X坐标
+            circleX = (getRight() - getLeft()) / 2;
+            // 圆心的Y坐标
+            circleY = (getBottom() - getTop()) / 2;
+        }
+
+        if (mIsRegister) {
+            Path path = new Path();
+            // 设置裁剪的圆心坐标,半径
+            path.addCircle(getWidth() / 2, getHeight() / 2, getWidth() / 3, Path.Direction.CCW);
+            // 裁剪画布,并设置其填充方式
+//            canvas.clipPath(path, Region.Op.REPLACE);
+            if (Build.VERSION.SDK_INT >= 28) {
+                canvas.clipPath(path);
+            } else {
+                canvas.clipPath(path, Region.Op.REPLACE);
+            }
+            // 圆的半径
+            circleRadius = getWidth() / 3;
+            // 圆心的X坐标
+            circleX = (getRight() - getLeft()) / 2;
+            // 圆心的Y坐标
+            circleY = (getBottom() - getTop()) / 2;
+        }
+        super.onDraw(canvas);
+    }
+}

+ 344 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/camera/CameraPreviewManager.java

@@ -0,0 +1,344 @@
+package com.jsw.jswlibrary.faceregist.camera;
+
+import android.content.Context;
+import android.graphics.SurfaceTexture;
+import android.hardware.Camera;
+import android.util.Log;
+import android.util.SparseIntArray;
+import android.view.Surface;
+import android.view.TextureView;
+
+
+import com.jsw.jswlibrary.faceregist.callback.CameraDataCallback;
+import com.jsw.jswlibrary.model.SingleBaseConfig;
+
+import java.util.List;
+
+/**
+ * Time: 2019/1/24
+ * Author: v_chaixiaogang
+ * Description:
+ */
+public class CameraPreviewManager implements TextureView.SurfaceTextureListener {
+
+    private static final String TAG = "camera_preview";
+
+
+    AutoTexturePreviewView mTextureView;
+    boolean mPreviewed = false;
+    private boolean mSurfaceCreated = false;
+    private SurfaceTexture mSurfaceTexture;
+
+    public static final int CAMERA_FACING_BACK = 0;
+
+    public static final int CAMERA_FACING_FRONT = 1;
+
+    public static final int CAMERA_USB = 2;
+
+    public static final int CAMERA_ORBBEC = 3;
+
+    /**
+     * 垂直方向
+     */
+    public static final int ORIENTATION_PORTRAIT = 0;
+    /**
+     * 水平方向
+     */
+    public static final int ORIENTATION_HORIZONTAL = 1;
+
+    /**
+     * 当前相机的ID。
+     */
+    private int cameraFacing = CAMERA_FACING_FRONT;
+
+    private int previewWidth;
+    private int previewHeight;
+
+    private int videoWidth;
+    private int videoHeight;
+
+    private int tempWidth;
+    private int tempHeight;
+
+    private int textureWidth;
+    private int textureHeight;
+
+    private Camera mCamera;
+    private int mCameraNum;
+
+    private int displayOrientation = 0;
+    private int cameraId = 0;
+    private int mirror = 1; // 镜像处理
+    private CameraDataCallback mCameraDataCallback;
+    private static volatile CameraPreviewManager instance = null;
+
+    private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
+
+    static {
+
+        ORIENTATIONS.append(Surface.ROTATION_0, 0);
+        ORIENTATIONS.append(Surface.ROTATION_90, 90);
+        ORIENTATIONS.append(Surface.ROTATION_180, 180);
+        ORIENTATIONS.append(Surface.ROTATION_270, 270);
+    }
+
+    public static CameraPreviewManager getInstance() {
+        synchronized (CameraPreviewManager.class) {
+            if (instance == null) {
+                instance = new CameraPreviewManager();
+            }
+        }
+        return instance;
+    }
+
+    public int getCameraFacing() {
+        return cameraFacing;
+    }
+
+    public void setCameraFacing(int cameraFacing) {
+        this.cameraFacing = cameraFacing;
+    }
+
+    public int getDisplayOrientation() {
+        return displayOrientation;
+    }
+
+    public void setDisplayOrientation(int displayOrientation) {
+        this.displayOrientation = displayOrientation;
+    }
+
+    /**
+     * 开启预览
+     *
+     * @param context
+     * @param textureView
+     */
+    public void startPreview(Context context, AutoTexturePreviewView textureView, int width,
+                             int height, CameraDataCallback cameraDataCallback) {
+        Log.e(TAG, "开启预览模式");
+        Context mContext = context;
+        this.mCameraDataCallback = cameraDataCallback;
+        mTextureView = textureView;
+        this.previewWidth = width;
+        this.previewHeight = height;
+        mSurfaceTexture = mTextureView.getTextureView().getSurfaceTexture();
+        mTextureView.getTextureView().setSurfaceTextureListener(this);
+    }
+
+    @Override
+    public void onSurfaceTextureAvailable(SurfaceTexture texture, int i, int i1) {
+        Log.e(TAG, "--surfaceTexture--SurfaceTextureAvailable");
+        mSurfaceTexture = texture;
+        mSurfaceCreated = true;
+        textureWidth = i;
+        textureHeight = i1;
+        openCamera();
+
+    }
+
+    @Override
+    public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int i, int i1) {
+        Log.e(TAG, "--surfaceTexture--TextureSizeChanged");
+    }
+
+    @Override
+    public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) {
+        Log.e(TAG, "--surfaceTexture--destroyed");
+        mSurfaceCreated = false;
+        if (mCamera != null) {
+            mCamera.setPreviewCallback(null);
+            mCamera.stopPreview();
+            mCamera.release();
+            mCamera = null;
+        }
+        return true;
+    }
+
+    @Override
+    public void onSurfaceTextureUpdated(SurfaceTexture texture) {
+        // Log.e(TAG, "--surfaceTexture--Updated");
+    }
+
+
+    /**
+     * 关闭预览
+     */
+    public void stopPreview() {
+        if (mCamera != null) {
+            try {
+                mCamera.setPreviewTexture(null);
+                mSurfaceCreated = false;
+                mTextureView = null;
+                mCamera.setPreviewCallback(null);
+                mCamera.stopPreview();
+                mCamera.release();
+                mCamera = null;
+            } catch (Exception e) {
+                Log.e("qing", "camera destory error");
+                e.printStackTrace();
+
+            }
+        }
+    }
+
+
+    /**
+     * 开启摄像头
+     */
+
+    private void openCamera() {
+
+        try {
+            if (mCamera == null) {
+                Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
+                for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
+                    Camera.getCameraInfo(i, cameraInfo);
+                    if (cameraInfo.facing == cameraFacing) {
+                        cameraId = i;
+                    }
+                }
+                mCamera = Camera.open(cameraId);
+                Log.e(TAG, "initCamera---open camera");
+            }
+
+            // 摄像头图像预览角度
+            int cameraRotation = SingleBaseConfig.getBaseConfig().getVideoDirection();
+            switch (cameraFacing) {
+                case CAMERA_FACING_FRONT: {
+//                    cameraRotation = ORIENTATIONS.get(displayOrientation);
+//                    cameraRotation = getCameraDisplayOrientation(cameraRotation, cameraId);
+                    mCamera.setDisplayOrientation(cameraRotation);
+                    break;
+                }
+
+                case CAMERA_FACING_BACK: {
+//                    cameraRotation = ORIENTATIONS.get(displayOrientation);
+//                    cameraRotation = getCameraDisplayOrientation(cameraRotation, cameraId);
+                    mCamera.setDisplayOrientation(cameraRotation);
+                    break;
+                }
+
+                case CAMERA_USB: {
+                    mCamera.setDisplayOrientation(cameraRotation);
+                    break;
+                }
+
+                default:
+                    break;
+
+            }
+
+
+            if (cameraRotation == 90 || cameraRotation == 270) {
+                int isRgbRevert = SingleBaseConfig.getBaseConfig().getMirrorRGB();
+                if (isRgbRevert == 1) {
+                    mTextureView.setRotationY(180);
+                } else {
+                    mTextureView.setRotationY(0);
+                }
+                // 旋转90度或者270,需要调整宽高
+                mTextureView.setPreviewSize(previewHeight, previewWidth);
+            } else {
+                int isRgbRevert = SingleBaseConfig.getBaseConfig().getMirrorRGB();
+                if (isRgbRevert == 1) {
+                    mTextureView.setRotationY(180);
+                } else {
+                    mTextureView.setRotationY(0);
+                }
+                mTextureView.setPreviewSize(previewWidth, previewHeight);
+            }
+            Camera.Parameters params = mCamera.getParameters();
+            List<Camera.Size> sizeList = params.getSupportedPreviewSizes(); // 获取所有支持的camera尺寸
+            final Camera.Size optionSize = getOptimalPreviewSize(sizeList, previewWidth,
+                    previewHeight); // 获取一个最为适配的camera.size
+            if (optionSize.width == previewWidth && optionSize.height == previewHeight) {
+                videoWidth = previewWidth;
+                videoHeight = previewHeight;
+            } else {
+                videoWidth = optionSize.width;
+                videoHeight = optionSize.height;
+            }
+            params.setPreviewSize(videoWidth, videoHeight);
+
+            mCamera.setParameters(params);
+            try {
+                mCamera.setPreviewTexture(mSurfaceTexture);
+                mCamera.setPreviewCallback(new Camera.PreviewCallback() {
+                    @Override
+                    public void onPreviewFrame(byte[] bytes, Camera camera) {
+                        if (mCameraDataCallback != null) {
+                            mCameraDataCallback.onGetCameraData(bytes, camera,
+                                    videoWidth, videoHeight);
+                        }
+                    }
+                });
+                mCamera.startPreview();
+
+            } catch (Exception e) {
+                e.printStackTrace();
+                Log.e(TAG, e.getMessage());
+            }
+        } catch (RuntimeException e) {
+            Log.e(TAG, e.getMessage());
+        }
+    }
+
+
+    private int getCameraDisplayOrientation(int degrees, int cameraId) {
+        Camera.CameraInfo info = new Camera.CameraInfo();
+        Camera.getCameraInfo(cameraId, info);
+        int rotation = 0;
+        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
+            rotation = (info.orientation + degrees) % 360;
+            rotation = (360 - rotation) % 360; // compensate the mirror
+        } else { // back-facing
+            rotation = (info.orientation - degrees + 360) % 360;
+        }
+        return rotation;
+    }
+
+
+    /**
+     * 解决预览变形问题
+     *
+     * @param sizes
+     * @param w
+     * @param h
+     * @return
+     */
+    private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
+        final double aspectTolerance = 0.1;
+        double targetRatio = (double) w / h;
+        if (sizes == null) {
+            return null;
+        }
+        Camera.Size optimalSize = null;
+        double minDiff = Double.MAX_VALUE;
+
+        int targetHeight = h;
+
+        // Try to find an size match aspect ratio and size
+        for (Camera.Size size : sizes) {
+            double ratio = (double) size.width / size.height;
+            if (Math.abs(ratio - targetRatio) > aspectTolerance) {
+                continue;
+            }
+            if (Math.abs(size.height - targetHeight) < minDiff) {
+                optimalSize = size;
+                minDiff = Math.abs(size.height - targetHeight);
+            }
+        }
+
+        // Cannot find the one match the aspect ratio, ignore the requirement
+        if (optimalSize == null) {
+            minDiff = Double.MAX_VALUE;
+            for (Camera.Size size : sizes) {
+                if (Math.abs(size.height - targetHeight) < minDiff) {
+                    optimalSize = size;
+                    minDiff = Math.abs(size.height - targetHeight);
+                }
+            }
+        }
+        return optimalSize;
+    }
+}

+ 126 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/db/DBHelper.java

@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2018 Baidu, Inc. All Rights Reserved.
+ */
+package com.jsw.jswlibrary.faceregist.db;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+/**
+ * 数据库创建工具
+ */
+public class DBHelper extends SQLiteOpenHelper {
+    private static final String CREATE_TABLE_START_SQL = "CREATE TABLE IF NOT EXISTS ";
+    private static final String CREATE_TABLE_PRIMIRY_SQL = " integer primary key autoincrement,";
+
+    /**
+     * 数据库名称
+     */
+    private static final String DB_NAME = "face.db";
+    /**
+     * 数据库版本
+     */
+    private static final int VERSION = 1;
+    /**
+     * 人脸特征表
+     */
+    // public static final String TABLE_FEATURE = "feature";
+    /**
+     * 用户组表
+     */
+    public static final String TABLE_USER_GROUP = "user_group";
+    /**
+     * 用户表
+     */
+    public static final String TABLE_USER = "user";
+
+    /**
+     * 识别记录表
+     */
+    public static final String TABLE_RECORDS = "records";
+
+    public DBHelper(Context context) {
+        super(context, DB_NAME, null, VERSION);
+    }
+
+    @Override
+    public void onCreate(SQLiteDatabase db) {
+        createTables(db);
+    }
+
+    @Override
+    public synchronized void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+        if (newVersion > oldVersion) {
+            // db.execSQL("DROP TABLE IF EXISTS " + TABLE_FEATURE);
+            db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER_GROUP);
+            db.execSQL("DROP TABLE IF EXISTS " + TABLE_USER);
+            db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECORDS);
+            onCreate(db);
+        }
+    }
+
+    public synchronized void createTables(SQLiteDatabase db) {
+        if (db == null || db.isReadOnly()) {
+            db = getWritableDatabase();
+        }
+
+        // 创建人脸特征表的SQL语句
+//        StringBuffer featureSql = new StringBuffer();
+//        featureSql.append(CREATE_TABLE_START_SQL).append(TABLE_FEATURE).append(" ( ");
+//        featureSql.append(" _id").append(CREATE_TABLE_PRIMIRY_SQL);
+//        featureSql.append(" face_token").append(" varchar(128) default \"\" ,");
+//        featureSql.append(" group_id").append(" varchar(32) default \"\" ,");
+//        featureSql.append(" user_id").append(" varchar(32) default \"\" ,");
+//        featureSql.append(" feature").append(" blob   ,");
+//        featureSql.append(" image_name").append(" varchar(64) default \"\"  ,");
+//        featureSql.append(" ctime").append(" long ,");
+//        featureSql.append(" update_time").append(" long )");
+
+        // 创建用户组表的SQL语句
+        StringBuffer groupSql = new StringBuffer();
+        groupSql.append(CREATE_TABLE_START_SQL).append(TABLE_USER_GROUP).append(" ( ");
+        groupSql.append(" _id").append(CREATE_TABLE_PRIMIRY_SQL);
+        groupSql.append(" group_id").append(" varchar(32) default \"\" ,");
+        groupSql.append(" desc").append(" varchar(32) default \"\"  ,");
+        groupSql.append(" ctime").append(" long ,");
+        groupSql.append(" update_time").append(" long )");
+
+        // 创建用户表的SQL语句
+        StringBuffer userSql = new StringBuffer();
+        userSql.append(CREATE_TABLE_START_SQL).append(TABLE_USER).append(" ( ");
+        userSql.append(" _id").append(CREATE_TABLE_PRIMIRY_SQL);
+        userSql.append(" user_id").append(" varchar(32) default \"\"   ,");
+        userSql.append(" user_name").append(" varchar(32) default \"\"   ,");
+        userSql.append(" user_info").append(" varchar(32) default \"\"   ,");
+        userSql.append(" group_id").append(" varchar(32) default \"\"   ,");
+        userSql.append(" face_token").append(" varchar(128) default \"\" ,");
+        userSql.append(" feature").append(" blob   ,");
+        userSql.append(" image_name").append(" varchar(64) default \"\"  ,");
+        userSql.append(" ctime").append(" long ,");
+        userSql.append(" update_time").append(" long )");
+
+        // 创建识别记录的SQL语句
+        StringBuffer recordSql = new StringBuffer();
+        recordSql.append(CREATE_TABLE_START_SQL).append(TABLE_RECORDS).append(" ( ");
+        recordSql.append(" _id").append(CREATE_TABLE_PRIMIRY_SQL);
+        recordSql.append(" deviceid").append(" varchar(32) default \"\"   ,");
+        recordSql.append(" user_id").append(" varchar(32) default \"\"   ,");
+        recordSql.append(" user_name").append(" varchar(32) default \"\"   ,");
+        recordSql.append(" group_id").append(" varchar(32) default \"\"   ,");
+        recordSql.append(" face_token").append(" varchar(128) default \"\" ,");
+        recordSql.append(" time").append(" datetime  ,");
+        recordSql.append(" records").append(" varchar(32) default \"\"   ,");
+        recordSql.append(" longId").append(" varchar(32) default \"\"   ,");
+        recordSql.append(" score").append(" varchar(32) default \"\"   )");
+
+        try {
+            db.execSQL(groupSql.toString());
+            db.execSQL(userSql.toString());
+            db.execSQL(recordSql.toString());
+            // db.execSQL(featureSql.toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 865 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/db/DBManager.java

@@ -0,0 +1,865 @@
+package com.jsw.jswlibrary.faceregist.db;
+
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.text.TextUtils;
+import android.util.Log;
+
+
+import com.jsw.jswlibrary.model.Group;
+import com.jsw.jswlibrary.model.User;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * 数据库管理类
+ */
+public class DBManager {
+    /**
+     * The constant TAG
+     */
+    private static final String TAG = "DBManager";
+
+    private AtomicInteger mOpenCounter = new AtomicInteger();
+    private static DBManager instance;
+    private static SQLiteOpenHelper mDBHelper;
+    private SQLiteDatabase mDatabase;
+    private boolean allowTransaction = true;
+    private Lock writeLock = new ReentrantLock();
+    private volatile boolean writeLocked = false;
+    // 默认组别是0
+    public static final String GROUP_ID = "0";
+
+    /**
+     * 单例模式,初始化DBManager
+     *
+     * @return DBManager实例
+     */
+    public static synchronized DBManager getInstance() {
+        if (instance == null) {
+            instance = new DBManager();
+        }
+        return instance;
+    }
+
+    /**
+     * 数据库初始化
+     *
+     * @param context 当前上下文
+     */
+    public void init(Context context) {
+        if (context == null) {
+            return;
+        }
+
+        if (mDBHelper == null) {
+            mDBHelper = new DBHelper(context.getApplicationContext());
+        }
+    }
+
+    /**
+     * 释放数据库
+     */
+    public void release() {
+        if (mDBHelper != null) {
+            mDBHelper.close();
+            mDBHelper = null;
+        }
+        instance = null;
+    }
+
+    /**
+     * 打开数据库
+     */
+    public synchronized SQLiteDatabase openDatabase() {
+        if (mOpenCounter.incrementAndGet() == 1) {
+            // Opening new database
+            try {
+                mDatabase = mDBHelper.getWritableDatabase();
+            } catch (Exception e) {
+                Log.e(TAG, "openDatabase e = " + e.getMessage());
+                mDatabase = mDBHelper.getReadableDatabase();
+            }
+        }
+        return mDatabase;
+    }
+
+    /**
+     * 关闭数据库
+     */
+    public synchronized void closeDatabase() {
+        if (mOpenCounter.decrementAndGet() == 0) {
+            // Closing database
+            mDatabase.close();
+        }
+    }
+
+    // ---------------------------------------用户组相关(暂时废弃) start--------------------------------------
+
+    /**
+     * 添加用户组
+     */
+    public boolean addGroup(Group group) {
+        if (mDBHelper == null) {
+            return false;
+        }
+        Cursor cursor = null;
+
+        SQLiteDatabase db = mDBHelper.getReadableDatabase();
+        String where = "group_id = ? ";
+        String[] whereValue = {group.getGroupId()};
+        // 查询该groupId是否在数据库中,如果在,则不添加
+        cursor = db.query(DBHelper.TABLE_USER_GROUP, null, where, whereValue,
+                null, null, null);
+        if (cursor == null) {
+            return false;
+        }
+
+        if (cursor.getCount() > 0) {
+            return true;
+        }
+
+        mDatabase = mDBHelper.getWritableDatabase();
+        ContentValues cv = new ContentValues();
+        cv.put("group_id", group.getGroupId());
+        cv.put("desc", group.getDesc() == null ? "" : group.getDesc());
+        cv.put("update_time", System.currentTimeMillis());
+        cv.put("ctime", System.currentTimeMillis());
+
+        long rowId = -1;
+        try {
+            rowId = mDatabase.insert(DBHelper.TABLE_USER_GROUP, null, cv);
+        } catch (Exception e) {
+            Log.e(TAG, "addGroup e = " + e.getMessage());
+            e.printStackTrace();
+        }
+        if (rowId < 0) {
+            return false;
+        }
+        Log.i(TAG, "insert group success:" + rowId);
+        closeCursor(cursor);
+        return true;
+    }
+
+    /**
+     * 查询用户组(查询所有)
+     */
+    public List<Group> queryGroups(int start, int offset) {
+        Cursor cursor = null;
+        List<Group> groupList = new ArrayList<>();
+        try {
+            if (mDBHelper == null) {
+                return null;
+            }
+            SQLiteDatabase db = mDBHelper.getReadableDatabase();
+            String limit = start + " , " + offset;
+            cursor = db.query(DBHelper.TABLE_USER_GROUP, null, null, null, null, null, null, limit);
+            while (cursor != null && cursor.getCount() > 0 && cursor.moveToNext()) {
+                int dbId = cursor.getInt(cursor.getColumnIndex("_id"));
+                String groupId = cursor.getString(cursor.getColumnIndex("group_id"));
+                String desc = cursor.getString(cursor.getColumnIndex("desc"));
+                long updateTime = cursor.getLong(cursor.getColumnIndex("update_time"));
+                long ctime = cursor.getLong(cursor.getColumnIndex("ctime"));
+
+                Group group = new Group();
+                group.setGroupId(groupId);
+                group.setDesc(desc);
+                group.setCtime(ctime);
+                groupList.add(group);
+            }
+        } finally {
+            closeCursor(cursor);
+        }
+        return groupList;
+    }
+
+    /**
+     * 查询用户组(根据groupId)
+     */
+    public List<Group> queryGroupsByGroupId(String groupId) {
+        ArrayList<Group> groupList = new ArrayList<>();
+        Cursor cursor = null;
+
+        try {
+            if (mDBHelper == null) {
+                return groupList;
+            }
+            SQLiteDatabase db = mDBHelper.getReadableDatabase();
+            String where = "group_id = ? ";
+            String[] whereValue = {groupId};
+            cursor = db.query(DBHelper.TABLE_USER_GROUP, null, where, whereValue, null, null, null);
+            while (cursor != null && cursor.getCount() > 0 && cursor.moveToNext()) {
+                int dbId = cursor.getInt(cursor.getColumnIndex("_id"));
+                String desc = cursor.getString(cursor.getColumnIndex("desc"));
+                long updateTime = cursor.getLong(cursor.getColumnIndex("update_time"));
+                long ctime = cursor.getLong(cursor.getColumnIndex("ctime"));
+
+                Group group = new Group();
+                group.setGroupId(groupId);
+                group.setDesc(desc);
+                group.setCtime(ctime);
+                groupList.add(group);
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "queryGroupsByGroupId e = " + e.getMessage());
+        } finally {
+            closeCursor(cursor);
+        }
+        return groupList;
+    }
+
+    /**
+     * 删除用户组
+     */
+    public boolean deleteGroup(String groupId) {
+        boolean success = false;
+        try {
+            mDatabase = mDBHelper.getWritableDatabase();
+            beginTransaction(mDatabase);
+
+            if (!TextUtils.isEmpty(groupId)) {
+                String where = "group_id = ?";
+                String[] whereValue = {groupId};
+
+                if (mDatabase.delete(DBHelper.TABLE_USER, where, whereValue) < 0) {
+                    return false;
+                }
+                if (mDatabase.delete(DBHelper.TABLE_USER_GROUP, where, whereValue) < 0) {
+                    return false;
+                }
+
+                setTransactionSuccessful(mDatabase);
+                success = true;
+            }
+
+        } finally {
+            endTransaction(mDatabase);
+        }
+        return success;
+    }
+
+    // ---------------------------------------用户组相关(暂时废弃) end----------------------------------------
+
+    // ---------------------------------------用户相关 start----------------------------------------
+
+    /**
+     * 添加用户
+     */
+    public boolean addUser(User user) {
+        if (mDBHelper == null) {
+            return false;
+        }
+        try {
+            mDatabase = mDBHelper.getWritableDatabase();
+            beginTransaction(mDatabase);
+
+            ContentValues cv = new ContentValues();
+            cv.put("user_id", user.getUserId());
+            cv.put("user_name", user.getUserName());
+            cv.put("user_info", user.getUserInfo());
+            cv.put("group_id", GROUP_ID);
+            cv.put("face_token", user.getFaceToken());
+            cv.put("feature", user.getFeature());
+            cv.put("image_name", user.getImageName());
+            cv.put("ctime", System.currentTimeMillis());
+            cv.put("update_time", System.currentTimeMillis());
+
+            long rowId = mDatabase.insert(DBHelper.TABLE_USER, null, cv);
+            if (rowId < 0) {
+                return false;
+            }
+
+            setTransactionSuccessful(mDatabase);
+            Log.i(TAG, "insert user success:" + rowId);
+        } catch (Exception e) {
+            Log.e(TAG, "addUser e = " + e.getMessage());
+            return false;
+        } finally {
+            endTransaction(mDatabase);
+        }
+        return true;
+    }
+
+    /**
+     * 查询所有用户(按时间降序排序)
+     */
+    public List<User> queryAllUsers() {
+        Cursor cursor = null;
+        List<User> users = new ArrayList<>();
+        try {
+            if (mDBHelper == null) {
+                return null;
+            }
+            SQLiteDatabase db = mDBHelper.getReadableDatabase();
+            String where = "group_id = ? order by ctime desc";
+            String[] whereValue = {GROUP_ID};
+            cursor = db.query(DBHelper.TABLE_USER, null, where, whereValue, null, null, null);
+            while (cursor != null && cursor.getCount() > 0 && cursor.moveToNext()) {
+                int dbId = cursor.getInt(cursor.getColumnIndex("_id"));
+                String userId = cursor.getString(cursor.getColumnIndex("user_id"));
+                String userName = cursor.getString(cursor.getColumnIndex("user_name"));
+                String userInfo = cursor.getString(cursor.getColumnIndex("user_info"));
+                String faceToken = cursor.getString(cursor.getColumnIndex("face_token"));
+                byte[] feature = cursor.getBlob(cursor.getColumnIndex("feature"));
+                String imageName = cursor.getString(cursor.getColumnIndex("image_name"));
+                long updateTime = cursor.getLong(cursor.getColumnIndex("update_time"));
+                long ctime = cursor.getLong(cursor.getColumnIndex("ctime"));
+
+                User user = new User();
+                user.setId(dbId);
+                user.setUserId(userId);
+                user.setGroupId(GROUP_ID);
+                user.setUserName(userName);
+                user.setCtime(ctime);
+                user.setUpdateTime(updateTime);
+                user.setUserInfo(userInfo);
+                user.setFaceToken(faceToken);
+                user.setFeature(feature);
+                user.setImageName(imageName);
+                users.add(user);
+            }
+        } finally {
+            closeCursor(cursor);
+        }
+        return users;
+    }
+
+    /**
+     * 查询用户(根据userId)
+     */
+    public User queryUser(String userId) {
+        Cursor cursor = null;
+
+        try {
+            if (mDBHelper == null) {
+                return null;
+            }
+            SQLiteDatabase db = mDBHelper.getReadableDatabase();
+            String where = "user_id = ? and group_id = ? ";
+            String[] whereValue = {userId, GROUP_ID};
+            cursor = db.query(DBHelper.TABLE_USER, null, where, whereValue, null, null, null);
+            if (cursor != null && cursor.getCount() > 0 && cursor.moveToNext()) {
+                int dbId = cursor.getInt(cursor.getColumnIndex("_id"));
+                String userName = cursor.getString(cursor.getColumnIndex("user_name"));
+                long updateTime = cursor.getLong(cursor.getColumnIndex("update_time"));
+                long ctime = cursor.getLong(cursor.getColumnIndex("ctime"));
+
+                User user = new User();
+                user.setId(dbId);
+                user.setUserId(userId);
+                user.setGroupId(GROUP_ID);
+                user.setUserName(userName);
+                user.setCtime(ctime);
+                user.setUpdateTime(updateTime);
+                return user;
+            }
+        } finally {
+            closeCursor(cursor);
+        }
+        return null;
+    }
+
+    /**
+     * 查询用户(根据userName精确查询)
+     */
+    public List<User> queryUserByUserNameAccu(String userName) {
+        Cursor cursor = null;
+        List<User> users = new ArrayList<>();
+        try {
+            if (mDBHelper == null) {
+                return null;
+            }
+            SQLiteDatabase db = mDBHelper.getReadableDatabase();
+            String where = "user_name = ? and group_id = ? ";
+            String[] whereValue = {userName, GROUP_ID};
+            cursor = db.query(DBHelper.TABLE_USER, null, where, whereValue, null, null, null);
+            if (cursor != null && cursor.getCount() > 0 && cursor.moveToNext()) {
+                int dbId = cursor.getInt(cursor.getColumnIndex("_id"));
+                String userId = cursor.getString(cursor.getColumnIndex("user_id"));
+                String userInfo = cursor.getString(cursor.getColumnIndex("user_info"));
+                String faceToken = cursor.getString(cursor.getColumnIndex("face_token"));
+                byte[] feature = cursor.getBlob(cursor.getColumnIndex("feature"));
+                String imageName = cursor.getString(cursor.getColumnIndex("image_name"));
+                long updateTime = cursor.getLong(cursor.getColumnIndex("update_time"));
+                long ctime = cursor.getLong(cursor.getColumnIndex("ctime"));
+
+                User user = new User();
+                user.setId(dbId);
+                user.setUserId(userId);
+                user.setGroupId(GROUP_ID);
+                user.setUserName(userName);
+                user.setCtime(ctime);
+                user.setUpdateTime(updateTime);
+                user.setUserInfo(userInfo);
+                user.setFeature(feature);
+                user.setImageName(imageName);
+                user.setFaceToken(faceToken);
+                users.add(user);
+            }
+        } finally {
+            closeCursor(cursor);
+        }
+        return users;
+    }
+
+    /**
+     * 查询用户(根据userName模糊查询)
+     */
+    public List<User> queryUserByUserNameVag(String userName) {
+        Cursor cursor = null;
+        List<User> users = new ArrayList<>();
+        try {
+            if (mDBHelper == null) {
+                return null;
+            }
+            SQLiteDatabase db = mDBHelper.getReadableDatabase();
+            String where = "user_name LIKE ? and group_id = ? order by ctime desc";
+            String[] whereValue = {"%" + userName + "%", GROUP_ID};
+            cursor = db.query(DBHelper.TABLE_USER, null, where, whereValue, null, null, null);
+            while (cursor != null && cursor.getCount() > 0 && cursor.moveToNext()) {
+                int dbId = cursor.getInt(cursor.getColumnIndex("_id"));
+                String userId = cursor.getString(cursor.getColumnIndex("user_id"));
+                String userNameQ = cursor.getString(cursor.getColumnIndex("user_name"));
+                String userInfo = cursor.getString(cursor.getColumnIndex("user_info"));
+                String faceToken = cursor.getString(cursor.getColumnIndex("face_token"));
+                byte[] feature = cursor.getBlob(cursor.getColumnIndex("feature"));
+                String imageName = cursor.getString(cursor.getColumnIndex("image_name"));
+                long updateTime = cursor.getLong(cursor.getColumnIndex("update_time"));
+                long ctime = cursor.getLong(cursor.getColumnIndex("ctime"));
+
+                User user = new User();
+                user.setId(dbId);
+                user.setUserId(userId);
+                user.setGroupId(GROUP_ID);
+                user.setUserName(userNameQ);
+                user.setCtime(ctime);
+                user.setUpdateTime(updateTime);
+                user.setUserInfo(userInfo);
+                user.setFeature(feature);
+                user.setImageName(imageName);
+                user.setFaceToken(faceToken);
+                users.add(user);
+            }
+        } finally {
+            closeCursor(cursor);
+        }
+        return users;
+    }
+
+    /**
+     * 查询用户(根据dbId)
+     */
+    public List<User> queryUserById(int _id) {
+        List<User> users = new ArrayList<>();
+        Cursor cursor = null;
+        try {
+            if (mDBHelper == null) {
+                return null;
+            }
+            SQLiteDatabase db = mDBHelper.getReadableDatabase();
+            String where = "_id = ? ";
+            String[] whereValue = {String.valueOf(_id)};
+            cursor = db.query(DBHelper.TABLE_USER, null, where, whereValue, null, null, null);
+            if (cursor != null && cursor.getCount() > 0 && cursor.moveToNext()) {
+                String groupId = cursor.getString(cursor.getColumnIndex("group_id"));
+                String userId = cursor.getString(cursor.getColumnIndex("user_id"));
+                String userName = cursor.getString(cursor.getColumnIndex("user_name"));
+                String userInfo = cursor.getString(cursor.getColumnIndex("user_info"));
+                String faceToken = cursor.getString(cursor.getColumnIndex("face_token"));
+                byte[] feature = cursor.getBlob(cursor.getColumnIndex("feature"));
+                String imageName = cursor.getString(cursor.getColumnIndex("image_name"));
+                long updateTime = cursor.getLong(cursor.getColumnIndex("update_time"));
+                long ctime = cursor.getLong(cursor.getColumnIndex("ctime"));
+
+                User user = new User();
+                user.setId(_id);
+                user.setUserId(userId);
+                user.setGroupId(groupId);
+                user.setUserName(userName);
+                user.setCtime(ctime);
+                user.setUpdateTime(updateTime);
+                user.setUserInfo(userInfo);
+                user.setFeature(feature);
+                user.setImageName(imageName);
+                user.setFaceToken(faceToken);
+                users.add(user);
+            }
+        } finally {
+            closeCursor(cursor);
+        }
+        return users;
+    }
+
+    /**
+     * 更新用户(通过传入User类的方式)
+     */
+    public boolean updateUser(User user) {
+        boolean success = false;
+        if (mDBHelper == null) {
+            return success;
+        }
+
+        try {
+            mDatabase = mDBHelper.getWritableDatabase();
+            beginTransaction(mDatabase);
+
+            if (user != null) {
+                mDatabase.beginTransaction();
+                String where = "user_id = ? and group_id = ?";
+                String[] whereValue = {user.getUserId(), GROUP_ID};
+                ContentValues cv = new ContentValues();
+
+                cv.put("user_id", user.getUserId());
+                cv.put("user_name", user.getUserName());
+                cv.put("group_id", GROUP_ID);
+                cv.put("image_name", user.getImageName());
+                cv.put("update_time", System.currentTimeMillis());
+
+                if (mDatabase.update(DBHelper.TABLE_USER, cv, where, whereValue) < 0) {
+                    return false;
+                }
+            }
+            setTransactionSuccessful(mDatabase);
+            success = true;
+        } finally {
+            endTransaction(mDatabase);
+        }
+        return success;
+    }
+
+    /**
+     * 更新用户(通过传入图片、命名的方式)
+     */
+    public boolean updateUser(String userName, String imageName, byte[] feature) {
+
+        if (mDBHelper == null) {
+            return false;
+        }
+        try {
+            mDatabase = mDBHelper.getWritableDatabase();
+            beginTransaction(mDatabase);
+
+            String where = "user_name = ? and group_id = ?";
+            String[] whereValue = {userName, GROUP_ID};
+            ContentValues cv = new ContentValues();
+
+            cv.put("user_name", userName);
+            cv.put("group_id", GROUP_ID);
+            cv.put("image_name", imageName);
+            cv.put("update_time", System.currentTimeMillis());
+            cv.put("feature", feature);
+
+            if (mDatabase.update(DBHelper.TABLE_USER, cv, where, whereValue) < 0) {
+                return false;
+            }
+            setTransactionSuccessful(mDatabase);
+        } finally {
+            endTransaction(mDatabase);
+        }
+        return true;
+    }
+
+    /**
+     * 删除用户
+     */
+    public boolean deleteUser(String userId) {
+        boolean success = false;
+        try {
+            mDatabase = mDBHelper.getWritableDatabase();
+            beginTransaction(mDatabase);
+
+            if (!TextUtils.isEmpty(userId)) {
+                String where = "user_id = ? and group_id = ?";
+                String[] whereValue = {userId, GROUP_ID};
+
+                if (mDatabase.delete(DBHelper.TABLE_USER, where, whereValue) < 0) {
+                    return false;
+                }
+
+                setTransactionSuccessful(mDatabase);
+                success = true;
+            }
+
+        } finally {
+            endTransaction(mDatabase);
+        }
+        return success;
+    }
+
+    // ---------------------------------------用户相关 end------------------------------------------
+
+    private void beginTransaction(SQLiteDatabase mDatabase) {
+        if (allowTransaction) {
+            mDatabase.beginTransaction();
+        } else {
+            writeLock.lock();
+            writeLocked = true;
+        }
+    }
+
+    private void setTransactionSuccessful(SQLiteDatabase mDatabase) {
+        if (allowTransaction) {
+            mDatabase.setTransactionSuccessful();
+        }
+    }
+
+    private void endTransaction(SQLiteDatabase mDatabase) {
+        if (allowTransaction) {
+            mDatabase.endTransaction();
+        }
+        if (writeLocked) {
+            writeLock.unlock();
+            writeLocked = false;
+        }
+    }
+
+    private void closeCursor(Cursor cursor) {
+        if (cursor != null) {
+            try {
+                cursor.close();
+            } catch (Throwable e) {
+                Log.e(TAG, "closeCursor e = " + e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * 清空表
+     */
+    public void clearTable() {
+        SQLiteDatabase database = mDBHelper.getWritableDatabase();
+        database.execSQL("delete from " + DBHelper.TABLE_USER);
+    }
+
+    // ---------------------------------------socket相关 start--------------------------------------
+    // 获取识别记录
+//    public List<ResponseGetRecords> queryRecords(String startTime, String endTime) {
+//        List<ResponseGetRecords> responseGetRecords = new ArrayList<>();
+//        Cursor cursor = null;
+//        try {
+//            if (mDBHelper == null) {
+//                return null;
+//            }
+//            SQLiteDatabase db = mDBHelper.getReadableDatabase();
+//            if (!TextUtils.isEmpty(startTime) && !TextUtils.isEmpty(endTime)) {
+//                String where = "time > ? and time < ? ";
+//                String[] whereValue = {startTime, endTime};
+//                cursor = db.query(DBHelper.TABLE_RECORDS, null, where, whereValue, null, null, null);
+//            } else {
+//                String sql = "select * from " + DBHelper.TABLE_RECORDS;
+//                cursor = db.rawQuery(sql, null);
+//            }
+//
+//            if (cursor != null && cursor.getCount() > 0) {
+//                while (cursor.moveToNext()) {
+//                    int dbId = cursor.getInt(cursor.getColumnIndex("_id"));
+//                    String userId = cursor.getString(cursor.getColumnIndex("user_id"));
+//                    String records = cursor.getString(cursor.getColumnIndex("records"));
+//                    String longId = cursor.getString(cursor.getColumnIndex("longId"));
+//                    String score = cursor.getString(cursor.getColumnIndex("score"));
+//                    String deviceId = cursor.getString(cursor.getColumnIndex("deviceid"));
+//                    String time = cursor.getString(cursor.getColumnIndex("time"));
+//                    String faceToken = cursor.getString(cursor.getColumnIndex("face_token"));
+//                    String groupId = cursor.getString(cursor.getColumnIndex("group_id"));
+//                    String userName = cursor.getString(cursor.getColumnIndex("user_name"));
+//
+//                    ResponseGetRecords responseGetRecord = new ResponseGetRecords();
+//                    responseGetRecord.setIndex(String.valueOf(dbId));
+//                    responseGetRecord.setUserId(userId);
+//                    responseGetRecord.setDeviceId(deviceId);
+//                    responseGetRecord.setRecords(records);
+//                    responseGetRecord.setLogId(longId);
+//                    responseGetRecord.setScore(score);
+//                    responseGetRecord.setTime(time);
+//                    responseGetRecord.setFaceToken("");
+//                    responseGetRecord.setGroupId(groupId);
+//                    responseGetRecord.setUserName(userName);
+//
+//                    responseGetRecords.add(responseGetRecord);
+//                }
+//            }
+//        } catch (Exception e) {
+//            Log.e("shangtest", e.getMessage());
+//        } finally {
+//            closeCursor(cursor);
+//        }
+//        return responseGetRecords;
+//    }
+//
+//
+//    // 添加识别记录
+//    public boolean addResponseGetRecords(ResponseGetRecords responseGetRecords) {
+//        if (mDBHelper == null) {
+//            return false;
+//        }
+//        try {
+//            mDatabase = mDBHelper.getWritableDatabase();
+//            beginTransaction(mDatabase);
+//
+//            ContentValues cv = new ContentValues();
+//            cv.put("user_id", responseGetRecords.getUserId());
+//            cv.put("records", responseGetRecords.getRecords());
+//            cv.put("longId", responseGetRecords.getLogId());
+//            cv.put("score", responseGetRecords.getScore());
+//            cv.put("deviceid", responseGetRecords.getDeviceId());
+//            cv.put("time", responseGetRecords.getTime());
+//            cv.put("user_name", responseGetRecords.getUserName());
+//            cv.put("group_id", responseGetRecords.getGroupId());
+//            cv.put("face_token", responseGetRecords.getFaceToken());
+//
+//            long rowId = mDatabase.insert(DBHelper.TABLE_RECORDS, null, cv);
+//            if (rowId < 0) {
+//                return false;
+//            }
+//
+//            setTransactionSuccessful(mDatabase);
+//        } catch (Exception e) {
+//            return false;
+//        } finally {
+//            endTransaction(mDatabase);
+//        }
+//        return true;
+//    }
+//
+//
+//    // 根据时间删除识别记录
+//    public boolean deleteRecords(String startTime, String endTime) {
+//        boolean success = false;
+//        try {
+//            mDatabase = mDBHelper.getWritableDatabase();
+//            beginTransaction(mDatabase);
+//
+//            if (!TextUtils.isEmpty(startTime) && !TextUtils.isEmpty(endTime)) {
+//                String where = " time > ? and time < ?";
+//                String[] whereValue = {startTime, endTime};
+////                String[] whereValue = {"2019-09-05 10:50:09", "2019-09-05 10:50:13"};
+//
+//                if (mDatabase.delete(DBHelper.TABLE_RECORDS, where, whereValue) < 0) {
+//                    return false;
+//                }
+//
+//                setTransactionSuccessful(mDatabase);
+//                success = true;
+//            }
+//
+//        } finally {
+//            endTransaction(mDatabase);
+//        }
+//        return success;
+//    }
+
+    // 根据userId删除识别记录
+    public boolean deleteRecords(String userName) {
+        boolean success = false;
+        try {
+            mDatabase = mDBHelper.getWritableDatabase();
+            beginTransaction(mDatabase);
+
+            if (!TextUtils.isEmpty(userName)) {
+                String where = "user_name = ?";
+                String[] whereValue = {userName};
+
+                if (mDatabase.delete(DBHelper.TABLE_RECORDS, where, whereValue) < 0) {
+                    return false;
+                }
+
+                setTransactionSuccessful(mDatabase);
+                success = true;
+            }
+
+        } finally {
+            endTransaction(mDatabase);
+        }
+        return success;
+    }
+
+    // 根据userId删除识别记录
+    public int cleanRecords() {
+        int number = getRecordsNum();
+        boolean success = false;
+        try {
+            mDatabase = mDBHelper.getWritableDatabase();
+            beginTransaction(mDatabase);
+
+            String where = "1 = 1";
+            String[] whereValue = {};
+
+            if (mDatabase.delete(DBHelper.TABLE_RECORDS, where, whereValue) < 0) {
+                return 0;
+            }
+
+            // 自增恢复为0
+            String resoreIdSql = "update sqlite_sequence set seq=0 where name='" + DBHelper.TABLE_RECORDS + "'";
+            mDatabase.execSQL(resoreIdSql);
+
+            setTransactionSuccessful(mDatabase);
+            success = true;
+
+        } finally {
+            endTransaction(mDatabase);
+        }
+        return number;
+    }
+
+
+    public int getRecordsNum() {
+        int number = 0;
+        {
+            Cursor cursor = null;
+            try {
+                if (mDBHelper == null) {
+                    return 0;
+                }
+                SQLiteDatabase db = mDBHelper.getReadableDatabase();
+                cursor = db.rawQuery("select count(*) from " + DBHelper.TABLE_RECORDS, null);
+                if (!cursor.moveToFirst()) {
+                    number = 0;
+                } else {
+                    number = (int) cursor.getLong(0);
+                }
+
+            } finally {
+                closeCursor(cursor);
+            }
+            return number;
+        }
+    }
+
+    /**
+     * 远程删除用户
+     */
+    public boolean userDeleteByName(String userNmae) {
+        boolean success = false;
+        try {
+            mDatabase = mDBHelper.getWritableDatabase();
+            beginTransaction(mDatabase);
+
+            if (!TextUtils.isEmpty(userNmae)) {
+                String where = "user_name = ? and group_id = ?";
+                String[] whereValue = {userNmae, GROUP_ID};
+
+                if (mDatabase.delete(DBHelper.TABLE_USER, where, whereValue) < 0) {
+                    return false;
+                }
+
+                setTransactionSuccessful(mDatabase);
+                success = true;
+            }
+
+        } finally {
+            endTransaction(mDatabase);
+        }
+        return success;
+    }
+
+    // ---------------------------------------socket相关 end----------------------------------------
+
+}

+ 259 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/manager/FaceTrackManager.java

@@ -0,0 +1,259 @@
+package com.jsw.jswlibrary.faceregist.manager;
+
+import android.util.Log;
+
+import com.baidu.idl.main.facesdk.FaceInfo;
+import com.baidu.idl.main.facesdk.model.BDFaceImageInstance;
+import com.baidu.idl.main.facesdk.model.BDFaceOcclusion;
+import com.baidu.idl.main.facesdk.model.BDFaceSDKCommon;
+import com.jsw.jswlibrary.faceregist.FaceSDKManager;
+import com.jsw.jswlibrary.faceregist.callback.FaceDetectCallBack;
+import com.jsw.jswlibrary.model.LivenessModel;
+import com.jsw.jswlibrary.model.SingleBaseConfig;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+/**
+ * Time: 2019/1/25
+ * Author: v_chaixiaogang
+ * rgb单目检测管理类
+ */
+public class FaceTrackManager {
+    private static final String TAG = FaceTrackManager.class.getSimpleName();
+
+    private static volatile FaceTrackManager instance = null;
+
+    private ExecutorService es;
+    private Future future;
+    private boolean isAliving;
+    private boolean isQualityControl = false;
+    private boolean isDetect = true;
+
+    private volatile int mProcessCount = 0;
+
+    private FaceDetectCallBack mFaceDetectCallBack;
+
+    public FaceDetectCallBack getFaceDetectCallBack() {
+        return mFaceDetectCallBack;
+    }
+
+    public void setFaceDetectCallBack(FaceDetectCallBack faceDetectCallBack) {
+        mFaceDetectCallBack = faceDetectCallBack;
+    }
+
+    public boolean isQualityControl() {
+        return isQualityControl;
+    }
+
+    public void setQualityControl(boolean qualityControl) {
+        isQualityControl = qualityControl;
+    }
+
+    public boolean isAliving() {
+        return isAliving;
+    }
+
+    public void setAliving(boolean aliving) {
+        isAliving = aliving;
+    }
+
+    public boolean isDetect() {
+        return isDetect;
+    }
+
+    public void setDetect(boolean detect) {
+        isDetect = detect;
+    }
+
+    public FaceTrackManager() {
+        es = Executors.newSingleThreadExecutor();
+    }
+
+    public static FaceTrackManager getInstance() {
+        synchronized (FaceTrackManager.class) {
+            if (instance == null) {
+                instance = new FaceTrackManager();
+            }
+        }
+        return instance;
+    }
+
+    public void faceTrack(final byte[] argb, final int width, final int height,
+                          final FaceDetectCallBack faceDetectCallBack) {
+
+        if (future != null && !future.isDone()) {
+            return;
+        }
+
+        if (mProcessCount > 0) {
+            return;
+        }
+        mProcessCount++;
+
+        future = es.submit(new Runnable() {
+            @Override
+            public void run() {
+                faceDataDetect(argb, width, height, faceDetectCallBack);
+                mProcessCount--;
+            }
+        });
+    }
+
+    /**
+     * 人脸检测
+     *
+     * @param argb
+     * @param width
+     * @param height
+     * @param faceDetectCallBack
+     */
+    private void faceDataDetect(final byte[] argb, int width, int height, FaceDetectCallBack faceDetectCallBack) {
+        LivenessModel livenessModel = new LivenessModel();
+
+        BDFaceImageInstance rgbInstance;
+        if (SingleBaseConfig.getBaseConfig().getType() == 4
+                && SingleBaseConfig.getBaseConfig().getCameraType() == 6) {
+            rgbInstance = new BDFaceImageInstance(argb, height, width,
+                    BDFaceSDKCommon.BDFaceImageType.BDFACE_IMAGE_TYPE_RGB,
+                    SingleBaseConfig.getBaseConfig().getDetectDirection(),
+                    SingleBaseConfig.getBaseConfig().getMirrorRGB());
+        } else {
+            rgbInstance = new BDFaceImageInstance(argb, height, width,
+                    BDFaceSDKCommon.BDFaceImageType.BDFACE_IMAGE_TYPE_YUV_NV21,
+                    SingleBaseConfig.getBaseConfig().getDetectDirection(),
+                    SingleBaseConfig.getBaseConfig().getMirrorRGB());
+        }
+
+        // TODO: getImage() 获取送检图片,如果检测数据有问题,可以通过image view 展示送检图片
+        livenessModel.setBdFaceImageInstanceCrop(rgbInstance);
+
+        // 检查函数调用,返回检测结果
+        long startTime = System.currentTimeMillis();
+
+        // 快速检测获取人脸信息,仅用于绘制人脸框,详细人脸数据后续获取
+        FaceInfo[] faceInfos = FaceSDKManager.getInstance().getFaceDetect()
+                .track(BDFaceSDKCommon.DetectType.DETECT_VIS, rgbInstance);
+
+        livenessModel.setRgbDetectDuration(System.currentTimeMillis() - startTime);
+
+        // getImage() 获取送检图片
+        livenessModel.setBdFaceImageInstance(rgbInstance.getImage());
+
+        if (faceInfos != null && faceInfos.length > 0) {
+            livenessModel.setTrackFaceInfo(faceInfos);
+            FaceInfo faceInfo = faceInfos[0];
+            livenessModel.setFaceInfo(faceInfo);
+            livenessModel.setLandmarks(faceInfo.landmarks);
+            Log.e(TAG, "ldmk = " + faceInfo.landmarks.length);
+
+            // 质量检测,针对模糊度、遮挡、角度
+            if (onQualityCheck(livenessModel, faceDetectCallBack)) {
+                // 活体检测
+                if (isAliving) {
+                    startTime = System.currentTimeMillis();
+                    float rgbScore = FaceSDKManager.getInstance().getFaceLiveness().silentLive(
+                            BDFaceSDKCommon.LiveType.BDFACE_SILENT_LIVE_TYPE_RGB,
+                            rgbInstance, faceInfo.landmarks);
+                    Log.e(TAG, "score = " + rgbScore);
+                    livenessModel.setRgbLivenessScore(rgbScore);
+                    livenessModel.setRgbLivenessDuration(System.currentTimeMillis() - startTime);
+                }
+                // 流程结束销毁图片,开始下一帧图片检测,否着内存泄露
+                // rgbInstance.destory();
+                if (faceDetectCallBack != null) {
+                    faceDetectCallBack.onFaceDetectCallback(livenessModel);
+                }
+            } else {
+                // 流程结束销毁图片,开始下一帧图片检测,否着内存泄露
+                rgbInstance.destory();
+            }
+
+        } else {
+            // 流程结束销毁图片,开始下一帧图片检测,否着内存泄露
+            rgbInstance.destory();
+            if (faceDetectCallBack != null) {
+                faceDetectCallBack.onTip(0, "未检测到人脸");
+                faceDetectCallBack.onFaceDetectCallback(null);
+            }
+        }
+    }
+
+
+    /**
+     * 质量检测
+     *
+     * @param livenessModel
+     * @param faceDetectCallBack
+     * @return
+     */
+    public boolean onQualityCheck(final LivenessModel livenessModel,
+                                  final FaceDetectCallBack faceDetectCallBack) {
+
+        if (!SingleBaseConfig.getBaseConfig().isQualityControl()) {
+            return true;
+        }
+
+        if (livenessModel != null && livenessModel.getFaceInfo() != null) {
+
+            // 角度过滤
+            if (Math.abs(livenessModel.getFaceInfo().yaw) > SingleBaseConfig.getBaseConfig().getYaw()) {
+                faceDetectCallBack.onTip(-1, "人脸左右偏转角超出限制");
+                return false;
+            } else if (Math.abs(livenessModel.getFaceInfo().roll) > SingleBaseConfig.getBaseConfig().getRoll()) {
+                faceDetectCallBack.onTip(-1, "人脸平行平面内的头部旋转角超出限制");
+                return false;
+            } else if (Math.abs(livenessModel.getFaceInfo().pitch) > SingleBaseConfig.getBaseConfig().getPitch()) {
+                faceDetectCallBack.onTip(-1, "人脸上下偏转角超出限制");
+                return false;
+            }
+
+
+            // 模糊结果过滤
+            float blur = livenessModel.getFaceInfo().bluriness;
+            if (blur > SingleBaseConfig.getBaseConfig().getBlur()) {
+                faceDetectCallBack.onTip(-1, "图片模糊");
+                return false;
+            }
+
+            // 光照结果过滤
+            float illum = livenessModel.getFaceInfo().illum;
+            if (illum < SingleBaseConfig.getBaseConfig().getIllumination()) {
+                faceDetectCallBack.onTip(-1, "图片光照不通过");
+                return false;
+            }
+
+            // 遮挡结果过滤
+            if (livenessModel.getFaceInfo().occlusion != null) {
+                BDFaceOcclusion occlusion = livenessModel.getFaceInfo().occlusion;
+
+                if (occlusion.leftEye > SingleBaseConfig.getBaseConfig().getLeftEye()) {
+                    // 左眼遮挡置信度
+                    faceDetectCallBack.onTip(-1, "左眼遮挡");
+                } else if (occlusion.rightEye > SingleBaseConfig.getBaseConfig().getRightEye()) {
+                    // 右眼遮挡置信度
+                    faceDetectCallBack.onTip(-1, "右眼遮挡");
+                } else if (occlusion.nose > SingleBaseConfig.getBaseConfig().getNose()) {
+                    // 鼻子遮挡置信度
+                    faceDetectCallBack.onTip(-1, "鼻子遮挡");
+                } else if (occlusion.mouth > SingleBaseConfig.getBaseConfig().getMouth()) {
+                    // 嘴巴遮挡置信度
+                    faceDetectCallBack.onTip(-1, "嘴巴遮挡");
+                } else if (occlusion.leftCheek > SingleBaseConfig.getBaseConfig().getLeftCheek()) {
+                    // 左脸遮挡置信度
+                    faceDetectCallBack.onTip(-1, "左脸遮挡");
+                } else if (occlusion.rightCheek > SingleBaseConfig.getBaseConfig().getRightCheek()) {
+                    // 右脸遮挡置信度
+                    faceDetectCallBack.onTip(-1, "右脸遮挡");
+                } else if (occlusion.chin > SingleBaseConfig.getBaseConfig().getChinContour()) {
+                    // 下巴遮挡置信度
+                    faceDetectCallBack.onTip(-1, "下巴遮挡");
+                } else {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+}

+ 284 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/manager/ImportFileManager.java

@@ -0,0 +1,284 @@
+package com.jsw.jswlibrary.faceregist.manager;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.util.Log;
+
+import com.baidu.idl.main.facesdk.model.BDFaceSDKCommon;
+import com.jsw.jswlibrary.faceregist.api.FaceApi;
+import com.jsw.jswlibrary.listener.OnImportListener;
+import com.jsw.jswlibrary.model.ImportFeatureResult;
+import com.jsw.jswlibrary.model.User;
+import com.jsw.jswlibrary.utils.BitmapUtils;
+import com.jsw.jswlibrary.utils.FileUtils;
+
+import java.io.File;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+/**
+ * 导入相关管理类
+ * Created by v_liujialu01 on 2019/5/28.
+ */
+
+public class ImportFileManager {
+    private static final String TAG = "ImportFileManager";
+
+    private Future mFuture;
+    private ExecutorService mExecutorService;
+    private OnImportListener mImportListener;
+    // 是否需要导入
+    private volatile boolean mIsNeedImport;
+
+    private int mTotalCount;
+    private int mFinishCount;
+    private int mSuccessCount;
+    private int mFailCount;
+
+    private static class HolderClass {
+        private static final ImportFileManager instance = new ImportFileManager();
+    }
+
+    public static ImportFileManager getInstance() {
+        return HolderClass.instance;
+    }
+
+    // 私有构造,实例化ExecutorService
+    private ImportFileManager() {
+        if (mExecutorService == null) {
+            mExecutorService = Executors.newSingleThreadExecutor();
+        }
+    }
+
+    public void setOnImportListener(OnImportListener importListener) {
+        mImportListener = importListener;
+    }
+
+    /**
+     * 开始批量导入
+     */
+    public void batchImport() {
+        // 1、获取导入目录 /sdcard/Face-Import
+        File batchImportDir = FileUtils.getBatchImportDirectory();
+        // 2、遍历该目录下的所有文件
+        File[] picFiles = batchImportDir.listFiles();
+        if (picFiles == null || picFiles.length == 0) {
+            Log.i(TAG, "导入数据的文件夹没有数据");
+            if (mImportListener != null) {
+                mImportListener.showToastMessage("导入数据的文件夹没有数据");
+            }
+            return;
+        }
+
+        // 开启线程导入图片
+        asyncImport(picFiles);
+    }
+
+    public void setIsNeedImport(boolean isNeedImport) {
+        mIsNeedImport = isNeedImport;
+    }
+
+    /**
+     * 开启线程导入图片
+     * @param picFiles  要导入的图片集
+     */
+    private void asyncImport(final File[] picFiles) {
+        mIsNeedImport = true;     // 判断是否需要导入
+        mFinishCount = 0;         // 已完成的图片数量
+        mSuccessCount = 0;        // 已导入成功的图片数量
+        mFailCount = 0;           // 已导入失败的图片数量
+
+        if (mExecutorService == null) {
+            mExecutorService = Executors.newSingleThreadExecutor();
+        }
+
+        mFuture = mExecutorService.submit(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    if (picFiles == null || picFiles.length == 0) {
+                        Log.i(TAG, "导入数据的文件夹没有数据");
+                        if (mImportListener != null) {
+                            mImportListener.showToastMessage("导入数据的文件夹没有数据");
+                        }
+                        return;
+                    }
+
+                    // 读取图片成功,开始显示进度条
+                    if (mImportListener != null) {
+                        mImportListener.showProgressView();
+                    }
+
+                    Thread.sleep(400);
+
+                    mTotalCount = picFiles.length;  // 总图片数
+
+                    for (int i = 0; i < picFiles.length; i++) {
+                        if (!mIsNeedImport) {
+                            break;
+                        }
+
+                        // 3、获取图片名
+                        String picName = picFiles[i].getName();
+                        Log.e(TAG, "i = " + i + ", picName = " + picName);
+                        // 4、判断图片后缀
+                        if (!picName.endsWith(".jpg") && !picName.endsWith(".png")) {
+                            Log.e(TAG, "图片后缀不满足要求");
+                            mFinishCount++;
+                            mFailCount++;
+                            // 更新进度
+                            updateProgress(mTotalCount, mSuccessCount, mFailCount,
+                                    ((float) mFinishCount / (float) mTotalCount));
+                            continue;
+                        }
+
+                        // 5、获取不带后缀的图片名,即用户名
+                        String userName = FileUtils.getFileNameNoEx(picName);
+
+                        boolean success = false;  // 判断成功状态
+
+                        // 6、判断姓名是否有效
+                        String nameResult = FaceApi.getInstance().isValidName(userName);
+                        if (!"0".equals(nameResult)) {
+                            Log.i(TAG, nameResult);
+                            mFinishCount++;
+                            mFailCount++;
+                            // 更新进度
+                            updateProgress(mTotalCount, mSuccessCount, mFailCount,
+                                    ((float) mFinishCount / (float) mTotalCount));
+                            continue;
+                        }
+
+                        // 7、根据姓名查询数据库与文件中对应的姓名是否相等,如果相等,则直接过滤
+                        List<User> listUsers = FaceApi.getInstance().getUserListByUserName(userName);
+                        if (listUsers != null && listUsers.size() > 0) {
+                            Log.i(TAG, "与之前图片名称相同");
+                            mFinishCount++;
+                            mFailCount++;
+                            // 更新进度
+                            updateProgress(mTotalCount, mSuccessCount, mFailCount,
+                                    ((float) mFinishCount / (float) mTotalCount));
+                            continue;
+                        }
+
+                        // 8、根据图片的路径将图片转成Bitmap
+                        Bitmap bitmap = BitmapFactory.decodeFile(picFiles[i].getAbsolutePath());
+
+                        // 9、判断bitmap是否转换成功
+                        if (bitmap == null) {
+                            Log.e(TAG, picName + ":该图片转成Bitmap失败");
+                            mFinishCount++;
+                            mFailCount++;
+                            // 更新进度
+                            updateProgress(mTotalCount, mSuccessCount, mFailCount,
+                                    ((float) mFinishCount / (float) mTotalCount));
+                            continue;
+                        }
+
+                        // 图片缩放
+                        if (bitmap.getWidth() * bitmap.getHeight() > 3000 * 2000) {
+                            if (bitmap.getWidth() > bitmap.getHeight()) {
+                                float scale = 1 / (bitmap.getWidth() * 1.0f / 1000.0f);
+                                bitmap = BitmapUtils.scale(bitmap, scale);
+                            } else {
+                                float scale = 1 / (bitmap.getHeight() * 1.0f / 1000.0f);
+                                bitmap = BitmapUtils.scale(bitmap, scale);
+                            }
+                        }
+
+                        byte[] bytes = new byte[512];
+                        ImportFeatureResult result;
+                        // 10、走人脸SDK接口,通过人脸检测、特征提取拿到人脸特征值
+                        result = FaceApi.getInstance().getFeature(bitmap, bytes,
+                                BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
+
+                        // 11、判断是否提取成功:128为成功,-1为参数为空,-2表示未检测到人脸
+                        Log.i(TAG, "live_photo = " + result.getResult());
+                        if (result.getResult() == -1) {
+                            Log.e(TAG, picName + ":bitmap参数为空");
+                        } else if (result.getResult() == -2) {
+                            Log.e(TAG, picName + ":未检测到人脸");
+                        } else if (result.getResult() == -3) {
+                            Log.e(TAG, picName + ":抠图失败");
+                        } else if (result.getResult() == 128) {
+                            // 将用户信息保存到数据库中
+                            boolean importDBSuccess = FaceApi.getInstance().registerUserIntoDBmanager(null,
+                                    userName, picName, null, bytes);
+
+                            // 保存数据库成功
+                            if (importDBSuccess) {
+                                // 保存图片到新目录中
+                                File facePicDir = FileUtils.getBatchImportSuccessDirectory();
+                                if (facePicDir != null) {
+                                    File savePicPath = new File(facePicDir, picName);
+                                    if (FileUtils.saveBitmap(savePicPath, result.getBitmap())) {
+                                        Log.i(TAG, "图片保存成功");
+                                        success = true;
+                                    } else {
+                                        Log.i(TAG, "图片保存失败");
+                                    }
+                                }
+                            } else {
+                                Log.e(TAG, picName + ":保存到数据库失败");
+                            }
+                        } else {
+                            Log.e(TAG, picName + ":未检测到人脸");
+                        }
+
+                        // 图片回收
+                        if (!bitmap.isRecycled()) {
+                            bitmap.recycle();
+                        }
+
+                        // 判断成功与否
+                        if (success) {
+                            mSuccessCount++;
+                        } else {
+                            mFailCount++;
+                            Log.e(TAG, "失败图片:" + picName);
+                        }
+                        mFinishCount++;
+                        // 导入中(用来显示进度)
+                        Log.i(TAG, "mFinishCount = " + mFinishCount
+                                + " progress = " + ((float) mFinishCount / (float) mTotalCount));
+                        if (mImportListener != null) {
+                            mImportListener.onImporting(mTotalCount, mSuccessCount, mFailCount,
+                                    ((float) mFinishCount / (float) mTotalCount));
+                        }
+                    }
+
+                    // 导入完成
+                    if (mImportListener != null) {
+                        mImportListener.endImport(mTotalCount, mSuccessCount, mFailCount);
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    Log.e(TAG, "exception = " + e.getMessage());
+                }
+            }
+        });
+    }
+
+    private void updateProgress(int totalCount, int successCount, int failureCount, float progress) {
+        if (mImportListener != null) {
+            mImportListener.onImporting(totalCount, successCount, failureCount, progress);
+        }
+    }
+
+    /**
+     * 释放功能,用于关闭线程操作
+     */
+    public void release() {
+        if (mFuture != null && !mFuture.isCancelled()) {
+            mFuture.cancel(true);
+            mFuture = null;
+        }
+
+        if (mExecutorService != null) {
+            mExecutorService.shutdown();
+            mExecutorService = null;
+        }
+    }
+}

+ 40 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/manager/ShareManager.java

@@ -0,0 +1,40 @@
+package com.jsw.jswlibrary.faceregist.manager;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+
+/**
+ * SharedPreferences
+ * Created by liujialu on 2020/02/11.
+ */
+
+public class ShareManager {
+    // 定义存储用户名字段
+    private static final String SP_DB_STATE = "db_state";
+
+    private static ShareManager instance;
+    private SharedPreferences sp;
+    private Context mContext;
+
+    private ShareManager(Context context) {
+        this.mContext = context;
+        sp = PreferenceManager.getDefaultSharedPreferences(context);
+    }
+
+    public static synchronized ShareManager getInstance(Context context) {
+        if (instance == null) {
+            instance = new ShareManager(context);
+        }
+        return instance;
+    }
+
+    // 存储数据库状态
+    public void setDBState(boolean state) {
+        sp.edit().putBoolean(SP_DB_STATE, state).apply();
+    }
+    // 获取数据库状态
+    public boolean getDBState() {
+        return sp.getBoolean(SP_DB_STATE, false);
+    }
+}

+ 108 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/manager/UserInfoManager.java

@@ -0,0 +1,108 @@
+package com.jsw.jswlibrary.faceregist.manager;
+
+import com.jsw.jswlibrary.faceregist.api.FaceApi;
+import com.jsw.jswlibrary.model.User;
+import com.jsw.jswlibrary.utils.LogUtils;
+
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * 用户管理
+ * Created by v_liujialu01 on 2018/12/14.
+ */
+
+public class UserInfoManager {
+    private static final String TAG = UserInfoManager.class.getSimpleName();
+    private ExecutorService mExecutorService = null;
+
+    // 私有构造
+    private UserInfoManager() {
+        if (mExecutorService == null) {
+            mExecutorService = Executors.newSingleThreadExecutor();
+        }
+    }
+
+    private static class HolderClass {
+        private static final UserInfoManager instance = new UserInfoManager();
+    }
+
+    public static UserInfoManager getInstance() {
+        return HolderClass.instance;
+    }
+
+    /**
+     * 释放
+     */
+    public void release() {
+        LogUtils.i(TAG, "release");
+    }
+
+    /**
+     * 删除用户列表信息
+     */
+    public void deleteUserListInfo(final List<User> list, final UserInfoListener listener, final int selectCount) {
+        mExecutorService.submit(new Runnable() {
+            @Override
+            public void run() {
+                if (listener == null) {
+                    return;
+                }
+
+                if (list == null) {
+                    listener.userListDeleteFailure("参数异常");
+                    return;
+                }
+
+                for (int i = 0; i < list.size(); i++) {
+                    if (list.get(i).isChecked()) {
+                        FaceApi.getInstance().userDelete(list.get(i).getUserId());
+                    }
+                }
+                listener.userListDeleteSuccess();
+            }
+        });
+    }
+
+    /**
+     * 获取用户列表信息
+     */
+    public void getUserListInfo(final String userName, final UserInfoListener listener) {
+        mExecutorService.submit(new Runnable() {
+            @Override
+            public void run() {
+                if (listener == null) {
+                    return;
+                }
+
+                // 如果关键字为null,则全局查找
+                if (userName == null) {
+                    listener.userListQuerySuccess(null, FaceApi.getInstance().getAllUserList());
+                } else {
+                    listener.userListQuerySuccess(userName,
+                            FaceApi.getInstance().getUserListByUserNameVag(userName));
+                }
+            }
+        });
+    }
+
+    public static class UserInfoListener {
+
+        public void userListQuerySuccess(String userName, List<User> listUserInfo) {
+            // 用户列表查询成功
+        }
+
+        public void userListQueryFailure(String message) {
+            // 用户列表查询失败
+        }
+
+        public void userListDeleteSuccess() {
+            // 用户列表删除成功
+        }
+
+        public void userListDeleteFailure(String message) {
+            // 用户列表删除失败
+        }
+    }
+}

+ 0 - 0
app/src/main/java/com/jsw/jswlibrary/faceregist/register/FaceRegisterNewActivity.java


Some files were not shown because too many files changed in this diff