xuxiuxi
2017-07-19 aa8353fe661ee9d3bac0538070458a30af28dc41
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java
@@ -1,32 +1,37 @@
package cn.com.basic.face.base;
import android.Manifest;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ImageFormat;
import android.graphics.Paint;
import android.graphics.drawable.ColorDrawable;
import android.graphics.PorterDuff;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.os.Handler;
import android.support.design.widget.TabLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
@@ -34,13 +39,16 @@
import android.widget.TextView;
import android.widget.Toast;
import com.awsle.aibatis.client.SqlMapClientBuilder;
import com.bsk.zhangbo.demoforbsk.R;
import com.luxand.FSDK;
import cn.com.basic.face.discern.common.CommonVariables;
import cn.com.basic.face.discern.query.item.SurveillanceQueryItem;
import cn.com.basic.face.fragment.AttenderRegisterFragment;
import cn.com.basic.face.fragment.SurveillanceFragment;
import cn.com.basic.face.service.SurveillanceMng;
import cn.com.basic.face.service.sqlite.TestDao;
import cn.com.basic.face.util.FileUtil;
import cn.com.basic.face.util.NativeImg;
import cn.com.basic.face.util.TabNameUtil;
@@ -48,13 +56,14 @@
import cn.com.basic.face.fragment.CheckInFragment;
import cn.com.basic.face.fragment.DeviceFragment;
import cn.com.basic.face.fragment.PhoneCallFragment;
import cn.com.basic.face.fragment.RegisterFragment;
import cn.com.basic.face.fragment.VisitorRegisterFragment;
import cn.com.basic.face.fragment.VisitFragment;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -66,7 +75,7 @@
    private static MainActivity instance;
    private static TabLayout mTabLayout;
    private static ViewPager mViewPager;
    public static ViewPager mViewPager;
    public static void selectPage(int pageNum) {
        mTabLayout.getTabAt(pageNum).select();
@@ -85,13 +94,17 @@
        instance = this;
    }
    public MyFragmentPagerAdapter myFragmentPagerAdapter;
    @Override
    public void initData() {
        List<String> tabNamesList = Arrays.asList(TabNameUtil.tabNames);
        int[] tabIcons = TabNameUtil.tabIcons;
        MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),MainActivity.this);
        myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),MainActivity.this);
        myFragmentPagerAdapter.addFragment(SurveillanceFragment.getInstance(), tabNamesList.get(0),tabIcons[0]);
        myFragmentPagerAdapter.addFragment(RegisterFragment.getInstance(), tabNamesList.get(1),tabIcons[1]);
        myFragmentPagerAdapter.addFragment(VisitorRegisterFragment.getInstance(), tabNamesList.get(1),tabIcons[1]);
//        myFragmentPagerAdapter.addFragment(AttenderRegisterFragment.getInstance(), tabNamesList.get(1),tabIcons[1]);
//        myFragmentPagerAdapter.addFragment(RegisterFragment.getInstance(), tabNamesList.get(1),tabIcons[1]);
        myFragmentPagerAdapter.addFragment(CheckInFragment.getInstance(), tabNamesList.get(2),tabIcons[2]);
        myFragmentPagerAdapter.addFragment(PhoneCallFragment.getInstance(), tabNamesList.get(3),tabIcons[3]);
        myFragmentPagerAdapter.addFragment(VisitFragment.getInstance(), tabNamesList.get(4),tabIcons[4]);
@@ -109,9 +122,12 @@
                tab.getCustomView().setSelected(true);
            }
        }
        myThread = new MyThread();
        myThread.start();
        if (CommonVariables.ID_CARD) {
            myThread = new MyThread();
            myThread.start();
        }
        initDb();
        initSqlMap();
    }
    public static MainActivity getInstance() {
@@ -133,6 +149,12 @@
            mFragments.add(fragment);
            mFragmentTitles.add(title);
            mFragmentIcons.add(drawable);
        }
        public void setFragment(int index, Fragment fragment) {
            mFragments.remove(index);
            mFragments.add(index, fragment);
            notifyDataSetChanged();
        }
        @Override
@@ -250,7 +272,58 @@
        }
        return true;
    }
/////////////////////////////
    /**
     * 初始化sqlMap
     */
    private void initSqlMap() {
        Config.sqlMap = SqlMapClientBuilder.buildSqlMapClient(this.getClass().getResourceAsStream("/assets/config/SqlMapConfig.xml")).init(this);
    }
    /**
     * 初始化数据
     */
    private void initDb() {
        InputStream dbIn = getClass().getResourceAsStream(Config.DB);
        FileOutputStream out = null;
        File z = null;
        try {
            byte[] bytes = new byte[1024];
            z = new File(Config.APPDBPATH);
            if(!z.exists()){
                z.mkdirs();
            }
            //判断数据库是否存在
            z = new File(Config.APPDB);
            if (!z.exists()) {
                out = new FileOutputStream(z);
                int len = 0;
                while((len = dbIn.read(bytes))!= -1){
                    out.write(bytes,0,len);
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null)
                    out.close();
                if (dbIn != null)
                    dbIn.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            //对数据库文件权限
            Runtime.getRuntime().exec("chmod 7755 " + z.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
        //Log.d(Config.APPTAG, "初始化数据完成!");
    }
    ////////////////////////////////////////////////////////
    private boolean mIsFailed = false;
@@ -274,6 +347,7 @@
            } else {
                FSDK.Initialize();
                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                mDraw = new ProcessImageAndDrawResults(this);
                mPreview = new Preview(this, mDraw);
                mDraw.mTracker = new FSDK.HTracker();
@@ -285,6 +359,16 @@
                    }
                }
                resetTrackerParameters();
                //setContentView(mPreview); //creates MainActivity contents
                //addContentView(mDraw, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                // Menu
//                LayoutInflater inflater = (LayoutInflater)this.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
//                View buttons = inflater.inflate(R.layout.bottom_menu, null );
//                buttons.findViewById(R.id.helpButton).setOnClickListener(this);
//                buttons.findViewById(R.id.clearButton).setOnClickListener(this);
//                addContentView(buttons, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
            }
        }
    }
@@ -381,6 +465,7 @@
        mDraw.mStopped = 0;
        mDraw.mStopping = 0;
    }
}
@@ -467,8 +552,7 @@
        first_frame_saved = false;
    }
    @Override
    protected void onDraw(Canvas canvas) {
    public void onDraw(Canvas canvas) {
        if (mStopping == 1) {
            mStopped = 1;
            super.onDraw(canvas);
@@ -499,12 +583,29 @@
        } else {
            FSDK.CopyImage(Image, RotatedImage);
        }
//        FSDK.TFacePosition fp11 = new FSDK.TFacePosition();
//        FSDK.DetectFace(RotatedImage, fp11);
        FSDK.FSDK_FaceTemplate face = new FSDK.FSDK_FaceTemplate();
        int result = FSDK.GetFaceTemplate(RotatedImage, face);
        if (result == FSDK.FSDKE_OK) {
        }
        String surveillancePhotoName11 = "/storage/sdcard1/"+System.currentTimeMillis()+".jpg";
        FSDK.SaveImageToFile(Image, surveillancePhotoName11);
        FSDK.FreeImage(Image);
        long IDs[] = new long[MAX_FACES];
        long face_count[] = new long[1];
        FSDK.FeedFrame(mTracker, 0, RotatedImage, face_count, IDs);
        System.out.println("face_count="+face_count[0]+", mImageWidth="+mImageWidth+", mImageHeight="+mImageHeight);
        faceLock.lock();
@@ -682,6 +783,119 @@
            }
        }
    }
    public void startFaceDetection() {
        if (mStopping == 1) {
            mStopped = 1;
            return;
        }
        if (mYUVData == null || mTouchedIndex != -1) {
            return;
        }
        decodeYUV420SP(mRGBData, mYUVData, mImageWidth, mImageHeight);
        FSDK.HImage Image = new FSDK.HImage();
        FSDK.FSDK_IMAGEMODE imagemode = new FSDK.FSDK_IMAGEMODE();
        imagemode.mode = FSDK.FSDK_IMAGEMODE.FSDK_IMAGE_COLOR_24BIT;
        FSDK.LoadImageFromBuffer(Image, mRGBData, mImageWidth, mImageHeight, mImageWidth*3, imagemode);
        FSDK.MirrorImage(Image, false);
        FSDK.HImage RotatedImage = new FSDK.HImage();
        FSDK.CreateEmptyImage(RotatedImage);
        int ImageWidth = mImageWidth;
        if (rotated) {
            ImageWidth = mImageHeight;
            FSDK.RotateImage90(Image, -1, RotatedImage);
        } else {
            FSDK.CopyImage(Image, RotatedImage);
        }
        //String surveillancePhotoName11 = "/storage/sdcard1/"+System.currentTimeMillis()+".jpg";
        //FSDK.SaveImageToFile(Image, surveillancePhotoName11);
        FSDK.FreeImage(Image);
        long IDs[] = new long[MAX_FACES];
        long face_count[] = new long[1];
        FSDK.FeedFrame(mTracker, 0, RotatedImage, face_count, IDs);
        System.out.println("face_count="+face_count[0]+", mImageWidth="+mImageWidth+", mImageHeight="+mImageHeight);
        faceLock.lock();
        for (int i=0; i<MAX_FACES; ++i) {
            mFacePositions[i] = new FaceRectangle();
            mFacePositions[i].x1 = 0;
            mFacePositions[i].y1 = 0;
            mFacePositions[i].x2 = 0;
            mFacePositions[i].y2 = 0;
            mIDs[i] = IDs[i];
        }
        for (int i = 0; i < (int)face_count[0]; ++i) {
            FSDK.FSDK_Features Eyes = new FSDK.FSDK_Features();
            FSDK.GetTrackerEyes(mTracker, 0, mIDs[i], Eyes);
            GetFaceFrame(Eyes, mFacePositions[i]);
        }
        if ((int)face_count[0] > 0) {
            FSDK.HImage img2 = new FSDK.HImage();
            FSDK.CreateEmptyImage(img2);
            FSDK.TFacePosition fp = new FSDK.TFacePosition();
            FSDK.DetectFace(RotatedImage, fp);
            int x1 = (int)(fp.xc - 1.2*fp.w/2);
            int y1 = (int)(fp.yc - 1.4*fp.w/2);
            int x2 = (int)(fp.xc + 1.2*fp.w/2);
            int y2 = (int)(fp.yc + 1.4*fp.w/2);
            FSDK.CopyRect(RotatedImage, x1, y1, x2, y2, img2);
            System.out.println("face_count="+face_count[0]);
            String surveillancePhotoName = MainActivity.getInstance().getFilesDir().getAbsolutePath()+System.currentTimeMillis()+".jpg";
            FSDK.SaveImageToFile(img2, surveillancePhotoName);
            List bitmapList = new ArrayList();
            for (int i = 0; i < 1; i++) {
                NativeImg nativeImg = new NativeImg();
                nativeImg.image = FileUtil.readFile(new File(surveillancePhotoName));
                nativeImg.size = nativeImg.image.length;
                SurveillanceQueryItem surveillanceQueryItem = new SurveillanceQueryItem();
                surveillanceQueryItem.setNativeImg(nativeImg);
                nativeImg.st_track_id = 1;
                surveillanceQueryItem.setStTrackId(nativeImg.st_track_id);
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inMutable = true;
                Bitmap bmp = BitmapFactory.decodeByteArray(nativeImg.image, 0, nativeImg.image.length, options);
                Canvas canvas1 = new Canvas(bmp);
                surveillanceQueryItem.setBitmap(bmp);
                surveillanceQueryItem.setWidth("100");
                surveillanceQueryItem.setHeight("100");
                bitmapList.add(surveillanceQueryItem);
                SurveillanceMng.getInstance().addBitmap(bitmapList, nativeImg.image, 0, CommonVariables.Camera.IN+"", nativeImg.image);
            }
        }
        FSDK.FreeImage(RotatedImage);
        faceLock.unlock();
    }
}
class Preview extends SurfaceView implements SurfaceHolder.Callback {
@@ -699,8 +913,11 @@
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        //new MyThread1().start();
    }
    int count = 0;
    public void surfaceCreated(SurfaceHolder holder) {
        mFinished = false;
@@ -714,21 +931,26 @@
                frontCameraFound = true;
            }
        }
        //If authorisation not granted for camera
        if (ContextCompat.checkSelfPermission(MainActivity.getInstance(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
            //ask for authorisation
            ActivityCompat.requestPermissions(MainActivity.getInstance(), new String[]{Manifest.permission.CAMERA}, 50);
        if (frontCameraFound) {
            mCamera = Camera.open(cameraId);
        } else {
            mCamera = Camera.open();
        }
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.setPreviewCallback(new Camera.PreviewCallback() {
                public void onPreviewFrame(byte[] data, Camera camera) {
            mCamera.addCallbackBuffer(new byte[((640 * 480) * ImageFormat.getBitsPerPixel(ImageFormat.NV21)) / 8]);
            //mCamera.setPreviewCallback
            mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
                public void onPreviewFrame(final byte[] data, final Camera camera) {
                    mCamera.addCallbackBuffer(data);
                    if ( (mDraw == null) || mFinished )
                        return;
                    if (mDraw.mYUVData == null) {
                        Camera.Parameters params = camera.getParameters();
                        mDraw.mImageWidth = params.getPreviewSize().width;
@@ -785,6 +1007,7 @@
        List<Camera.Size> supportedSizes = parameters.getSupportedPreviewSizes();
        int width = 0;
        int height = 0;
        System.out.println("surfaceChanged");
        for (Camera.Size s: supportedSizes) {
            if ((width - 640)*(width - 640) + (height - 480)*(height - 480) >
                    (s.width - 640)*(s.width - 640) + (s.height - 480)*(s.height - 480)) {
@@ -820,5 +1043,6 @@
            this.invalidate();
        }
    }
}