From ec544e9cc330ce40aeb78e96aa362e245feecd4d Mon Sep 17 00:00:00 2001 From: xuxiuxi <xuxiuxi@454eff88-639b-444f-9e54-f578c98de674> Date: 星期五, 21 七月 2017 15:03:34 +0800 Subject: [PATCH] --- VisitFace/DemoForBsk/app/src/main/java/cn/com/basic/face/base/MainActivity.java | 256 +++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 205 insertions(+), 51 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 6bfe263..e67b1fc 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,33 +1,34 @@ package cn.com.basic.face.base; -import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; 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.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; -import android.os.Bundle; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; -import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; import android.widget.EditText; import android.widget.ImageView; @@ -35,39 +36,47 @@ import android.widget.TextView; import android.widget.Toast; +import com.awsle.aibatis.client.SqlMapClientBuilder; import com.bsk.zhangbo.demoforbsk.R; import com.luxand.FSDK; +import com.luxand.FSDK.HTracker; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import cn.com.basic.face.discern.common.CommonVariables; import cn.com.basic.face.discern.query.item.SurveillanceQueryItem; -import cn.com.basic.face.fragment.AttenderRegisterFragment; -import cn.com.basic.face.fragment.SurveillanceFragment; -import cn.com.basic.face.service.SurveillanceMng; -import cn.com.basic.face.util.FileUtil; -import cn.com.basic.face.util.NativeImg; -import cn.com.basic.face.util.TabNameUtil; import cn.com.basic.face.fragment.AttendanceFragment; import cn.com.basic.face.fragment.CheckInFragment; import cn.com.basic.face.fragment.DeviceFragment; import cn.com.basic.face.fragment.PhoneCallFragment; -import cn.com.basic.face.fragment.VisitorRegisterFragment; +import cn.com.basic.face.fragment.SurveillanceFragment; import cn.com.basic.face.fragment.VisitFragment; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; +import cn.com.basic.face.fragment.VisitorRegisterFragment; +import cn.com.basic.face.service.DeviceMng; +import cn.com.basic.face.service.SurveillanceMng; +import cn.com.basic.face.service.sqlite.SurveillanceDao; +import cn.com.basic.face.service.sqlite.TestDao; +import cn.com.basic.face.util.FileUtil; +import cn.com.basic.face.util.NativeImg; +import cn.com.basic.face.util.TabNameUtil; 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; public static void selectPage(int pageNum) { mTabLayout.getTabAt(pageNum).select(); @@ -86,14 +95,17 @@ instance = this; } + public MyFragmentPagerAdapter myFragmentPagerAdapter; + @Override public void initData() { List<String> tabNamesList = Arrays.asList(TabNameUtil.tabNames); int[] tabIcons = TabNameUtil.tabIcons; - MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),MainActivity.this); + myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),MainActivity.this); myFragmentPagerAdapter.addFragment(SurveillanceFragment.getInstance(), tabNamesList.get(0),tabIcons[0]); -// myFragmentPagerAdapter.addFragment(VisitorRegisterFragment.getInstance(), tabNamesList.get(1),tabIcons[1]); - myFragmentPagerAdapter.addFragment(AttenderRegisterFragment.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]); @@ -115,6 +127,8 @@ myThread = new MyThread(); myThread.start(); } +// initDb(); +// initSqlMap(); } public static MainActivity getInstance() { @@ -136,6 +150,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 @@ -253,7 +273,58 @@ } 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; @@ -267,20 +338,31 @@ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + db=openOrCreateDatabase("/data/data/com.bsk.zhangbo.demoforbsk/databases/aibatis_test_db", Context.MODE_PRIVATE, null); + TestDao.getInstance().test(); + DeviceMng.getInstance().findDevice(); if (CommonVariables.FACE_SERVER) { sDensity = getResources().getDisplayMetrics().scaledDensity; - int res = 0; + 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 FSDK.HTracker(); + mDraw.mTracker = new HTracker(); String templatePath = this.getApplicationInfo().dataDir + "/" + database; if (FSDK.FSDKE_OK != FSDK.LoadTrackerMemoryFromFile(mDraw.mTracker, templatePath)) { res = FSDK.CreateTracker(mDraw.mTracker); @@ -288,10 +370,40 @@ 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 ); @@ -395,6 +507,12 @@ mDraw.mStopped = 0; mDraw.mStopping = 0; } + + @Override + protected void onStop() { + super.onStop(); + Config.sqlMap.getDb().close(); + } } @@ -403,8 +521,9 @@ public int x1, y1, x2, y2; } +// Draw graphics on top of the video class ProcessImageAndDrawResults extends View { - public FSDK.HTracker mTracker; + public HTracker mTracker; final int MAX_FACES = 5; final FaceRectangle[] mFacePositions = new FaceRectangle[MAX_FACES]; @@ -462,12 +581,12 @@ mPaintGreen.setStyle(Paint.Style.FILL); mPaintGreen.setColor(Color.GREEN); mPaintGreen.setTextSize(18 * MainActivity.sDensity); - mPaintGreen.setTextAlign(Paint.Align.CENTER); + mPaintGreen.setTextAlign(Align.CENTER); mPaintBlue = new Paint(); mPaintBlue.setStyle(Paint.Style.FILL); mPaintBlue.setColor(Color.BLUE); mPaintBlue.setTextSize(18 * MainActivity.sDensity); - mPaintBlue.setTextAlign(Paint.Align.CENTER); + mPaintBlue.setTextAlign(Align.CENTER); mPaintBlueTransparent = new Paint(); mPaintBlueTransparent.setStyle(Paint.Style.STROKE); @@ -475,6 +594,7 @@ mPaintBlueTransparent.setColor(Color.BLUE); mPaintBlueTransparent.setTextSize(25); + //mBitmap = null; mYUVData = null; mRGBData = null; @@ -516,6 +636,11 @@ // 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); @@ -530,7 +655,7 @@ FSDK.FeedFrame(mTracker, 0, RotatedImage, face_count, IDs); - System.out.println("face_count="+face_count[0]); + System.out.println("face_count="+face_count[0]+", mImageWidth="+mImageWidth+", mImageHeight="+mImageHeight); faceLock.lock(); @@ -595,10 +720,15 @@ surveillanceQueryItem.setBitmap(bmp); surveillanceQueryItem.setWidth("100"); surveillanceQueryItem.setHeight("100"); + surveillanceQueryItem.setRegisterOrCheckIn(CommonVariables.Surveillance.OFFLINE_SURVEILLANCE_ITEM_TYPE); + surveillanceQueryItem.setCreateTime(new Date()); bitmapList.add(surveillanceQueryItem); - - SurveillanceMng.getInstance().addBitmap(bitmapList, nativeImg.image, 0, CommonVariables.Camera.IN+"", nativeImg.image); + 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+""); + } } } @@ -625,7 +755,7 @@ } super.onDraw(canvas); - } + } // end onDraw method @Override @@ -640,6 +770,10 @@ long IDs[] = new long[MAX_FACES]; for (int i=0; i<MAX_FACES; ++i) { rects[i] = new FaceRectangle(); + if(rects[i] == null) { + faceLock.unlock(); + return true; + } rects[i].x1 = mFacePositions[i].x1; rects[i].y1 = mFacePositions[i].y1; rects[i].x2 = mFacePositions[i].x2; @@ -654,6 +788,7 @@ 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" ) @@ -671,7 +806,7 @@ mTouchedIndex = -1; } }) - .setCancelable(false) + .setCancelable(false) // cancel with button only .show(); break; @@ -708,8 +843,12 @@ } } } -} +} // 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; @@ -722,28 +861,28 @@ 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 authorisation not granted for camera - if (ContextCompat.checkSelfPermission(MainActivity.getInstance(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) - //ask for authorisation - ActivityCompat.requestPermissions(MainActivity.getInstance(), new String[]{Manifest.permission.CAMERA}, 50); if (frontCameraFound) { mCamera = Camera.open(cameraId); @@ -751,16 +890,17 @@ mCamera = Camera.open(); } - try { mCamera.setPreviewDisplay(holder); - mCamera.setPreviewCallback(new Camera.PreviewCallback() { + // 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; @@ -768,6 +908,7 @@ 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(); } @@ -790,7 +931,11 @@ } } + //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); @@ -800,24 +945,32 @@ } } + //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); + mCamera.setDisplayOrientation(90); // For Android 2.2 and above mDraw.rotated = true; } else { parameters.set("orientation", "landscape"); - mCamera.setDisplayOrientation(0); + mCamera.setDisplayOrientation(0); // For Android 2.2 and above } - List<Camera.Size> supportedSizes = parameters.getSupportedPreviewSizes(); + /**/ + + // choose preview size closer to 640x480 for optimal performance + List<Size> supportedSizes = parameters.getSupportedPreviewSizes(); int width = 0; int height = 0; - System.out.println("surfaceChanged"); - for (Camera.Size s: supportedSizes) { + for (Size s: supportedSizes) { if ((width - 640)*(width - 640) + (height - 480)*(height - 480) > (s.width - 640)*(s.width - 640) + (s.height - 480)*(s.height - 480)) { width = s.width; @@ -825,10 +978,12 @@ } } + //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); @@ -842,7 +997,7 @@ } private void makeResizeForCameraAspect(float cameraAspectRatio){ - ViewGroup.LayoutParams layoutParams = this.getLayoutParams(); + LayoutParams layoutParams = this.getLayoutParams(); int matchParentWidth = this.getWidth(); int newHeight = (int)(matchParentWidth/cameraAspectRatio); if (newHeight != layoutParams.height) { @@ -852,5 +1007,4 @@ this.invalidate(); } } -} - +} // end of Preview class -- Gitblit v1.8.0