xuxiuxi
2017-07-10 d6119c2d7fe2f802dd224d77bf2d95eeeedb4526


git-svn-id: http://192.168.1.226/svn/proxy@696 454eff88-639b-444f-9e54-f578c98de674
22个文件已删除
2个文件已添加
5个文件已修改
1017 ■■■■■ 已修改文件
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java 662 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/discern/common/CommonVariables.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/SurveillanceFragment.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/AppApi.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/com/luxand/FSDK.java 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/FRICPayToolV20P.jar 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/libcvface_api.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/libopencv_java3.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/libprotobuf-lite.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/libprotobuf.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/libprotoc.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/librtspface.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/libcvface_api.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/libopencv_java3.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/libprotobuf-lite.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/libprotobuf.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/libprotoc.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/librtspface.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi/libfftw3.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi/libreader.art.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi/libreader.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi/libusb1.0.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi/libwltdecode.so 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/libthrift-0.9.1.jar 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/slf4j-android-1.7.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/slf4j-api-1.7.9.jar 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/jniLibs/xUtils-2.6.14.jar 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/res/layout/bottom_menu.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/res/layout/fragment_surveillance.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java
@@ -1,7 +1,17 @@
package cn.com.basic.face.base;
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.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.ColorDrawable;
import android.hardware.Camera;
import android.os.Handler;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
@@ -10,16 +20,28 @@
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.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
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.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;
@@ -31,11 +53,14 @@
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;
public class MainActivity extends BaseActivity {
public class MainActivity extends BaseActivity implements View.OnClickListener{
    private static MainActivity instance;
@@ -225,4 +250,639 @@
        return true;
    }
    ////////////////////////////////////////////////////////
    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";
    public static float sDensity = 1.0f;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (CommonVariables.FACE_SERVER) {
            sDensity = getResources().getDisplayMetrics().scaledDensity;
            int res = FSDK.ActivateLibrary("bSB3NdbTnv/0eW/uhypSe6hDMtjZ76Sisw5NwcN+0sfahxOtoUW22el54e/M6cSG5/xsdVIorPgugbTIfoIIn7ltyw1QMSleNebVx/Xe8aRA8bP+aVDybjoWdW/0rDP9Pv7yqBzNXyuwjgsVhPB53VGP8oTirTSUP7PTzSwOEe0=");
            if (res != FSDK.FSDKE_OK) {
                mIsFailed = true;
                showErrorAndClose("FaceSDK activation 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);
                // Lock orientation
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                // Camera layer and drawing layer
                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();
                //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));
                // 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 ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.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) // cancel with button only
                        .show();
            }
        }
    }
    @Override
    protected void onPause() {
        super.onPause();
        if(CommonVariables.FACE_SERVER) {
            pauseProcessingFrames();
            String templatePath = this.getApplicationInfo().dataDir + "/" + database;
            FSDK.SaveTrackerMemoryToFile(mDraw.mTracker, templatePath);
        }
    }
    @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) // cancel with button only
                .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;
        // 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); }
            catch (Exception ex) {}
        }
    }
    private void resumeProcessingFrames() {
        mDraw.mStopped = 0;
        mDraw.mStopping = 0;
    }
}
class FaceRectangle {
    public int x1, y1, x2, y2;
}
// Draw graphics on top of the video
class ProcessImageAndDrawResults extends View {
    public FSDK.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(Paint.Align.CENTER);
        mPaintBlue = new Paint();
        mPaintBlue.setStyle(Paint.Style.FILL);
        mPaintBlue.setColor(Color.BLUE);
        mPaintBlue.setTextSize(18 * MainActivity.sDensity);
        mPaintBlue.setTextAlign(Paint.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; //nothing to process or name is being entered now
        }
        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;
        FSDK.LoadImageFromBuffer(Image, mRGBData, mImageWidth, mImageHeight, mImageWidth*3, imagemode);
        FSDK.MirrorImage(Image, false);
        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!
        }
        */
        long IDs[] = new long[MAX_FACES];
        long face_count[] = new long[1];
        FSDK.FeedFrame(mTracker, 0, RotatedImage, face_count, IDs);
//        FSDK.FreeImage(RotatedImage);
        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);
                //surveillanceQueryItem.setBitmap(bitmap);
                surveillanceQueryItem.setWidth("100");
                surveillanceQueryItem.setHeight("100");
                bitmapList.add(surveillanceQueryItem);
                SurveillanceMng.getInstance().addBitmap(bitmapList, nativeImg.image, 0, CommonVariables.Camera.IN+"");
            }
        }
        FSDK.FreeImage(RotatedImage);
        faceLock.unlock();
        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);
            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();
                    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 Camera.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<Camera.Size> supportedSizes = parameters.getSupportedPreviewSizes();
        int width = 0;
        int height = 0;
        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)) {
                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){
        ViewGroup.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
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/discern/common/CommonVariables.java
@@ -107,4 +107,6 @@
        public static final String CAMERA2 = "camera2";
    }
    public static boolean FACE_SERVER = false;
}
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/fragment/SurveillanceFragment.java
@@ -14,6 +14,7 @@
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bsk.zhangbo.demoforbsk.R;
@@ -64,6 +65,10 @@
    private TextView fragment_surveillance_enter_timer;
    @ViewInject(R.id.fragment_surveillance_exit_timer)
    private TextView fragment_surveillance_exit_timer;
    @ViewInject(R.id.fragment_supervisory_exit_camera_relative_layout)
    private RelativeLayout fragment_supervisory_exit_camera_relative_layout;
    @ViewInject(R.id.fragment_supervisory_enter_camera_relative_layout)
    private RelativeLayout fragment_supervisory_enter_camera_relative_layout;
    static boolean useNative = false;
@@ -83,6 +88,9 @@
            useNative = false;
        } else {
            useNative = true;
        }
        if (CommonVariables.FACE_SERVER) {
            useNative = false;
        }
        //useNative = false;
        if (useNative) {
@@ -124,6 +132,11 @@
                //outputStream.writeBytes("exit\n");
                //outputStream.flush();
                //su.waitFor();
                /*
                busybox ifconfig wlan0 hw ether  AC:83:F3:42:19:CE
                 */
            }catch(Exception e){
                e.printStackTrace();
            }
@@ -153,6 +166,11 @@
    @Override
    protected void initViews(View view, Bundle savedInstanceState) {
        if (CommonVariables.FACE_SERVER) {
            fragment_supervisory_enter_camera_relative_layout.addView(MainActivity.getInstance().mPreview);
            fragment_supervisory_enter_camera_relative_layout.addView(MainActivity.getInstance().mDraw);
        }
        fragment_supervisory_enter_camera.getHolder().addCallback(new SurfaceHolder.Callback() {
            public void surfaceCreated(SurfaceHolder holder) {
                if (useNative) {
VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/util/AppApi.java
@@ -5,39 +5,54 @@
    //public final static String BASE_URL = "http://192.168.1.137:8333/face/";
    public final static String IMAGE_URL_BASE = "http://192.168.1.49:8888/";
    public final static String BASE_URL = "http://192.168.1.51/face/";
    //public final static String BASE_URL = "http://192.168.1.51/face/";
//    public final static String BASE_URL = "http://192.168.1.4:8333/face/";
    public final static String BASE_URL = "http://192.168.1.14:8080/face/";
    //注册添加
    public static final String REGISTER_ADD = "Register/o_add.do";
    //注册身份证认证
    public static final String REGISTER_ID_CARD_AUTH = "Register/v_id_card_auth.do";
    //字典添加
    public static final String DICTIONARY_ADD = "Dictionary/o_add.do";
    //访问添加
    public static final String VISIT_ADD = "Visit/o_add.do";
    //监控图片上传,识别
    public final static String SURVEILLANCE_UPLOAD = "Surveillance/o_upload.do";
    //电话呼叫添加
    public static final String PHONE_CALL_ADD = "PhoneCall/o_add.do";
    public static class Query {
        public final static String SURVEILLANCE_QUERY = "querySurveillance/v_list.do";
        //
        //public final static String SURVEILLANCE_QUERY = "querySurveillance/v_list.do";
        public final static String REGISTER_QUERY = "queryRegister/v_list.do";
        //public final static String REGISTER_QUERY = "queryRegister/v_list.do";
        //访客登记列表查询
        public final static String CHECK_IN_QUERY = "queryCheckIn/v_list.do";
        //电话呼叫列表查询
        public static final String PHONE_CALL_QUERY = "queryPhoneCall/v_list.do";
        //访问记录列表查询
        public static final String VISIT_QUERY = "queryVisit/v_list.do";
        //考勤列表查询
        public static final String ATTENDANCE_QUERY = "queryAttendance/v_list.do";
        //考勤明细查询
        public static final String ATTENDANCE_DETAIL_QUERY = "queryAttendanceDetail/v_list.do";
        //设备列表查询
        public final static String DEVICE_QUERY = "queryDevice/v_list.do";
        //数据字典查询
        public final static String DICTIONARY_QUERY = "queryDictionary/v_list.do";
    }
VisitFace/DemoForBsk/app/src/main/java/com/luxand/FSDK.java
New file
@@ -0,0 +1,278 @@
/*
 * FaceSDK Library Interface
 * Copyright (C) 2015 Luxand, Inc.
 */
package com.luxand;
public class FSDK
{
    static {
        System.loadLibrary("stlport_shared");
        System.loadLibrary("fsdk");
    }
    // Error codes
    public static final int FSDKE_OK = 0;
    public static final int FSDKE_FAILED = -1;
    public static final int FSDKE_NOT_ACTIVATED = -2;
    public static final int FSDKE_OUT_OF_MEMORY    = -3;
    public static final int FSDKE_INVALID_ARGUMENT = -4;
    public static final int FSDKE_IO_ERROR = -5;
    public static final int FSDKE_IMAGE_TOO_SMALL = -6;
    public static final int FSDKE_FACE_NOT_FOUND = -7;
    public static final int FSDKE_INSUFFICIENT_BUFFER_SIZE = -8;
    public static final int FSDKE_UNSUPPORTED_IMAGE_EXTENSION =    -9;
    public static final int FSDKE_CANNOT_OPEN_FILE = -10;
    public static final int FSDKE_CANNOT_CREATE_FILE = -11;
    public static final int FSDKE_BAD_FILE_FORMAT = -12;
    public static final int FSDKE_FILE_NOT_FOUND = -13;
    public static final int FSDKE_CONNECTION_CLOSED = -14;
    public static final int FSDKE_CONNECTION_FAILED = -15;
    public static final int FSDKE_IP_INIT_FAILED = -16;
    public static final int FSDKE_NEED_SERVER_ACTIVATION = -17;
    public static final int FSDKE_ID_NOT_FOUND = -18;
    public static final int FSDKE_ATTRIBUTE_NOT_DETECTED = -19;
    public static final int FSDKE_INSUFFICIENT_TRACKER_MEMORY_LIMIT = -20;
    public static final int FSDKE_UNKNOWN_ATTRIBUTE = -21;
    public static final int FSDKE_UNSUPPORTED_FILE_VERSION = -22;
    public static final int FSDKE_SYNTAX_ERROR = -23;
    public static final int FSDKE_PARAMETER_NOT_FOUND = -24;
    public static final int FSDKE_INVALID_TEMPLATE = -25;
    public static final int FSDKE_UNSUPPORTED_TEMPLATE_VERSION = -26;
    public static final int FSDKE_CAMERA_INDEX_DOES_NOT_EXIST = -27;
    // Facial feature count
    public static final int FSDK_FACIAL_FEATURE_COUNT = 66;
    // Types
    public static class FSDK_VIDEOCOMPRESSIONTYPE {
        public static final int FSDK_MJPEG = 0;
        public int type;
    }
    public static class FSDK_IMAGEMODE {
        public static final int FSDK_IMAGE_GRAYSCALE_8BIT = 0;
        public static final int FSDK_IMAGE_COLOR_24BIT = 1;
        public static final int FSDK_IMAGE_COLOR_32BIT = 2;
        public int mode;
    }
    public static class HImage {  //to pass himage "by reference"
        protected int himage;
    }
    public static class HCamera {  //to pass hcamera "by reference"
        protected int hcamera;
    }
    public static class HTracker {
        protected int htracker;
    }
    public static class TFacePosition {
        public int xc, yc, w;
        public int padding;
        public double angle;
    }
    public static class TFaces {
        public TFacePosition faces[];
        int maxFaces;
        public TFaces(){
            maxFaces = 100;
            faces = null;
        }
        public TFaces(int MaxFaces){
            maxFaces = MaxFaces;
            faces = null;
        }
    }
    public static class TPoint {
        public int x, y;
    }
    public static class FSDK_Features {
        public TPoint features[] = new TPoint[FSDK_FACIAL_FEATURE_COUNT];
    }
    public static class FSDK_FaceTemplate {
        public byte template[] = new byte[13324];
    }
    // Facial features
    public static final int FSDKP_LEFT_EYE = 0;
    public static final int FSDKP_RIGHT_EYE    = 1;
    public static final int FSDKP_LEFT_EYE_INNER_CORNER =    24;
    public static final int FSDKP_LEFT_EYE_OUTER_CORNER =    23;
    public static final int FSDKP_LEFT_EYE_LOWER_LINE1 =    38;
    public static final int FSDKP_LEFT_EYE_LOWER_LINE2 =    27;
    public static final int FSDKP_LEFT_EYE_LOWER_LINE3 =    37;
    public static final int FSDKP_LEFT_EYE_UPPER_LINE1 =    35;
    public static final int FSDKP_LEFT_EYE_UPPER_LINE2 =    28;
    public static final int FSDKP_LEFT_EYE_UPPER_LINE3 =    36;
    public static final int FSDKP_LEFT_EYE_LEFT_IRIS_CORNER =    29;
    public static final int FSDKP_LEFT_EYE_RIGHT_IRIS_CORNER =    30;
    public static final int FSDKP_RIGHT_EYE_INNER_CORNER =    25;
    public static final int FSDKP_RIGHT_EYE_OUTER_CORNER =    26;
    public static final int FSDKP_RIGHT_EYE_LOWER_LINE1 =    41;
    public static final int FSDKP_RIGHT_EYE_LOWER_LINE2 =    31;
    public static final int FSDKP_RIGHT_EYE_LOWER_LINE3 =    42;
    public static final int FSDKP_RIGHT_EYE_UPPER_LINE1 =    40;
    public static final int FSDKP_RIGHT_EYE_UPPER_LINE2 =    32;
    public static final int FSDKP_RIGHT_EYE_UPPER_LINE3 =    39;
    public static final int FSDKP_RIGHT_EYE_LEFT_IRIS_CORNER =    33;
    public static final int FSDKP_RIGHT_EYE_RIGHT_IRIS_CORNER =    34;
    public static final int FSDKP_LEFT_EYEBROW_INNER_CORNER     = 13;
    public static final int FSDKP_LEFT_EYEBROW_MIDDLE =    16;
    public static final int FSDKP_LEFT_EYEBROW_MIDDLE_LEFT =    18;
    public static final int FSDKP_LEFT_EYEBROW_MIDDLE_RIGHT    = 19;
    public static final int FSDKP_LEFT_EYEBROW_OUTER_CORNER    = 12;
    public static final int FSDKP_RIGHT_EYEBROW_INNER_CORNER =    14;
    public static final int FSDKP_RIGHT_EYEBROW_MIDDLE =    17;
    public static final int FSDKP_RIGHT_EYEBROW_MIDDLE_LEFT =    20;
    public static final int FSDKP_RIGHT_EYEBROW_MIDDLE_RIGHT =    21;
    public static final int FSDKP_RIGHT_EYEBROW_OUTER_CORNER =    15;
    public static final int FSDKP_NOSE_TIP =    2;
    public static final int FSDKP_NOSE_BOTTOM =    49;
    public static final int FSDKP_NOSE_BRIDGE =    22;
    public static final int FSDKP_NOSE_LEFT_WING =    43;
    public static final int FSDKP_NOSE_LEFT_WING_OUTER =    45;
    public static final int FSDKP_NOSE_LEFT_WING_LOWER =    47;
    public static final int FSDKP_NOSE_RIGHT_WING =    44;
    public static final int FSDKP_NOSE_RIGHT_WING_OUTER =    46;
    public static final int FSDKP_NOSE_RIGHT_WING_LOWER =    48;
    public static final int FSDKP_MOUTH_RIGHT_CORNER =    3;
    public static final int FSDKP_MOUTH_LEFT_CORNER    = 4;
    public static final int FSDKP_MOUTH_TOP    = 54;
    public static final int FSDKP_MOUTH_TOP_INNER    = 61;
    public static final int FSDKP_MOUTH_BOTTOM =    55;
    public static final int FSDKP_MOUTH_BOTTOM_INNER =    64;
    public static final int FSDKP_MOUTH_LEFT_TOP =    56;
    public static final int FSDKP_MOUTH_LEFT_TOP_INNER =    60;
    public static final int FSDKP_MOUTH_RIGHT_TOP =    57;
    public static final int FSDKP_MOUTH_RIGHT_TOP_INNER =    62;
    public static final int FSDKP_MOUTH_LEFT_BOTTOM =    58;
    public static final int FSDKP_MOUTH_LEFT_BOTTOM_INNER =    63;
    public static final int FSDKP_MOUTH_RIGHT_BOTTOM =    59;
    public static final int FSDKP_MOUTH_RIGHT_BOTTOM_INNER =    65;
    public static final int FSDKP_NASOLABIAL_FOLD_LEFT_UPPER =    50;
    public static final int FSDKP_NASOLABIAL_FOLD_LEFT_LOWER =    52;
    public static final int FSDKP_NASOLABIAL_FOLD_RIGHT_UPPER =    51;
    public static final int FSDKP_NASOLABIAL_FOLD_RIGHT_LOWER =    53;
    public static final int FSDKP_CHIN_BOTTOM =    11;
    public static final int FSDKP_CHIN_LEFT =    9;
    public static final int FSDKP_CHIN_RIGHT =    10;
    public static final int FSDKP_FACE_CONTOUR1 =    7;
    public static final int FSDKP_FACE_CONTOUR2 =    5;
    public static final int FSDKP_FACE_CONTOUR12 =    6;
    public static final int FSDKP_FACE_CONTOUR13 =    8;
    public static native int ActivateLibrary(String LicenseKey);
    //public static native int GetHardware_ID(String HardwareID[]); //not implemented
    public static native int GetLicenseInfo(String LicenseInfo[]);
    public static native int SetNumThreads(int Num);
    public static native int GetNumThreads(int Num[]);
    public static native int Initialize();
    public static native int Finalize();
    public static native int CreateEmptyImage(HImage Image);
    public static native int FreeImage(HImage Image);
    public static native int LoadImageFromFile(HImage Image, String FileName);
    public static native int LoadImageFromFileWithAlpha(HImage Image, String FileName);
    public static native int SaveImageToFile(HImage Image, String FileName);
    public static native int SetJpegCompressionQuality(int Quality);
    public static native int GetImageWidth(HImage Image, int Width[]);
    public static native int GetImageHeight(HImage Image, int Height[]);
    public static native int LoadImageFromBuffer(HImage Image, byte Buffer[], int Width, int Height, int ScanLine, FSDK_IMAGEMODE ImageMode);
    public static native int GetImageBufferSize(HImage Image, int BufSize [], FSDK_IMAGEMODE ImageMode);
    public static native int SaveImageToBuffer(HImage Image, byte Buffer[], FSDK_IMAGEMODE ImageMode);
    public static native int LoadImageFromJpegBuffer(HImage Image, byte Buffer[], int BufferLength);
    public static native int LoadImageFromPngBuffer(HImage Image, byte Buffer[], int BufferLength);
    public static native int LoadImageFromPngBufferWithAlpha(HImage Image, byte Buffer[], int BufferLength);
    public static native int DetectFace(HImage Image, TFacePosition FacePosition);
    public static native int DetectMultipleFaces(HImage Image, TFaces FacePositions);
    public static native int SetFaceDetectionParameters(boolean HandleArbitraryRotations, boolean DetermineFaceRotationAngle, int InternalResizeWidth);
    public static native int SetFaceDetectionThreshold(int Threshold);
    public static native int GetDetectedFaceConfidence(int Confidence[]);
    public static native int DetectFacialFeatures(HImage Image, FSDK_Features FacialFeatures);
    public static native int DetectFacialFeaturesInRegion(HImage Image, TFacePosition FacePosition, FSDK_Features FacialFeatures);
    public static native int DetectEyes(HImage Image, FSDK_Features Eyes);
    public static native int DetectEyesInRegion(HImage Image, TFacePosition FacePosition, FSDK_Features Eyes);
    public static native int CopyImage(HImage SourceImage, HImage DestImage);
    public static native int ResizeImage(HImage SourceImage, double ratio, HImage DestImage);
    public static native int RotateImage90(HImage SourceImage, int Multiplier, HImage DestImage);
    public static native int RotateImage(HImage SourceImage, double angle, HImage DestImage);
    public static native int RotateImageCenter(HImage SourceImage, double angle, double xCenter, double yCenter, HImage DestImage);
    public static native int CopyRect(HImage SourceImage, int x1, int y1, int x2, int y2, HImage DestImage);
    public static native int CopyRectReplicateBorder(HImage SourceImage, int x1, int y1, int x2, int y2, HImage DestImage);
    public static native int MirrorImage(HImage Image, boolean UseVerticalMirroringInsteadOfHorizontal);
    public static native int ExtractFaceImage(HImage Image, FSDK_Features FacialFeatures, int Width, int Height, HImage ExtractedFaceImage, FSDK_Features ResizedFeatures);
    public static native int GetFaceTemplate(HImage Image, FSDK_FaceTemplate FaceTemplate);
    public static native int GetFaceTemplateInRegion(HImage Image, TFacePosition FacePosition, FSDK_FaceTemplate FaceTemplate);
    public static native int GetFaceTemplateUsingFeatures(HImage Image, FSDK_Features FacialFeatures, FSDK_FaceTemplate FaceTemplate);
    public static native int GetFaceTemplateUsingEyes(HImage Image, FSDK_Features EyeCoords, FSDK_FaceTemplate FaceTemplate);
    public static native int MatchFaces(FSDK_FaceTemplate FaceTemplate1, FSDK_FaceTemplate FaceTemplate2, float Similarity[]);
    public static native int GetMatchingThresholdAtFAR(float FARValue, float Threshold[]);
    public static native int GetMatchingThresholdAtFRR(float FRRValue, float Threshold[]);
    public static native int CreateTracker(HTracker Tracker);
    public static native int FreeTracker(HTracker Tracker);
    public static native int ClearTracker(HTracker Tracker);
    public static native int SetTrackerParameter(HTracker Tracker, String ParameterName, String ParameterValue);
    public static native int SetTrackerMultipleParameters(HTracker Tracker, String Parameters, int ErrorPosition[]);
    public static native int GetTrackerParameter(HTracker Tracker, String ParameterName, String ParameterValue[], int MaxSizeInBytes);
    public static native int FeedFrame(HTracker Tracker, long CameraIdx, HImage Image, long FaceCount[], long IDs[]);
    public static native int GetTrackerEyes(HTracker Tracker, long CameraIdx, long ID, FSDK_Features Eyes);
    public static native int GetTrackerFacialFeatures(HTracker Tracker, long CameraIdx, long ID, FSDK_Features FacialFeatures);
    public static native int GetTrackerFacePosition(HTracker Tracker, long CameraIdx, long ID, TFacePosition FacePosition);
    public static native int LockID(HTracker Tracker, long ID);
    public static native int UnlockID(HTracker Tracker, long ID);
    public static native int SetName(HTracker Tracker, long ID, String Name);
    public static native int GetName(HTracker Tracker, long ID, String Name[], long MaxSizeInBytes);
    public static native int GetAllNames(HTracker Tracker, long ID, String Names[], long MaxSizeInBytes);
    public static native int GetIDReassignment(HTracker Tracker, long ID, long ReassignedID[]);
    public static native int GetSimilarIDCount(HTracker Tracker, long ID, long Count[]);
    public static native int GetSimilarIDList(HTracker Tracker, long ID, long SimilarIDList[]);
    public static native int SaveTrackerMemoryToFile(HTracker Tracker, String FileName);
    public static native int LoadTrackerMemoryFromFile(HTracker Tracker, String FileName);
    public static native int GetTrackerMemoryBufferSize(HTracker Tracker, long [] BufSize);
    public static native int SaveTrackerMemoryToBuffer(HTracker Tracker, byte Buffer[]);
    public static native int LoadTrackerMemoryFromBuffer(HTracker Tracker, byte Buffer[]);
    public static native int GetTrackerFacialAttribute(HTracker Tracker, long CameraIdx, long ID, String AttributeName, String AttributeValues[], long MaxSizeInBytes);
    public static native int DetectFacialAttributeUsingFeatures(HImage Image, FSDK_Features FacialFeatures, String AttributeName, String AttributeValues[], long MaxSizeInBytes);
    public static native int GetValueConfidence(String AttributeValues, String Value, float Confidence[]);
    public static native int SetHTTPProxy(String ServerNameOrIPAddress, short Port, String UserName, String Password);
    public static native int OpenIPVideoCamera(FSDK_VIDEOCOMPRESSIONTYPE CompressionType, String URL, String Username, String Password, int TimeoutSeconds, HCamera CameraHandle);
    public static native int CloseVideoCamera(HCamera CameraHandle);
    public static native int GrabFrame(HCamera CameraHandle, HImage Image);
    public static native int InitializeCapturing();
    public static native int FinalizeCapturing();
}
VisitFace/DemoForBsk/app/src/main/jniLibs/FRICPayToolV20P.jar
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/libcvface_api.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/libopencv_java3.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/libprotobuf-lite.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/libprotobuf.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/libprotoc.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/arm64-v8a/librtspface.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/libcvface_api.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/libopencv_java3.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/libprotobuf-lite.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/libprotobuf.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/libprotoc.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi-v7a/librtspface.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi/libfftw3.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi/libreader.art.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi/libreader.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi/libusb1.0.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/armeabi/libwltdecode.so
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/libthrift-0.9.1.jar
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/slf4j-android-1.7.9.jar
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/slf4j-api-1.7.9.jar
Binary files differ
VisitFace/DemoForBsk/app/src/main/jniLibs/xUtils-2.6.14.jar
Binary files differ
VisitFace/DemoForBsk/app/src/main/res/layout/bottom_menu.xml
New file
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:orientation="horizontal">
<RelativeLayout android:id="@+id/footer" android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:orientation="horizontal"
    android:layout_alignParentBottom="true" style="@android:style/ButtonBar">
    <Space
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/helpButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="Help" />
    <Button
        android:id="@+id/clearButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Clear Memory" />
</RelativeLayout>
</RelativeLayout>
VisitFace/DemoForBsk/app/src/main/res/layout/fragment_surveillance.xml
@@ -40,6 +40,7 @@
            android:layout_width="@dimen/view_size_0"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:id="@+id/fragment_supervisory_enter_camera_relative_layout"
            >
            <SurfaceView
                android:layout_width="wrap_content"
@@ -49,7 +50,8 @@
                android:layout_width="match_parent"
                android:layout_height="@dimen/h50dp"
                android:layout_alignParentBottom="true"
                android:background="#40000000">
                android:background="#40000000"
                >
                <TextView
                    android:id="@+id/fragment_surveillance_enter_timer"
                    android:layout_width="wrap_content"
@@ -78,6 +80,7 @@
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:layout_marginLeft="@dimen/w2dp"
            android:id="@+id/fragment_supervisory_exit_camera_relative_layout"
            >
            <SurfaceView
                android:id="@+id/fragment_supervisory_exit_camera"