Commit 68504ce2c0e7f2d0349c477ffd2ed1c626a970a5

Authored by 韩亚云
1 parent c11cdbc9

身份证采集页面添加本人照片上传功能,人脸数目检测添加

.idea/misc.xml
... ... @@ -39,7 +39,7 @@
39 39 </value>
40 40 </option>
41 41 </component>
42   - <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="JDK" project-jdk-type="JavaSDK">
  42 + <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
43 43 <output url="file://$PROJECT_DIR$/build/classes" />
44 44 </component>
45 45 <component name="ProjectType">
... ...
core/dentity_verfication/src/main/java/com/cnlive/core/people_verfication/activity/TakeIdentityPictureActivity.java
... ... @@ -8,6 +8,7 @@ import android.text.TextUtils;
8 8  
9 9 import com.baidu.ocr.sdk.model.IDCardParams;
10 10 import com.cnlive.core.libs.base.frame.activity.BaseActivity;
  11 +import com.cnlive.core.libs.base.util.AlertUtil;
11 12 import com.cnlive.core.libs.base.util.FileUtils;
12 13 import com.cnlive.core.ocr.ui.camera.CameraActivity;
13 14 import com.cnlive.core.people_verfication.R;
... ... @@ -15,8 +16,12 @@ import com.cnlive.core.people_verfication.databinding.ActivityTakePictureBinding
15 16 import com.cnlive.core.people_verfication.presenter.TakeIdentityPicturePresenter;
16 17 import com.cnlive.core.people_verfication.view.ICertificatePhohosView;
17 18 import com.cnlive.core.people_verfication.view.TakeIdentityPictureView;
  19 +import com.cnlive.media.picker.PickerConfig;
  20 +import com.cnlive.media.picker.entity.Media;
18 21 import com.cnlive.media.picker.utils.PermissionChecker;
19 22  
  23 +import java.util.ArrayList;
  24 +
20 25 import androidx.annotation.NonNull;
21 26 import androidx.databinding.ViewDataBinding;
22 27  
... ... @@ -32,6 +37,7 @@ public class TakeIdentityPictureActivity extends BaseActivity&lt;TakeIdentityPictur
32 37 private int preViewClickId = 0;
33 38 private static int CAMERA_WRITE_FR_PERMISSION = 1001;
34 39 private static int CAMERA_WRITE_BA_PERMISSION = 1002;
  40 + private static int CAMERA_WRITE_PI_PERMISSION = 1003;
35 41  
36 42 @Override
37 43 protected int getBindLayoutId() {
... ... @@ -63,21 +69,23 @@ public class TakeIdentityPictureActivity extends BaseActivity&lt;TakeIdentityPictur
63 69 preViewClickTime = curClickTime;
64 70 preViewClickId = id;
65 71 if (id == R.id.certificate_front) {
66   - if(hasCampermission(CAMERA_WRITE_FR_PERMISSION)){//权限判断
  72 + if (hasCampermission(CAMERA_WRITE_FR_PERMISSION)) {//权限判断
67 73 getMvpView().takeIdCardPictures(this, ICertificatePhohosView.ID_CARD_SIDE_FRONT);
68 74 }
69 75 } else if (id == R.id.certificate_back) {
70   - if(hasCampermission(CAMERA_WRITE_BA_PERMISSION)){//权限判断
  76 + if (hasCampermission(CAMERA_WRITE_BA_PERMISSION)) {//权限判断
71 77 getMvpView().takeIdCardPictures(this, ICertificatePhohosView.ID_CARD_SIDE_BACK);
72 78 }
73 79 } else if (id == R.id.take_picture) {
74   -
  80 + if (hasCampermission(CAMERA_WRITE_PI_PERMISSION)) {
  81 + getMvpView().showDialog();
  82 + }
75 83 }
76 84 }
77 85  
78   - private boolean hasCampermission(int typeNum){
  86 + private boolean hasCampermission(int typeNum) {
79 87 boolean hasPermission = PermissionChecker.checkPermissions(this
80   - , new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}
  88 + , new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE}
81 89 , typeNum, R.string.dialog_imagepicker_permission_camera_nerver_ask_message);
82 90 return hasPermission;
83 91 }
... ... @@ -86,13 +94,17 @@ public class TakeIdentityPictureActivity extends BaseActivity&lt;TakeIdentityPictur
86 94 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
87 95 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
88 96 if (requestCode == CAMERA_WRITE_FR_PERMISSION) {
89   - if (PermissionChecker.onRequestPermissionsResult(this,requestCode, permissions, grantResults, false, R.string.dialog_imagepicker_permission_sdcard_message)[0]) {
  97 + if (PermissionChecker.onRequestPermissionsResult(this, requestCode, permissions, grantResults, false, R.string.dialog_imagepicker_permission_sdcard_message)[0]) {
90 98 getMvpView().takeIdCardPictures(this, ICertificatePhohosView.ID_CARD_SIDE_FRONT);
91 99 }
92   - }else if(requestCode == CAMERA_WRITE_BA_PERMISSION){
93   - if (PermissionChecker.onRequestPermissionsResult(this,requestCode, permissions, grantResults, false, R.string.dialog_imagepicker_permission_sdcard_message)[0]) {
  100 + } else if (requestCode == CAMERA_WRITE_BA_PERMISSION) {
  101 + if (PermissionChecker.onRequestPermissionsResult(this, requestCode, permissions, grantResults, false, R.string.dialog_imagepicker_permission_sdcard_message)[0]) {
94 102 getMvpView().takeIdCardPictures(this, ICertificatePhohosView.ID_CARD_SIDE_BACK);
95 103 }
  104 + } else if (requestCode == CAMERA_WRITE_PI_PERMISSION) {
  105 + if (PermissionChecker.onRequestPermissionsResult(this, requestCode, permissions, grantResults, false, R.string.dialog_imagepicker_permission_sdcard_message)[0]) {
  106 + getMvpView().showDialog();
  107 + }
96 108 }
97 109 }
98 110  
... ... @@ -107,14 +119,25 @@ public class TakeIdentityPictureActivity extends BaseActivity&lt;TakeIdentityPictur
107 119 String frontFilePath = FileUtils.getSaveFile(getApplicationContext(), ICertificatePhohosView.PIC_FRONT).getAbsolutePath();
108 120 if (getMvpView() == null) return;
109 121 getMvpView().recIDCard(IDCardParams.ID_CARD_SIDE_FRONT, frontFilePath);
110   -
111 122 } else if (CameraActivity.CONTENT_TYPE_ID_CARD_BACK.equals(contentType)) {
112 123 String backFilePath = FileUtils.getSaveFile(getApplicationContext(), ICertificatePhohosView.PIC_BACK).getAbsolutePath();
113 124 if (getMvpView() == null) return;
114 125 getMvpView().recIDCard(IDCardParams.ID_CARD_SIDE_BACK, backFilePath);
  126 + }else if(CameraActivity.CONTENT_TYPE_GENERAL.endsWith(contentType)){
  127 + String filePath = FileUtils.getSaveFile(getApplicationContext(), ICertificatePhohosView.PIC_GENERAL).getAbsolutePath();
  128 + if (getMvpView() == null) return;
  129 + if (!TextUtils.isEmpty(filePath))getMvpView().hasFace(filePath);
115 130 }
116 131 }
117 132 }
  133 + }else if (requestCode == 200 && resultCode == PickerConfig.DEFAULT_RESULT_CODE) {
  134 + ArrayList<Media> select = data.getParcelableArrayListExtra(PickerConfig.EXTRA_RESULT);
  135 + if (select != null && select.size() > 0) {
  136 + String path = select.get(0).path;
  137 + if (!TextUtils.isEmpty(path))getMvpView().hasFace(path);
  138 + } else {
  139 + AlertUtil.showDeftToast(this, "请选择图片");
  140 + }
118 141 }
119 142 }
120 143  
... ...
core/dentity_verfication/src/main/java/com/cnlive/core/people_verfication/view/ICertificatePhohosView.java
... ... @@ -10,6 +10,8 @@ public interface ICertificatePhohosView extends MvpView {
10 10 int REQUEST_CODE_CAMERA = 102;
11 11 int ID_CARD_SIDE_FRONT = 1;
12 12 int ID_CARD_SIDE_BACK = 2;
  13 + int ID_CAMERA_GENETAL = 3;
13 14 String PIC_FRONT = "pic_front";
14 15 String PIC_BACK = "pic_back";
  16 + String PIC_GENERAL = "pic_general";
15 17 }
... ...
core/dentity_verfication/src/main/java/com/cnlive/core/people_verfication/view/TakeIdentityPictureView.java
1 1 package com.cnlive.core.people_verfication.view;
2 2  
3 3 import android.app.Activity;
  4 +import android.app.Dialog;
4 5 import android.content.Context;
5 6 import android.content.Intent;
6 7 import android.graphics.Bitmap;
7 8 import android.graphics.BitmapFactory;
8 9 import android.hardware.Camera;
  10 +
  11 +import com.cnlive.media.picker.ImagePicker;
  12 +import com.cnlive.media.picker.PickerConfig;
  13 +
  14 +import android.media.FaceDetector;
9 15 import android.os.Environment;
10 16 import android.os.Handler;
11 17 import android.os.Looper;
12 18 import android.text.TextUtils;
  19 +import android.view.Gravity;
  20 +import android.view.View;
  21 +import android.view.ViewGroup;
  22 +import android.view.Window;
13 23 import android.widget.ImageView;
14 24  
15 25 import com.baidu.ocr.sdk.OCR;
... ... @@ -30,17 +40,16 @@ import com.cnlive.core.ocr.ui.camera.CameraActivity;
30 40 import com.cnlive.core.ocr.ui.util.ImageUtil;
31 41 import com.cnlive.core.people_verfication.R;
32 42 import com.cnlive.core.people_verfication.activity.TakeIdentityPictureActivity;
  43 +import com.cnlive.media.picker.utils.ImagePickerComUtils;
33 44  
34   -import java.io.ByteArrayOutputStream;
35 45 import java.io.File;
36   -import java.io.FileNotFoundException;
37   -import java.io.FileOutputStream;
38   -import java.io.IOException;
39 46 import java.text.SimpleDateFormat;
40 47 import java.util.Date;
41 48  
  49 +
42 50 import static com.cnlive.core.people_verfication.view.ICertificatePhohosView.PIC_BACK;
43 51 import static com.cnlive.core.people_verfication.view.ICertificatePhohosView.PIC_FRONT;
  52 +import static com.cnlive.core.people_verfication.view.ICertificatePhohosView.PIC_GENERAL;
44 53  
45 54 public class TakeIdentityPictureView extends BaseView {
46 55  
... ... @@ -51,6 +60,7 @@ public class TakeIdentityPictureView extends BaseView {
51 60 private boolean isBackEffective = false;
52 61 private String idCardNo;
53 62 private String realName;
  63 + private Dialog dialog;
54 64  
55 65 public TakeIdentityPictureView(TakeIdentityPictureActivity activity) {
56 66 this.activity = activity;
... ... @@ -64,14 +74,9 @@ public class TakeIdentityPictureView extends BaseView {
64 74 activity.finish();
65 75 }
66 76  
67   - /**
68   - * 拍摄
69   - *
70   - * @param idCardSide
71   - */
72 77 public void takeIdCardPictures(Context context, final int idCardSide) {
73 78 long curClickTime = System.currentTimeMillis();
74   - if (preViewClickTime > 0 && curClickTime - preViewClickTime <= 2000 ) {
  79 + if (preViewClickTime > 0 && curClickTime - preViewClickTime <= 2000) {
75 80 return;
76 81 }
77 82 preViewClickTime = curClickTime;
... ... @@ -83,6 +88,8 @@ public class TakeIdentityPictureView extends BaseView {
83 88 takePhoto(PIC_FRONT, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
84 89 } else if (idCardSide == ICertificatePhohosView.ID_CARD_SIDE_BACK) {
85 90 takePhoto(PIC_BACK, CameraActivity.CONTENT_TYPE_ID_CARD_BACK);
  91 + } else if (idCardSide == ICertificatePhohosView.ID_CAMERA_GENETAL) {
  92 + takePhoto(PIC_GENERAL, CameraActivity.CONTENT_TYPE_GENERAL);
86 93 }
87 94 }
88 95  
... ... @@ -130,7 +137,7 @@ public class TakeIdentityPictureView extends BaseView {
130 137 camera.release();
131 138 } catch (Throwable e) {
132 139 e.printStackTrace();
133   - AlertUtil.showDeftToast(getContext(),"没有相机权限,相机开启失败");
  140 + AlertUtil.showDeftToast(getContext(), "没有相机权限,相机开启失败");
134 141 return;
135 142 }
136 143 }
... ... @@ -198,7 +205,7 @@ public class TakeIdentityPictureView extends BaseView {
198 205 frontBitmap = bitmap;
199 206 showIdCard(idCardSide, frontBitmap, activity.binding.certificateFront);
200 207 activity.binding.certificateFront.setImageBitmap(bitmap);
201   - if(isBackEffective){
  208 + if (isBackEffective) {
202 209 // activity.binding.submit.setClickable(true);
203 210 // activity.binding.submit.setTextColor(activity.getResources().getColor(R.color.white));
204 211 // activity.binding.submit.setBackground(getContext().getResources().getDrawable(R.drawable.bg_apply_btn));
... ... @@ -208,20 +215,20 @@ public class TakeIdentityPictureView extends BaseView {
208 215 if (idCardSide.equals(IDCardParams.ID_CARD_SIDE_BACK)) {
209 216 backBitmap = bitmap;
210 217 isBackEffective = true;
211   - if(TextUtils.isEmpty(idCardResult.getIssueAuthority().toString().trim()) ||
212   - TextUtils.isEmpty(idCardResult.getSignDate().toString().trim())){
  218 + if (TextUtils.isEmpty(idCardResult.getIssueAuthority().toString().trim()) ||
  219 + TextUtils.isEmpty(idCardResult.getSignDate().toString().trim())) {
213 220 // activity.binding.submit.setClickable(false);
214 221 AlertUtil.showDeftToast(getContext(), "身份证信息读取失败,请重新拍摄");
215 222 return;
216 223 }
217   - try{
  224 + try {
218 225 Integer.parseInt(idCardResult.getExpiryDate().toString().trim());
219   - if(idCardResult.getExpiryDate() != null && Integer.parseInt(idCardResult.getExpiryDate().toString().trim()) < getCurrentTime()){
  226 + if (idCardResult.getExpiryDate() != null && Integer.parseInt(idCardResult.getExpiryDate().toString().trim()) < getCurrentTime()) {
220 227 // activity.binding.submit.setClickable(false);
221 228 AlertUtil.showDeftToast(getContext(), "身份证有效期失效");
222 229 return;
223 230 }
224   - }catch (Exception e){
  231 + } catch (Exception e) {
225 232 e.printStackTrace();
226 233 }
227 234  
... ... @@ -234,7 +241,7 @@ public class TakeIdentityPictureView extends BaseView {
234 241 // activity.binding.submit.setBackground(getContext().getResources().getDrawable(R.drawable.bg_apply_btn));
235 242 }
236 243 }
237   - }else {
  244 + } else {
238 245 // activity.binding.submit.setClickable(false);
239 246 AlertUtil.showDeftToast(getContext(), "身份证信息读取失败,请重新拍摄");
240 247 }
... ... @@ -259,34 +266,71 @@ public class TakeIdentityPictureView extends BaseView {
259 266 return Integer.parseInt(date);
260 267 }
261 268  
262   - public File compressImage(Bitmap bitmap, String filename) {
263   - ByteArrayOutputStream baos = new ByteArrayOutputStream();
264   - bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
265   - int options = 100;
266   - while (baos.toByteArray().length / 1024 > 500) { //循环判断如果压缩后图片是否大于500kb,大于继续压缩
267   - baos.reset();//重置baos即清空baos
268   - options -= 10;//每次都减少10
269   - bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
270   - long length = baos.toByteArray().length;
  269 + public void showDialog() {
  270 + if (dialog == null) {
  271 + dialog = new Dialog(activity, R.style.DialogStyle);
  272 + View view = View.inflate(activity, R.layout.dialog_takimg, null);
  273 + dialog.setContentView(view);
  274 + Window window = dialog.getWindow();
  275 + window.setGravity(Gravity.BOTTOM);
  276 + window.setWindowAnimations(R.style.dialogStyle);
  277 + window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  278 + dialog.show();
  279 + } else {
  280 + dialog.show();
271 281 }
272   - File file = new File(Environment.getExternalStorageDirectory() + "/aegis/file");
273   - if (!file.exists()) {
274   - file.mkdirs();
  282 + dialog.findViewById(R.id.take_photo).setOnClickListener(view -> {
  283 + dialog.dismiss();
  284 + takeIdCardPictures(activity, ICertificatePhohosView.ID_CAMERA_GENETAL);
  285 + });
  286 + dialog.findViewById(R.id.get_img).setOnClickListener(view -> {
  287 + dialog.dismiss();
  288 + showAum();
  289 + });
  290 + dialog.findViewById(R.id.cancle).setOnClickListener(view -> dialog.dismiss());
  291 + }
  292 +
  293 + /**
  294 + * 打开相册
  295 + */
  296 + public void showAum() {
  297 + if (!ImagePickerComUtils.isSdExist()) {
  298 + AlertUtil.showDeftToast(getContext(), "SD卡不存在");
  299 + return;
275 300 }
276   - file = new File(Environment.getExternalStorageDirectory() + "/aegis/file/", filename + ".png");
277   - try {
278   - FileOutputStream fos = new FileOutputStream(file);
279   - try {
280   - fos.write(baos.toByteArray());
281   - fos.flush();
282   - fos.close();
283   - } catch (IOException e) {
284   - e.printStackTrace();
  301 + new ImagePicker.Builder()
  302 + .maxNum(1)
  303 + .maxImageSize(20 * 1024 * 1024)
  304 + .setSelectGif(false)
  305 + //是否需要相机
  306 +// .needCamera(true)
  307 + .selectMode(PickerConfig.PICKER_IMAGE)
  308 + .cachePath(Environment.getExternalStorageDirectory() + "/strike/file/")
  309 + .isSinglePick(true)
  310 + .doCrop(1, 1, 300, 300)
  311 + .builder()
  312 + .start(activity, 200, PickerConfig.DEFAULT_RESULT_CODE);
  313 + }
  314 +
  315 + /**
  316 + * 检测是否有人脸
  317 + * @param path
  318 + */
  319 + public void hasFace(String path){
  320 + int numberOfFace = 12;
  321 + FaceDetector myFaceDetect;
  322 + Bitmap bitmap = BitmapFactory.decodeFile(path);
  323 + Bitmap bitmap565 = bitmap.copy(Bitmap.Config.RGB_565, true);
  324 + int imageWidth = bitmap565.getWidth();
  325 + int imageHeight = bitmap565.getHeight();
  326 + FaceDetector.Face[] myFace = new FaceDetector.Face[numberOfFace];
  327 + myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace);
  328 + int numberOfFaceDetected = myFaceDetect.findFaces(bitmap565, myFace);
  329 + AlertUtil.showDeftToast(getContext(), "检测到"+numberOfFaceDetected+"个人脸");
  330 + if(numberOfFaceDetected == 1) {
  331 + GlideUtil.init(activity, path).error(R.drawable.take_photo).into(activity.binding.takePicture);
  332 + }else if(new File(path).exists()){
  333 + new File(path).delete();
285 334 }
286   - } catch (FileNotFoundException e) {
287   - e.printStackTrace();
288   - }
289   -// recycleBitmap(bitmap);
290   - return file;
291 335 }
292 336 }
... ...
core/dentity_verfication/src/main/res/layout/dialog_takimg.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:layout_width="match_parent"
  4 + android:layout_height="match_parent"
  5 + android:background="@color/white"
  6 + android:orientation="vertical">
  7 +
  8 + <LinearLayout
  9 + android:id="@+id/take_photo"
  10 + android:layout_width="match_parent"
  11 + android:layout_height="wrap_content"
  12 + android:orientation="vertical">
  13 +
  14 + <TextView
  15 + android:layout_width="match_parent"
  16 + android:layout_height="wrap_content"
  17 + android:gravity="center_horizontal"
  18 + android:padding="15dp"
  19 + android:text="@string/tak_picture"
  20 + android:textColor="#333333"
  21 + android:textSize="15sp" />
  22 +
  23 + <View
  24 + android:layout_width="match_parent"
  25 + android:layout_height="1dp"
  26 + android:background="#f2f3f4" />
  27 + </LinearLayout>
  28 +
  29 + <LinearLayout
  30 + android:id="@+id/get_img"
  31 + android:layout_width="match_parent"
  32 + android:layout_height="wrap_content"
  33 + android:orientation="vertical">
  34 +
  35 + <TextView
  36 + android:layout_width="match_parent"
  37 + android:layout_height="wrap_content"
  38 + android:gravity="center_horizontal"
  39 + android:padding="15dp"
  40 + android:text="@string/to_picture"
  41 + android:textColor="#333333"
  42 + android:textSize="15sp" />
  43 +
  44 + <View
  45 + android:layout_width="match_parent"
  46 + android:layout_height="1dp"
  47 + android:background="#f2f3f4" />
  48 + </LinearLayout>
  49 +
  50 + <LinearLayout
  51 + android:id="@+id/cancle"
  52 + android:layout_width="match_parent"
  53 + android:layout_height="wrap_content"
  54 + android:orientation="vertical">
  55 +
  56 + <View
  57 + android:layout_width="match_parent"
  58 + android:layout_height="10dp"
  59 + android:background="#f2f3f4" />
  60 +
  61 + <TextView
  62 + android:layout_width="match_parent"
  63 + android:layout_height="wrap_content"
  64 + android:gravity="center_horizontal"
  65 + android:padding="15dp"
  66 + android:text="@string/cancle"
  67 + android:textColor="#333333"
  68 + android:textSize="15sp" />
  69 + </LinearLayout>
  70 +</LinearLayout>
0 71 \ No newline at end of file
... ...
core/dentity_verfication/src/main/res/values/strings.xml
... ... @@ -13,4 +13,7 @@
13 13  
14 14 <string name="init_baidu_faile">初始化失败</string>
15 15 <string name="only_for_verified">仅用于实名认证</string>
  16 + <string name="tak_picture">拍摄</string>
  17 + <string name="to_picture">从手机相册选择</string>
  18 + <string name="cancle">取消</string>
16 19 </resources>
... ...
core/dentity_verfication/src/main/res/values/styles.xml 0 → 100644
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <style name="DialogStyle" parent="@android:style/Theme.Dialog">
  4 + <item name="android:windowFrame">@null</item>
  5 + <item name="android:windowIsFloating">true</item>
  6 + <item name="android:windowIsTranslucent">true</item>
  7 + <item name="android:windowNoTitle">true</item>
  8 + <item name="android:windowBackground">@android:color/transparent</item>
  9 + <item name="android:backgroundDimEnabled">true</item>
  10 + <item name="android:backgroundDimAmount">0.6</item>
  11 + <item name="android:windowCloseOnTouchOutside">true</item>
  12 + </style>
  13 +
  14 + <style name="dialogStyle" parent="android:Animation">
  15 + <item name="android:windowEnterAnimation">@anim/anim_enter</item>
  16 + <item name="android:windowExitAnimation">@anim/anim_exit</item>
  17 + </style>
  18 +</resources>
0 19 \ No newline at end of file
... ...