xuxiuxi
2017-08-01 21e08324c323d0c5d1e7cedc36323c554857a239
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java
@@ -3,29 +3,32 @@
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.drawable.ColorDrawable;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
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.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
@@ -33,39 +36,62 @@
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 com.luxand.FSDK.HTracker;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import cn.com.basic.face.dialog.AttenderRegisterSelectPhotoDialog;
import cn.com.basic.face.dialog.AttenderRegisterUploadPhotoDialog;
import cn.com.basic.face.dialog.VisitorRegisterSelectPhotoDialog;
import cn.com.basic.face.dialog.VisitorRegisterUploadPhotoDialog;
import cn.com.basic.face.discern.common.CommonVariables;
import cn.com.basic.face.discern.query.item.SurveillanceQueryItem;
import cn.com.basic.face.fragment.SurveillanceFragment;
import cn.com.basic.face.service.SurveillanceMng;
import cn.com.basic.face.util.FileUtil;
import cn.com.basic.face.util.NativeImg;
import cn.com.basic.face.util.TabNameUtil;
import cn.com.basic.face.fragment.AttendanceFragment;
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.SurveillanceFragment;
import cn.com.basic.face.fragment.VisitFragment;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import cn.com.basic.face.fragment.VisitorRegisterFragment;
import cn.com.basic.face.service.DeviceMng;
import cn.com.basic.face.service.InternetAccessThread;
import cn.com.basic.face.service.SurveillanceMng;
import cn.com.basic.face.service.sqlite.SurveillanceDao;
import cn.com.basic.face.service.sqlite.TestDao;
import cn.com.basic.face.service.sync.up.BaseSync;
import cn.com.basic.face.util.FileUtil;
import cn.com.basic.face.util.NativeImg;
import cn.com.basic.face.util.TabNameUtil;
public class MainActivity extends BaseActivity implements View.OnClickListener{
    private static MainActivity instance;
    private static TabLayout mTabLayout;
    private static ViewPager mViewPager;
    public static ViewPager mViewPager;
    public SQLiteDatabase db;
    private int internetAccessible = CommonVariables.InternetAccess.INTERNET_NOT_INITIALIZE;
    public int getInternetAccessible() {
        return internetAccessible;
    }
    public void setInternetAccessible(int internetAccessible) {
        this.internetAccessible = internetAccessible;
    }
    public static void selectPage(int pageNum) {
        mTabLayout.getTabAt(pageNum).select();
@@ -82,15 +108,20 @@
        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
        instance = this;
        internetAccessThread.start();
    }
    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]);
@@ -108,9 +139,11 @@
                tab.getCustomView().setSelected(true);
            }
        }
        myThread = new MyThread();
        myThread.start();
        if (CommonVariables.ID_CARD) {
            myThread = new MyThread();
            myThread.start();
        }
//        initSqlMap();
    }
    public static MainActivity getInstance() {
@@ -132,6 +165,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
@@ -249,33 +288,91 @@
        }
        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;
    public Preview mPreview;
    public ProcessImageAndDrawResults mDraw;
    private final String database = "Memory50.dat";
    private final String help_text = "Luxand Face Recognition\n\nJust tap any detected face and name it. The app will recognize this face further. For best results, hold the device at arm's length. You may slowly rotate the head for the app to memorize you at multiple views. The app can memorize several persons. If a face is not recognized, tap and name it again.\n\nThe SDK is available for mobile developers: www.luxand.com/facesdk";
    private final String help_text = "help";
    public static float sDensity = 1.0f;
    InternetAccessThread internetAccessThread = new InternetAccessThread();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initDb();
        db=openOrCreateDatabase("/data/data/com.bsk.zhangbo.demoforbsk/databases/aibatis_test_db", Context.MODE_PRIVATE, null);
        TestDao.getInstance().test();
        DeviceMng.getInstance().findDevice();
        if (CommonVariables.FACE_SERVER) {
            sDensity = getResources().getDisplayMetrics().scaledDensity;
            int res = FSDK.ActivateLibrary("bSB3NdbTnv/0eW/uhypSe6hDMtjZ76Sisw5NwcN+0sfahxOtoUW22el54e/M6cSG5/xsdVIorPgugbTIfoIIn7ltyw1QMSleNebVx/Xe8aRA8bP+aVDybjoWdW/0rDP9Pv7yqBzNXyuwjgsVhPB53VGP8oTirTSUP7PTzSwOEe0=");
            String s = FileUtil.getStringFromFile("/system/a");
            int res = FSDK.ActivateLibrary(s);
            if (res != FSDK.FSDKE_OK) {
                mIsFailed = true;
                showErrorAndClose("FaceSDK activation failed", res);
                showErrorAndClose("failed", res);
            } else {
                FSDK.Initialize();
                // Hide the window title (it is done in manifest too)
                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//z                requestWindowFeature(Window.FEATURE_NO_TITLE);
                //requestWindowFeature(Window.FEATURE_NO_TITLE);
                // Lock orientation
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
@@ -283,7 +380,7 @@
                // Camera layer and drawing layer
                mDraw = new ProcessImageAndDrawResults(this);
                mPreview = new Preview(this, mDraw);
                mDraw.mTracker = new FSDK.HTracker();
                mDraw.mTracker = new HTracker();
                String templatePath = this.getApplicationInfo().dataDir + "/" + database;
                if (FSDK.FSDKE_OK != FSDK.LoadTrackerMemoryFromFile(mDraw.mTracker, templatePath)) {
                    res = FSDK.CreateTracker(mDraw.mTracker);
@@ -294,10 +391,10 @@
                resetTrackerParameters();
                //this.getWindow().setBackgroundDrawable(new ColorDrawable()); //black background
                this.getWindow().setBackgroundDrawable(new ColorDrawable()); //black background
                //setContentView(mPreview); //creates MainActivity contents
                //addContentView(mDraw, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
                //addContentView(mDraw, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                // Menu
@@ -305,8 +402,33 @@
//                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 ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
//                addContentView(buttons, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
//                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();
//                String templatePath = this.getApplicationInfo().dataDir + "/" + database;
//                if (FSDK.FSDKE_OK != FSDK.LoadTrackerMemoryFromFile(mDraw.mTracker, templatePath)) {
//                    res = FSDK.CreateTracker(mDraw.mTracker);
//                    if (FSDK.FSDKE_OK != res) {
//                        showErrorAndClose("Error creating tracker", res);
//                    }
//                }
//                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));
            }
        }
    }
@@ -331,7 +453,7 @@
                            @Override public void onClick(DialogInterface dialogInterface, int j) {
                            }
                        })
                        .setCancelable(false) // cancel with button only
                        .setCancelable(false)
                        .show();
            }
        }
@@ -345,6 +467,10 @@
            String templatePath = this.getApplicationInfo().dataDir + "/" + database;
            FSDK.SaveTrackerMemoryToFile(mDraw.mTracker, templatePath);
        }
        VisitorRegisterUploadPhotoDialog.getInstance().hide();
        VisitorRegisterSelectPhotoDialog.getInstance().hide();
        AttenderRegisterSelectPhotoDialog.getInstance().hide();
        AttenderRegisterUploadPhotoDialog.getInstance().hide();
    }
    @Override
@@ -377,7 +503,7 @@
                    public void onClick(DialogInterface dialogInterface, int i) {
                    }
                })
                .setCancelable(false) // cancel with button only
                .setCancelable(false)
                .show();
    }
@@ -392,7 +518,6 @@
    private void pauseProcessingFrames() {
        mDraw.mStopping = 1;
        // It is essential to limit wait time, because mStopped will not be set to 0, if no frames are feeded to mDraw
        for (int i=0; i<100; ++i) {
            if (mDraw.mStopped != 0) break;
            try { Thread.sleep(10); }
@@ -404,6 +529,17 @@
        mDraw.mStopped = 0;
        mDraw.mStopping = 0;
    }
    @Override
    protected void onStop() {
        super.onStop();
        VisitorRegisterUploadPhotoDialog.getInstance().hide();
        VisitorRegisterSelectPhotoDialog.getInstance().hide();
        AttenderRegisterSelectPhotoDialog.getInstance().hide();
        AttenderRegisterUploadPhotoDialog.getInstance().hide();
        //Config.sqlMap.getDb().close();
//        db.close();
    }
}
@@ -414,7 +550,7 @@
// Draw graphics on top of the video
class ProcessImageAndDrawResults extends View {
    public FSDK.HTracker mTracker;
    public HTracker mTracker;
    final int MAX_FACES = 5;
    final FaceRectangle[] mFacePositions = new FaceRectangle[MAX_FACES];
@@ -472,12 +608,12 @@
        mPaintGreen.setStyle(Paint.Style.FILL);
        mPaintGreen.setColor(Color.GREEN);
        mPaintGreen.setTextSize(18 * MainActivity.sDensity);
        mPaintGreen.setTextAlign(Paint.Align.CENTER);
        mPaintGreen.setTextAlign(Align.CENTER);
        mPaintBlue = new Paint();
        mPaintBlue.setStyle(Paint.Style.FILL);
        mPaintBlue.setColor(Color.BLUE);
        mPaintBlue.setTextSize(18 * MainActivity.sDensity);
        mPaintBlue.setTextAlign(Paint.Align.CENTER);
        mPaintBlue.setTextAlign(Align.CENTER);
        mPaintBlueTransparent = new Paint();
        mPaintBlueTransparent.setStyle(Paint.Style.STROKE);
@@ -502,16 +638,13 @@
        if (mYUVData == null || mTouchedIndex != -1) {
            super.onDraw(canvas);
            return; //nothing to process or name is being entered now
            return;
        }
        int canvasWidth = canvas.getWidth();
        //int canvasHeight = canvas.getHeight();
        // Convert from YUV to RGB
        decodeYUV420SP(mRGBData, mYUVData, mImageWidth, mImageHeight);
        // Load image to FaceSDK
        FSDK.HImage Image = new FSDK.HImage();
        FSDK.FSDK_IMAGEMODE imagemode = new FSDK.FSDK_IMAGEMODE();
        imagemode.mode = FSDK.FSDK_IMAGEMODE.FSDK_IMAGE_COLOR_24BIT;
@@ -520,34 +653,36 @@
        FSDK.HImage RotatedImage = new FSDK.HImage();
        FSDK.CreateEmptyImage(RotatedImage);
//        FSDK.SaveImageToFile(Image, MainActivity.getInstance().getFilesDir().getAbsolutePath()+System.currentTimeMillis()+".jpg");
        //it is necessary to work with local variables (onDraw called not the time when mImageWidth,... being reassigned, so swapping mImageWidth and mImageHeight may be not safe)
        int ImageWidth = mImageWidth;
        //int ImageHeight = mImageHeight;
        if (rotated) {
            ImageWidth = mImageHeight;
            //ImageHeight = mImageWidth;
            FSDK.RotateImage90(Image, -1, RotatedImage);
        } else {
            FSDK.CopyImage(Image, RotatedImage);
        }
        FSDK.FreeImage(Image);
        // Save first frame to gallery to debug (e.g. rotation angle)
      /*
      if (!first_frame_saved) {
         first_frame_saved = true;
         String galleryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
         FSDK.SaveImageToFile(RotatedImage, galleryPath + "/first_frame.jpg"); //frame is rotated!
      }
      */
//        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);
//        FSDK.FreeImage(RotatedImage);
        System.out.println("face_count="+face_count[0]+", mImageWidth="+mImageWidth+", mImageHeight="+mImageHeight);
        faceLock.lock();
@@ -602,13 +737,25 @@
                nativeImg.size = nativeImg.image.length;
                SurveillanceQueryItem surveillanceQueryItem = new SurveillanceQueryItem();
                surveillanceQueryItem.setNativeImg(nativeImg);
                //surveillanceQueryItem.setBitmap(bitmap);
                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");
                surveillanceQueryItem.setRegisterOrCheckIn(CommonVariables.Surveillance.OFFLINE_SURVEILLANCE_ITEM_TYPE);
                surveillanceQueryItem.setCreateTime(new Date());
                bitmapList.add(surveillanceQueryItem);
                SurveillanceMng.getInstance().addBitmap(bitmapList, nativeImg.image, 0, CommonVariables.Camera.IN+"");
                if (BaseApplication.getInstance().networkAvailable()) {
                    SurveillanceMng.getInstance().addBitmap(bitmapList, nativeImg.image, 0, CommonVariables.Camera.IN+"", nativeImg.image);
                } else {
                    SurveillanceMng.getInstance().addOfflineBitmap(bitmapList, nativeImg.image, CommonVariables.Camera.IN+"");
                }
            }
        }
@@ -617,7 +764,6 @@
        int shift = (int)(22 * MainActivity.sDensity);
        // Mark and name faces
        for (int i=0; i<face_count[0]; ++i) {
            canvas.drawRect(mFacePositions[i].x1, mFacePositions[i].y1, mFacePositions[i].x2, mFacePositions[i].y2, mPaintBlueTransparent);
@@ -651,6 +797,10 @@
                long IDs[] = new long[MAX_FACES];
                for (int i=0; i<MAX_FACES; ++i) {
                    rects[i] = new FaceRectangle();
                    if(rects[i] == null) {
                        faceLock.unlock();
                        return true;
                    }
                    rects[i].x1 = mFacePositions[i].x1;
                    rects[i].y1 = mFacePositions[i].y1;
                    rects[i].x2 = mFacePositions[i].x2;
@@ -771,7 +921,7 @@
            mCamera.setPreviewDisplay(holder);
            // Preview callback used whenever new viewfinder frame is available
            mCamera.setPreviewCallback(new Camera.PreviewCallback() {
            mCamera.setPreviewCallback(new PreviewCallback() {
                public void onPreviewFrame(byte[] data, Camera camera) {
                    if ( (mDraw == null) || mFinished )
                        return;
@@ -844,10 +994,10 @@
      /**/
        // choose preview size closer to 640x480 for optimal performance
        List<Camera.Size> supportedSizes = parameters.getSupportedPreviewSizes();
        List<Size> supportedSizes = parameters.getSupportedPreviewSizes();
        int width = 0;
        int height = 0;
        for (Camera.Size s: supportedSizes) {
        for (Size s: supportedSizes) {
            if ((width - 640)*(width - 640) + (height - 480)*(height - 480) >
                    (s.width - 640)*(s.width - 640) + (s.height - 480)*(s.height - 480)) {
                width = s.width;
@@ -874,7 +1024,7 @@
    }
    private void makeResizeForCameraAspect(float cameraAspectRatio){
        ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
        LayoutParams layoutParams = this.getLayoutParams();
        int matchParentWidth = this.getWidth();
        int newHeight = (int)(matchParentWidth/cameraAspectRatio);
        if (newHeight != layoutParams.height) {
@@ -885,4 +1035,3 @@
        }
    }
} // end of Preview class