Преглед изворни кода

完成无证人脸照片采集并保存功能

ifengouy пре 2 година
родитељ
комит
a51436f745

+ 4 - 1
app/src/main/java/com/sunwin/visitorapp/activity/IdcardRegActivity.java

@@ -4,6 +4,7 @@ import android.graphics.Bitmap;
 import android.os.Bundle;
 import android.view.View;
 import android.widget.AdapterView;
+import android.widget.CalendarView;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -12,6 +13,7 @@ import com.sunwin.visitorapp.BaseActivity;
 import com.sunwin.visitorapp.BaseApplication;
 import com.sunwin.visitorapp.R;
 import com.sunwin.visitorapp.adapter.CardAdapter;
+import com.sunwin.visitorapp.face.CameraPreviewData;
 import com.sunwin.visitorapp.face.IDCardReaderUtil;
 import com.sunwin.visitorapp.face.IdCardReadCallback;
 import com.sunwin.visitorapp.model.OpenDoorByFaceNetResultInfo;
@@ -148,8 +150,9 @@ public class IdcardRegActivity extends BaseActivity implements View.OnClickListe
     }
 
     @Override
-    public void takePic(Bitmap bitmap) {
+    public void takePic(CameraPreviewData data) {
 
     }
+
     /** ------------------FaceDetecterView.Listener 结束------------------------------  */
 }

+ 34 - 3
app/src/main/java/com/sunwin/visitorapp/activity/NoCardRegActivity.java

@@ -1,16 +1,25 @@
 package com.sunwin.visitorapp.activity;
 
-import android.graphics.Bitmap;
+import android.content.Intent;
 import android.os.Bundle;
+import android.os.Handler;
 import android.view.View;
 import android.widget.TextView;
 
 import com.sunwin.visitorapp.BaseActivity;
 import com.sunwin.visitorapp.BaseApplication;
 import com.sunwin.visitorapp.R;
+import com.sunwin.visitorapp.face.CameraPreviewData;
 import com.sunwin.visitorapp.model.OpenDoorByFaceNetResultInfo;
+import com.sunwin.visitorapp.utils.Constant;
+import com.sunwin.visitorapp.utils.FileUtil;
+import com.sunwin.visitorapp.utils.LogUtil;
+import com.sunwin.visitorapp.utils.ToastUtils;
 import com.sunwin.visitorapp.view.FaceDetecterView;
 
+import java.io.File;
+import java.io.IOException;
+
 /**
  *
  */
@@ -44,6 +53,7 @@ public class NoCardRegActivity extends BaseActivity implements View.OnClickListe
         mTvHeadTitle = (TextView) findViewById(R.id.tv_head_title);
         findViewById(R.id.head_iv_back).setOnClickListener(this);
         mFaceDetecterView.config(this, this);
+        mFaceDetecterView.needTakePic = true;
         mTvHeadTitle.setText("访客登记");
         BaseApplication.getSystemTTS().playText("请看摄像头");
 
@@ -77,9 +87,30 @@ public class NoCardRegActivity extends BaseActivity implements View.OnClickListe
     }
 
     @Override
-    public void takePic(Bitmap bitmap) {
-
+    public void takePic(CameraPreviewData data) {
+        String saveFilePath = Constant.RecognitionDir + "face_" + System.currentTimeMillis() + ".jpg";
+        LogUtil.e(TAG, "takePicPath = " + saveFilePath);
+        File saveFile = new File(saveFilePath);
+        saveFile.deleteOnExit();
+        try {
+            if (saveFile.createNewFile()) {
+                FileUtil.saveFile(data.nv21Data, data.width, data.height, data.rotation, saveFilePath);
+                ToastUtils.showToast("人脸采集成功");
+                new Handler().postDelayed(new Runnable() {
+                    @Override
+                    public void run() {
+                        Intent intent = new Intent(NoCardRegActivity.this, VisitorRegisterAc.class);
+                        intent.putExtra(Constant.IIntentValue.CURRENTFACEPATH,saveFile);
+                        startActivity(intent);
+                    }
+                },500);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
     }
+
+
     /**
      * ------------------FaceDetecterView.Listener 结束------------------------------
      */

+ 17 - 12
app/src/main/java/com/sunwin/visitorapp/activity/VisitorRegisterAc.java

@@ -9,44 +9,49 @@ import android.widget.Spinner;
 
 import com.sunwin.visitorapp.BaseActivity;
 import com.sunwin.visitorapp.R;
+import com.sunwin.visitorapp.utils.Constant;
 import com.sunwin.visitorapp.view.UINav;
 
 public class VisitorRegisterAc extends BaseActivity {
 
+   private String currentFacePath;//人脸照片
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.ac_visitor_register);
 
+        currentFacePath = getIntent().getStringExtra(Constant.IIntentValue.CURRENTFACEPATH);
         UINav uiNav = findViewById(R.id.UINav);
-        uiNav.setData(this,"访客登记");
+        uiNav.setData(this, "访客登记");
 
         ViewGroup form = findViewById(R.id.ViewForm);
-        setFormEnable(form,false);
+        setFormEnable(form, false);
         //数据绑定自定义下拉布局文件,并且为每列设置下拉列布局,相当Listview
-        String[] ctype = new String[]{"全部","电影","美食","旅游"};
-        ArrayAdapter<String> adpter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,ctype);
+        String[] ctype = new String[]{"全部", "电影", "美食", "旅游"};
+        ArrayAdapter<String> adpter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, ctype);
         adpter.setDropDownViewResource(android.R.layout.simple_spinner_item);
 
         //获取Spinner组件,
         Spinner spinner = (Spinner) findViewById(R.id.SpinnerReason);
         spinner.setAdapter(adpter);
+
+
     }
 
 
-    private void setFormEnable(ViewGroup form,boolean bool){
+    private void setFormEnable(ViewGroup form, boolean bool) {
         int _ChildCount = form.getChildCount();
-        if(_ChildCount>0){
-            for (int i = 0;i<_ChildCount;i++){
-                View _Child =  form.getChildAt(i);
+        if (_ChildCount > 0) {
+            for (int i = 0; i < _ChildCount; i++) {
+                View _Child = form.getChildAt(i);
 
-                if(_Child instanceof Spinner){
+                if (_Child instanceof Spinner) {
                     _Child.setEnabled(bool);
-                }else if(_Child instanceof EditText){
+                } else if (_Child instanceof EditText) {
                     _Child.setEnabled(bool);
-                }else if(_Child instanceof ViewGroup){
-                    setFormEnable((ViewGroup)_Child,bool);
+                } else if (_Child instanceof ViewGroup) {
+                    setFormEnable((ViewGroup) _Child, bool);
                 }
             }
         }

+ 1 - 0
app/src/main/java/com/sunwin/visitorapp/face/SwFaceLoop.java

@@ -346,6 +346,7 @@ public class SwFaceLoop extends FRAbsLoop {
             } else {
                 /* 将识别到的人脸在预览界面中圈出,并在上方显示人脸位置及角度信息 */
                 EventBus.getDefault().post(new DescEvent().setDesc(DescEvent.DESC_FR_ING));
+                EventBus.getDefault().post(new DescEvent().setDesc(DescEvent.DESC_TAKE_PIC).setCameraPreviewData(cameraPreviewData));
             }
             if (detectionResult != null && detectionResult.message.length != 0) {
 //                Log.e(DEBUG_TAG, "mDetectResultQueue.offer");

+ 16 - 2
app/src/main/java/com/sunwin/visitorapp/model/bus/DescEvent.java

@@ -1,11 +1,12 @@
 package com.sunwin.visitorapp.model.bus;
 
+import com.sunwin.visitorapp.face.CameraPreviewData;
 import com.sunwin.visitorapp.model.BaseModel;
 import com.sunwin.visitorapp.model.OpenDoorByFaceNetResultInfo;
 
 public class DescEvent extends BaseModel {
     public static final String DESC_FR_TIP = "请注视相机"; //识别失败的时候提示
-    public static  final String DESC_FR_TIP_2 = "请刷身份证";
+    public static final String DESC_FR_TIP_2 = "请刷身份证";
     public static final String DESC_FR_ING = "正在识别中...";
     public static final String DESC_FR_SUCC = "识别成功";
     public static final String DESC_FR_NET_ERROR = "网络异常";
@@ -13,9 +14,21 @@ public class DescEvent extends BaseModel {
     public static final String DESC_FR_NO_BODY = "请重新识别";
     public static final String DESC_NEED_FLUSH_CARD = "需刷卡校验";
     public static final String DESC_FR_FROCUSE_EYE = "请正面注视相机";
+    public static final String DESC_TAKE_PIC = "拍照";
     private String desc = "";
     private OpenDoorByFaceNetResultInfo openDoorByFaceNetResultInfo;
 
+    public CameraPreviewData getCameraPreviewData() {
+        return cameraPreviewData;
+    }
+
+    public DescEvent setCameraPreviewData(CameraPreviewData cameraPreviewData) {
+        this.cameraPreviewData = cameraPreviewData;
+        return this;
+    }
+
+    private CameraPreviewData cameraPreviewData;
+
     public String getDesc() {
         return desc;
     }
@@ -24,7 +37,8 @@ public class DescEvent extends BaseModel {
         this.desc = desc;
         return this;
     }
-//
+
+    //
     public OpenDoorByFaceNetResultInfo getOpenDoorByFaceNetResultInfo() {
         return openDoorByFaceNetResultInfo;
     }

+ 1 - 0
app/src/main/java/com/sunwin/visitorapp/utils/Constant.java

@@ -43,6 +43,7 @@ public class Constant {
     }
 
     public interface IIntentValue {
+        String CURRENTFACEPATH = "currentFacePath";
     }
 
     public interface NumerValue {

+ 61 - 0
app/src/main/java/com/sunwin/visitorapp/utils/FileUtil.java

@@ -1,12 +1,22 @@
 package com.sunwin.visitorapp.utils;
 
 import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.ImageFormat;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.YuvImage;
+import android.util.Log;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.InputStream;
 
 public class FileUtil {
+    private static final String TAG = "FileUtil";
+
     public static void copyFilesFromAssets(Context context, String assetsPath, String savePath){
         try {
             String fileNames[] = context.getAssets().list(assetsPath);// 获取assets目录下的所有文件及目录名
@@ -35,4 +45,55 @@ public class FileUtil {
             e.printStackTrace();
         }
     }
+
+    public static void saveFile(byte[] date, int width, int height, int rotation,String saveFile) {
+        Bitmap bitmap = getBitmapFromYUV(date, width, height, rotation);
+        double size = 100;
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        int options = 100;
+        bitmap.compress(Bitmap.CompressFormat.JPEG, options, stream);
+
+        while (stream.toByteArray().length / 1024 > size && options > 6) {
+            stream.reset();
+            options -= 6;
+            bitmap.compress(Bitmap.CompressFormat.JPEG, options, stream);
+        }
+
+        FileOutputStream fos = null;
+        try {
+            fos = new FileOutputStream(saveFile);
+            fos.write(stream.toByteArray());
+            fos.flush();
+            fos.close();
+            stream.close();
+            bitmap.recycle();
+            LogUtil.e(TAG, "存入照片 " + saveFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
+    private static Bitmap getBitmapFromYUV(byte[] date, int width, int height, int rotation) {
+        //使用YuvImage---》NV21
+        YuvImage yuvImage = new YuvImage(date, ImageFormat.NV21, width, height, null);
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+        yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, baos);
+        byte[] jdate = baos.toByteArray();
+        BitmapFactory.Options bitmapFatoryOptions = new BitmapFactory.Options();
+        bitmapFatoryOptions.inPreferredConfig = Bitmap.Config.RGB_565;
+        bitmapFatoryOptions.inSampleSize = 2;
+        if (rotation == 0) {
+            Bitmap bmp = BitmapFactory.decodeByteArray(jdate, 0, jdate.length, bitmapFatoryOptions);
+            return bmp;
+        } else {
+            Matrix m = new Matrix();
+            m.postRotate(rotation);
+            Bitmap bmp = BitmapFactory.decodeByteArray(jdate, 0, jdate.length, bitmapFatoryOptions);
+            Bitmap bml = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), m, true);
+            return bml;
+        }
+    }
 }

+ 13 - 11
app/src/main/java/com/sunwin/visitorapp/view/FaceDetecterView.java

@@ -2,7 +2,6 @@ package com.sunwin.visitorapp.view;
 
 import android.app.Activity;
 import android.content.Context;
-import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.hardware.Camera;
 import android.os.Build;
@@ -17,6 +16,7 @@ import com.sunwin.visitorapp.BaseApplication;
 import com.sunwin.visitorapp.R;
 import com.sunwin.visitorapp.camera.CameraHolder;
 import com.sunwin.visitorapp.camera.CameraSurfaceView;
+import com.sunwin.visitorapp.face.CameraPreviewData;
 import com.sunwin.visitorapp.face.FRAbsLoop;
 import com.sunwin.visitorapp.face.FRAbsLoopFactory;
 import com.sunwin.visitorapp.model.OpenDoorByFaceNetResultInfo;
@@ -67,7 +67,7 @@ public class FaceDetecterView extends RelativeLayout {
 
 
     private CameraHolder cameraHolder;
-    private boolean isTakePic = false;
+    public boolean needTakePic = false;//是否需要拍照
 
     public FaceDetecterView(Context context) {
         super(context);
@@ -165,15 +165,13 @@ public class FaceDetecterView extends RelativeLayout {
     }
 
 //    public void takePic() {
-//        if (cameraHolder != null && !isTakePic) {
-//            isTakePic = true;
+//        if (cameraHolder != null && needTakePic) {
+//            needTakePic = false;
 //            cameraHolder.mCamera.takePicture(null, null, mJpeg);
-//        } else {
-//            ToastUtils.showToast("操作太频繁");
 //        }
 //
 //    }
-
+//
 //    private Camera.PictureCallback mJpeg = new Camera.PictureCallback() {
 //        @Override
 //        public void onPictureTaken(final byte[] data, Camera camera) {
@@ -194,8 +192,7 @@ public class FaceDetecterView extends RelativeLayout {
 //                            }
 //                        });
 //                        stopCamera();
-//                        startCamera();
-//                        isTakePic = false;
+////                        startCamera();
 //                    } catch (Exception e) {
 //                        e.printStackTrace();
 //                    }
@@ -214,7 +211,7 @@ public class FaceDetecterView extends RelativeLayout {
             isCanFlush = true;
             BaseApplication.getSystemTTS().stopSpeak();
             LogUtil.e(TAG, "接收成功信息");
-            if (mListener!= null){
+            if (mListener != null) {
 
                 mListener.detectedUser(event.getOpenDoorByFaceNetResultInfo());
             }
@@ -228,6 +225,11 @@ public class FaceDetecterView extends RelativeLayout {
             mListener.detecterFail(event.getDesc());
         } else if (event.getDesc().equalsIgnoreCase(DescEvent.DESC_FR_FROCUSE_EYE)) {
             BaseApplication.getSystemTTS().playText(event.getDesc());
+        } else if (event.getDesc().equalsIgnoreCase(DescEvent.DESC_TAKE_PIC)) {
+            if (needTakePic) {
+                needTakePic = false;
+                mListener.takePic(event.getCameraPreviewData());
+            }
         }
     }
 
@@ -249,7 +251,7 @@ public class FaceDetecterView extends RelativeLayout {
 
         void detecterFail(String st);
 
-        void takePic(Bitmap bitmap);
+        void takePic(CameraPreviewData data);
     }
 
 }