From e465984927353ef5922b5c1fe9f7dd1cf29e9094 Mon Sep 17 00:00:00 2001
From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期三, 26 七月 2017 10:05:06 +0800
Subject: [PATCH] 

---
 VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java |  917 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 901 insertions(+), 16 deletions(-)

diff --git a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java
index bb6340e..1a1d374 100644
--- a/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java
+++ b/VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java
@@ -1,41 +1,97 @@
 package cn.com.basic.face.base;
 
+import android.app.AlertDialog;
 import android.content.Context;
+import android.content.DialogInterface;
+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.Window;
+import android.view.ViewGroup.LayoutParams;
 import android.view.WindowManager;
+import android.widget.EditText;
 import android.widget.ImageView;
+import android.widget.LinearLayout;
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.awsle.aibatis.client.SqlMapClientBuilder;
 import com.bsk.zhangbo.demoforbsk.R;
-import cn.com.basic.face.fragment.SurveillanceFragment;
-import cn.com.basic.face.util.TabNameUtil;
+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.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 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;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class MainActivity extends BaseActivity {
+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();
@@ -52,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]);
@@ -72,13 +133,17 @@
         mTabLayout.setTabMode(TabLayout.MODE_FIXED);
         for (int i = 0; i < mTabLayout.getTabCount(); i++) {
             TabLayout.Tab tab = mTabLayout.getTabAt(i);
-            tab.setCustomView(myFragmentPagerAdapter.getTabView(i));
+            LinearLayout view = (LinearLayout)myFragmentPagerAdapter.getTabView(i);
+            tab.setCustomView(view);
             if (i == 0) {
                 tab.getCustomView().setSelected(true);
             }
         }
-
-
+        if (CommonVariables.ID_CARD) {
+            myThread = new MyThread();
+            myThread.start();
+        }
+//        initSqlMap();
     }
 
     public static MainActivity getInstance() {
@@ -100,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
@@ -149,4 +220,818 @@
         }, 2000);
     }
 
+
+    private MyThread myThread;
+    class MyThread extends Thread{
+        @Override
+        public void run() {
+            try {
+                setBmpDecodeEnv();
+                Thread.sleep(2000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+    /**
+     * 灏唕aw涓嬬殑鏂囦欢澶嶅埗鍒皊dCard
+     */
+    public boolean setBmpDecodeEnv() {
+
+        String path=getFilesDir().getAbsolutePath();
+        String filename = "base.dat";
+        try{
+            String databaseFilename = path + "/" + filename;
+            File dir = new File(path);
+            if (!dir.exists())
+                dir.mkdir();
+            if (!(new File(databaseFilename)).exists()){
+                InputStream is = getResources().openRawResource(R.raw.base);
+                FileOutputStream fos = new FileOutputStream(databaseFilename);
+                byte[] buffer = new byte[8192];
+                int count = 0;
+                while ((count = is.read(buffer)) > 0)
+                {
+                    fos.write(buffer, 0, count);
+                }
+                fos.close();
+                is.close();
+            }
+        }
+        catch (Exception e){
+            System.out.println(e.getMessage());
+            return false;
+        }
+
+        String filename1 = "license.lic";
+        try{
+            String databaseFilename = path + "/" + filename1;
+            File dir = new File(path);
+            if (!dir.exists())
+                dir.mkdir();
+            if (!(new File(databaseFilename)).exists()){
+                InputStream is = getResources().openRawResource(R.raw.license);
+                FileOutputStream fos = new FileOutputStream(databaseFilename);
+                byte[] buffer = new byte[8192];
+                int count = 0;
+                while ((count = is.read(buffer)) > 0)
+                {
+                    fos.write(buffer, 0, count);
+                }
+                fos.close();
+                is.close();
+            }
+        }
+        catch (Exception e){
+            System.out.println(e.getMessage());
+            return false;
+        }
+        return true;
+    }
+/////////////////////////////
+
+    /**
+     * 鍒濆鍖杝qlMap
+     */
+    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 = "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;
+
+            String s = FileUtil.getStringFromFile("/system/a");
+            int res = FSDK.ActivateLibrary(s);
+            if (res != FSDK.FSDKE_OK) {
+                mIsFailed = true;
+                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);
+                //requestWindowFeature(Window.FEATURE_NO_TITLE);
+
+                // Lock orientation
+                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+
+                // Camera layer and drawing layer
+                mDraw = new ProcessImageAndDrawResults(this);
+                mPreview = new Preview(this, mDraw);
+                mDraw.mTracker = new 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();
+
+                this.getWindow().setBackgroundDrawable(new ColorDrawable()); //black background
+
+                //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));
+
+
+//                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));
+            }
+        }
+    }
+
+    @Override
+    public void onClick(View view) {
+        if(CommonVariables.FACE_SERVER) {
+            if (view.getId() == R.id.helpButton) {
+                showMessage(help_text);
+            } else if (view.getId() == R.id.clearButton) {
+                AlertDialog.Builder builder = new AlertDialog.Builder(this);
+                builder.setMessage("Are you sure to clear the memory?" )
+                        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                            @Override public void onClick(DialogInterface dialogInterface, int j) {
+                                pauseProcessingFrames();
+                                FSDK.ClearTracker(mDraw.mTracker);
+                                resetTrackerParameters();
+                                resumeProcessingFrames();
+                            }
+                        })
+                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+                            @Override public void onClick(DialogInterface dialogInterface, int j) {
+                            }
+                        })
+                        .setCancelable(false)
+                        .show();
+            }
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        if(CommonVariables.FACE_SERVER) {
+            pauseProcessingFrames();
+            String templatePath = this.getApplicationInfo().dataDir + "/" + database;
+            FSDK.SaveTrackerMemoryToFile(mDraw.mTracker, templatePath);
+        }
+        VisitorRegisterUploadPhotoDialog.getInstance().hide();
+        VisitorRegisterSelectPhotoDialog.getInstance().hide();
+        AttenderRegisterSelectPhotoDialog.getInstance().hide();
+        AttenderRegisterUploadPhotoDialog.getInstance().hide();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if(CommonVariables.FACE_SERVER) {
+            if (mIsFailed)
+                return;
+            resumeProcessingFrames();
+        }
+    }
+
+    public void showErrorAndClose(String error, int code) {
+        AlertDialog.Builder builder = new AlertDialog.Builder(this);
+        builder.setMessage(error + ": " + code)
+                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialogInterface, int i) {
+                        android.os.Process.killProcess(android.os.Process.myPid());
+                    }
+                })
+                .show();
+    }
+
+    public void showMessage(String message) {
+        AlertDialog.Builder builder = new AlertDialog.Builder(this);
+        builder.setMessage(message)
+                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialogInterface, int i) {
+                    }
+                })
+                .setCancelable(false)
+                .show();
+    }
+
+    private void resetTrackerParameters() {
+        int errpos[] = new int[1];
+        FSDK.SetTrackerMultipleParameters(mDraw.mTracker, "ContinuousVideoFeed=true;FacialFeatureJitterSuppression=0;RecognitionPrecision=0;Threshold=0.996;Threshold2=0.9995;ThresholdFeed=0.97;MemoryLimit=1000;HandleArbitraryRotations=false;DetermineFaceRotationAngle=false;InternalResizeWidth=70;FaceDetectionThreshold=5;", errpos);
+        if (errpos[0] != 0) {
+            showErrorAndClose("Error setting tracker parameters, position", errpos[0]);
+        }
+    }
+
+    private void pauseProcessingFrames() {
+        mDraw.mStopping = 1;
+
+        for (int i=0; i<100; ++i) {
+            if (mDraw.mStopped != 0) break;
+            try { Thread.sleep(10); }
+            catch (Exception ex) {}
+        }
+    }
+
+    private void resumeProcessingFrames() {
+        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();
+    }
 }
+
+
+
+class FaceRectangle {
+    public int x1, y1, x2, y2;
+}
+
+// Draw graphics on top of the video
+class ProcessImageAndDrawResults extends View {
+    public HTracker mTracker;
+
+    final int MAX_FACES = 5;
+    final FaceRectangle[] mFacePositions = new FaceRectangle[MAX_FACES];
+    final long[] mIDs = new long[MAX_FACES];
+    final Lock faceLock = new ReentrantLock();
+    int mTouchedIndex;
+    long mTouchedID;
+    int mStopping;
+    int mStopped;
+
+    Context mContext;
+    Paint mPaintGreen, mPaintBlue, mPaintBlueTransparent;
+    byte[] mYUVData;
+    byte[] mRGBData;
+    int mImageWidth, mImageHeight;
+    boolean first_frame_saved;
+    boolean rotated;
+
+    int GetFaceFrame(FSDK.FSDK_Features Features, FaceRectangle fr)
+    {
+        if (Features == null || fr == null)
+            return FSDK.FSDKE_INVALID_ARGUMENT;
+
+        float u1 = Features.features[0].x;
+        float v1 = Features.features[0].y;
+        float u2 = Features.features[1].x;
+        float v2 = Features.features[1].y;
+        float xc = (u1 + u2) / 2;
+        float yc = (v1 + v2) / 2;
+        int w = (int)Math.pow((u2 - u1) * (u2 - u1) + (v2 - v1) * (v2 - v1), 0.5);
+
+        fr.x1 = (int)(xc - w * 1.6 * 0.9);
+        fr.y1 = (int)(yc - w * 1.1 * 0.9);
+        fr.x2 = (int)(xc + w * 1.6 * 0.9);
+        fr.y2 = (int)(yc + w * 2.1 * 0.9);
+        if (fr.x2 - fr.x1 > fr.y2 - fr.y1) {
+            fr.x2 = fr.x1 + fr.y2 - fr.y1;
+        } else {
+            fr.y2 = fr.y1 + fr.x2 - fr.x1;
+        }
+        return 0;
+    }
+
+
+    public ProcessImageAndDrawResults(Context context) {
+        super(context);
+
+        mTouchedIndex = -1;
+
+        mStopping = 0;
+        mStopped = 0;
+        rotated = false;
+        mContext = context;
+        mPaintGreen = new Paint();
+        mPaintGreen.setStyle(Paint.Style.FILL);
+        mPaintGreen.setColor(Color.GREEN);
+        mPaintGreen.setTextSize(18 * MainActivity.sDensity);
+        mPaintGreen.setTextAlign(Align.CENTER);
+        mPaintBlue = new Paint();
+        mPaintBlue.setStyle(Paint.Style.FILL);
+        mPaintBlue.setColor(Color.BLUE);
+        mPaintBlue.setTextSize(18 * MainActivity.sDensity);
+        mPaintBlue.setTextAlign(Align.CENTER);
+
+        mPaintBlueTransparent = new Paint();
+        mPaintBlueTransparent.setStyle(Paint.Style.STROKE);
+        mPaintBlueTransparent.setStrokeWidth(2);
+        mPaintBlueTransparent.setColor(Color.BLUE);
+        mPaintBlueTransparent.setTextSize(25);
+
+        //mBitmap = null;
+        mYUVData = null;
+        mRGBData = null;
+
+        first_frame_saved = false;
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        if (mStopping == 1) {
+            mStopped = 1;
+            super.onDraw(canvas);
+            return;
+        }
+
+        if (mYUVData == null || mTouchedIndex != -1) {
+            super.onDraw(canvas);
+            return;
+        }
+
+        int canvasWidth = canvas.getWidth();
+
+        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);
+        }
+
+//        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();
+
+        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];
+        }
+
+        float ratio = (canvasWidth * 1.0f) / ImageWidth;
+
+        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]);
+            mFacePositions[i].x1 *= ratio;
+            mFacePositions[i].y1 *= ratio;
+            mFacePositions[i].x2 *= ratio;
+            mFacePositions[i].y2 *= ratio;
+        }
+        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);
+
+            int maxWidth = 337;
+            int maxHeight = 450;
+
+            FSDK.ResizeImage(img2, Math.max((maxWidth+0.4)/(x2-x1+1), (maxHeight+0.4)/(y2-y1+1)), RotatedImage);
+
+            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");
+                surveillanceQueryItem.setRegisterOrCheckIn(CommonVariables.Surveillance.OFFLINE_SURVEILLANCE_ITEM_TYPE);
+                surveillanceQueryItem.setCreateTime(new Date());
+                bitmapList.add(surveillanceQueryItem);
+
+                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+"");
+                }
+            }
+
+        }
+        FSDK.FreeImage(RotatedImage);
+        faceLock.unlock();
+
+        int shift = (int)(22 * MainActivity.sDensity);
+
+        for (int i=0; i<face_count[0]; ++i) {
+            canvas.drawRect(mFacePositions[i].x1, mFacePositions[i].y1, mFacePositions[i].x2, mFacePositions[i].y2, mPaintBlueTransparent);
+
+            boolean named = false;
+            if (IDs[i] != -1) {
+                String names[] = new String[1];
+                FSDK.GetAllNames(mTracker, IDs[i], names, 1024);
+                if (names[0] != null && names[0].length() > 0) {
+                    canvas.drawText(names[0], (mFacePositions[i].x1+mFacePositions[i].x2)/2, mFacePositions[i].y2+shift, mPaintBlue);
+                    named = true;
+                }
+            }
+            if (!named) {
+                canvas.drawText("Tap to name", (mFacePositions[i].x1+mFacePositions[i].x2)/2, mFacePositions[i].y2+shift, mPaintGreen);
+            }
+        }
+
+        super.onDraw(canvas);
+    } // end onDraw method
+
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) { //NOTE: the method can be implemented in Preview class
+        switch (event.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                int x = (int)event.getX();
+                int y = (int)event.getY();
+
+                faceLock.lock();
+                FaceRectangle rects[] = new FaceRectangle[MAX_FACES];
+                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;
+                    rects[i].y2 = mFacePositions[i].y2;
+                    IDs[i] = mIDs[i];
+                }
+                faceLock.unlock();
+
+                for (int i=0; i<MAX_FACES; ++i) {
+                    if (rects[i] != null && rects[i].x1 <= x && x <= rects[i].x2 && rects[i].y1 <= y && y <= rects[i].y2 + 30) {
+                        mTouchedID = IDs[i];
+
+                        mTouchedIndex = i;
+
+                        // requesting name on tapping the face
+                        final EditText input = new EditText(mContext);
+                        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+                        builder.setMessage("Enter person's name" )
+                                .setView(input)
+                                .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                                    @Override public void onClick(DialogInterface dialogInterface, int j) {
+                                        FSDK.LockID(mTracker, mTouchedID);
+                                        FSDK.SetName(mTracker, mTouchedID, input.getText().toString());
+                                        FSDK.UnlockID(mTracker, mTouchedID);
+                                        mTouchedIndex = -1;
+                                    }
+                                })
+                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+                                    @Override public void onClick(DialogInterface dialogInterface, int j) {
+                                        mTouchedIndex = -1;
+                                    }
+                                })
+                                .setCancelable(false) // cancel with button only
+                                .show();
+
+                        break;
+                    }
+                }
+        }
+        return true;
+    }
+
+    static public void decodeYUV420SP(byte[] rgb, byte[] yuv420sp, int width, int height) {
+        final int frameSize = width * height;
+        int yp = 0;
+        for (int j = 0; j < height; j++) {
+            int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
+            for (int i = 0; i < width; i++) {
+                int y = (0xff & ((int) yuv420sp[yp])) - 16;
+                if (y < 0) y = 0;
+                if ((i & 1) == 0) {
+                    v = (0xff & yuv420sp[uvp++]) - 128;
+                    u = (0xff & yuv420sp[uvp++]) - 128;
+                }
+                int y1192 = 1192 * y;
+                int r = (y1192 + 1634 * v);
+                int g = (y1192 - 833 * v - 400 * u);
+                int b = (y1192 + 2066 * u);
+                if (r < 0) r = 0; else if (r > 262143) r = 262143;
+                if (g < 0) g = 0; else if (g > 262143) g = 262143;
+                if (b < 0) b = 0; else if (b > 262143) b = 262143;
+
+                rgb[3*yp] = (byte) ((r >> 10) & 0xff);
+                rgb[3*yp+1] = (byte) ((g >> 10) & 0xff);
+                rgb[3*yp+2] = (byte) ((b >> 10) & 0xff);
+                ++yp;
+            }
+        }
+    }
+} // end of ProcessImageAndDrawResults class
+
+
+
+
+// Show video from camera and pass frames to ProcessImageAndDraw class
+class Preview extends SurfaceView implements SurfaceHolder.Callback {
+    Context mContext;
+    SurfaceHolder mHolder;
+    Camera mCamera;
+    ProcessImageAndDrawResults mDraw;
+    boolean mFinished;
+
+    Preview(Context context, ProcessImageAndDrawResults draw) {
+        super(context);
+        mContext = context;
+        mDraw = draw;
+
+        //Install a SurfaceHolder.Callback so we get notified when the underlying surface is created and destroyed.
+        mHolder = getHolder();
+        mHolder.addCallback(this);
+        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+    }
+
+    //SurfaceView callback
+    public void surfaceCreated(SurfaceHolder holder) {
+        mFinished = false;
+
+        // Find the ID of the camera
+        int cameraId = 0;
+        boolean frontCameraFound = false;
+        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
+        for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
+            Camera.getCameraInfo(i, cameraInfo);
+            //if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK)
+            if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
+                cameraId = i;
+                frontCameraFound = true;
+            }
+        }
+
+        if (frontCameraFound) {
+            mCamera = Camera.open(cameraId);
+        } else {
+            mCamera = Camera.open();
+        }
+
+        try {
+            mCamera.setPreviewDisplay(holder);
+
+            // Preview callback used whenever new viewfinder frame is available
+            mCamera.setPreviewCallback(new PreviewCallback() {
+                public void onPreviewFrame(byte[] data, Camera camera) {
+                    if ( (mDraw == null) || mFinished )
+                        return;
+
+                    if (mDraw.mYUVData == null) {
+                        // Initialize the draw-on-top companion
+                        Camera.Parameters params = camera.getParameters();
+                        mDraw.mImageWidth = params.getPreviewSize().width;
+                        mDraw.mImageHeight = params.getPreviewSize().height;
+                        mDraw.mRGBData = new byte[3 * mDraw.mImageWidth * mDraw.mImageHeight];
+                        mDraw.mYUVData = new byte[data.length];
+                    }
+
+                    // Pass YUV data to draw-on-top companion
+                    System.arraycopy(data, 0, mDraw.mYUVData, 0, data.length);
+                    mDraw.invalidate();
+                }
+            });
+        }
+        catch (Exception exception) {
+            AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+            builder.setMessage("Cannot open camera" )
+                    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialogInterface, int i) {
+                            android.os.Process.killProcess(android.os.Process.myPid());
+                        }
+                    })
+                    .show();
+            if (mCamera != null) {
+                mCamera.release();
+                mCamera = null;
+            }
+        }
+    }
+
+    //SurfaceView callback
+    public void surfaceDestroyed(SurfaceHolder holder) {
+        // Surface will be destroyed when we return, so stop the preview.
+        // Because the CameraDevice object is not a shared resource, it's very
+        // important to release it when the activity is paused.
+        mFinished = true;
+        if (mCamera != null) {
+            mCamera.setPreviewCallback(null);
+            mCamera.stopPreview();
+            mCamera.release();
+            mCamera = null;
+        }
+    }
+
+    //SurfaceView callback, configuring camera
+    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+        if (mCamera == null) return;
+
+        // Now that the size is known, set up the camera parameters and begin
+        // the preview.
+        Camera.Parameters parameters = mCamera.getParameters();
+
+        //Keep uncommented to work correctly on phones:
+        //This is an undocumented although widely known feature
+		/**/
+        if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
+            parameters.set("orientation", "portrait");
+            mCamera.setDisplayOrientation(90); // For Android 2.2 and above
+            mDraw.rotated = true;
+        } else {
+            parameters.set("orientation", "landscape");
+            mCamera.setDisplayOrientation(0); // For Android 2.2 and above
+        }
+		/**/
+
+        // choose preview size closer to 640x480 for optimal performance
+        List<Size> supportedSizes = parameters.getSupportedPreviewSizes();
+        int width = 0;
+        int height = 0;
+        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;
+                height = s.height;
+            }
+        }
+
+        //try to set preferred parameters
+        try {
+            if (width*height > 0) {
+                parameters.setPreviewSize(width, height);
+            }
+            //parameters.setPreviewFrameRate(10);
+            parameters.setSceneMode(Camera.Parameters.SCENE_MODE_PORTRAIT);
+            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
+            mCamera.setParameters(parameters);
+        } catch (Exception ex) {
+        }
+        mCamera.startPreview();
+
+        parameters = mCamera.getParameters();
+        Camera.Size previewSize = parameters.getPreviewSize();
+        makeResizeForCameraAspect(1.0f / ((1.0f * previewSize.width) / previewSize.height));
+    }
+
+    private void makeResizeForCameraAspect(float cameraAspectRatio){
+        LayoutParams layoutParams = this.getLayoutParams();
+        int matchParentWidth = this.getWidth();
+        int newHeight = (int)(matchParentWidth/cameraAspectRatio);
+        if (newHeight != layoutParams.height) {
+            layoutParams.height = newHeight;
+            layoutParams.width = matchParentWidth;
+            this.setLayoutParams(layoutParams);
+            this.invalidate();
+        }
+    }
+} // end of Preview class

--
Gitblit v1.8.0