MainActivity.xml
package com.faceplusplus.apitest;
import com.faceplusplus.api.FaceDetecter;
import com.faceplusplus.api.FaceDetecter.Face;
import com.facepp.error.FaceppParseException;
import com.facepp.http.HttpRequests;
import com.facepp.http.PostParameters;
import com.megvii.apitest.R;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Bitmap curBitmap;
private final static int REQUEST_GET_PHOTO = 1;
ImageView imageView = null;
HandlerThread detectThread = null;
Handler detectHandler = null;
Button button = null;
FaceDetecter detecter = null;
HttpRequests request = null;// 在线api
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
detectThread = new HandlerThread("detect");
detectThread.start();
detectHandler = new Handler(detectThread.getLooper());
imageView = (ImageView) findViewById(R.id.imageview);
curBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.temp4);
imageView.setImageBitmap(curBitmap);
detecter = new FaceDetecter();
detecter.init(this, "5mizjzcsify5094mocb4");
//FIXME 替换成申请的key
request = new HttpRequests("cbf408f2a3982fd0b54ab1ddacd682fa", "Ck9lv8ynuq7VLQYgQvxXXSzJJdxyfBMk");
}
@Override
protected void onDestroy() {
super.onDestroy();
detecter.release(this);// 释放引擎
}
public static Bitmap getFaceInfoBitmap(Face[] faceinfos,
Bitmap oribitmap) {
Bitmap tmp;
tmp = oribitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas localCanvas = new Canvas(tmp);
Paint localPaint = new Paint();
localPaint.setColor(0xffff0000);
localPaint.setStyle(Paint.Style.STROKE);
for (Face localFaceInfo : faceinfos) {
RectF rect = new RectF(oribitmap.getWidth() * localFaceInfo.left, oribitmap.getHeight()
* localFaceInfo.top, oribitmap.getWidth() * localFaceInfo.right,
oribitmap.getHeight()
* localFaceInfo.bottom);
localCanvas.drawRect(rect, localPaint);
}
return tmp;
}
public static Bitmap getScaledBitmap(String fileName, int dstWidth)
{
BitmapFactory.Options localOptions = new BitmapFactory.Options();
localOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(fileName, localOptions);
int originWidth = localOptions.outWidth;
int originHeight = localOptions.outHeight;
localOptions.inSampleSize = originWidth > originHeight ? originWidth / dstWidth
: originHeight / dstWidth;
localOptions.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(fileName, localOptions);
}
public void onClick(View view) {
switch (view.getId())
{
case R.id.pick:
startActivityForResult(new Intent("android.intent.action.PICK",
MediaStore.Images.Media.EXTERNAL_CONTENT_URI), REQUEST_GET_PHOTO);
break;
case R.id.detect:
detectHandler.post(new Runnable() {
@Override
public void run() {
Face[] faceinfo = detecter.findFaces(curBitmap);// 进行人脸检测
if (faceinfo == null)
{
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "未发现人脸信息", Toast.LENGTH_LONG)
.show();
}
});
return;
}
//在线api交互
try {
request.offlineDetect(detecter.getImageByteArray(),detecter.getResultJsonString(), new PostParameters());
} catch (FaceppParseException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
final Bitmap bit = getFaceInfoBitmap(faceinfo, curBitmap);
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bit);
System.gc();
}
});
}
});
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_GET_PHOTO: {
if (data != null) {
final String str;
Uri localUri = data.getData();
String[] arrayOfString = new String[1];
arrayOfString[0] = "_data";
Cursor localCursor = getContentResolver().query(localUri,
arrayOfString, null, null, null);
if (localCursor == null)
return;
localCursor.moveToFirst();
str = localCursor.getString(localCursor
.getColumnIndex(arrayOfString[0]));
localCursor.close();
if ((curBitmap != null) && (!curBitmap.isRecycled()))
curBitmap.recycle();
curBitmap = getScaledBitmap(str, 600);
imageView.setImageBitmap(curBitmap);
}
break;
}
}
}
}
}
FaceMask.xml
package com.faceplusplus.apitest;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import com.faceplusplus.api.FaceDetecter.Face;
public class FaceMask extends View {
Paint localPaint = null;
Face[] faceinfos = null;
RectF rect = null;
public FaceMask(Context context, AttributeSet atti) {
super(context, atti);
rect = new RectF();
localPaint = new Paint();
localPaint.setColor(0xff00b4ff);
localPaint.setStrokeWidth(5);
localPaint.setStyle(Paint.Style.STROKE);
}
public void setFaceInfo(Face[] faceinfos)
{
this.faceinfos = faceinfos;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (faceinfos == null)
return;
for (Face localFaceInfo : faceinfos) {
rect.set(getWidth() * localFaceInfo.left, getHeight()
* localFaceInfo.top, getWidth() * localFaceInfo.right,
getHeight()
* localFaceInfo.bottom);
canvas.drawRect(rect, localPaint);
}
}
}
CameraPreview.xml
package com.faceplusplus.apitest;
import java.io.IOException;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import com.faceplusplus.api.FaceDetecter;
import com.faceplusplus.api.FaceDetecter.Face;
import com.megvii.apitest.R;
public class CameraPreview extends Activity implements Callback, PreviewCallback {
SurfaceView camerasurface = null;
FaceMask mask = null;
Camera camera = null;
HandlerThread handleThread = null;
Handler detectHandler = null;
Runnable detectRunnalbe = null;
private int width = 320;
private int height = 240;
FaceDetecter facedetecter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camerapreview);
camerasurface = (SurfaceView) findViewById(R.id.camera_preview);
mask = (FaceMask) findViewById(R.id.mask);
LayoutParams para = new LayoutParams(480, 800);
handleThread = new HandlerThread("dt");
handleThread.start();
detectHandler = new Handler(handleThread.getLooper());
para.addRule(RelativeLayout.CENTER_IN_PARENT);
camerasurface.setLayoutParams(para);
mask.setLayoutParams(para);
camerasurface.getHolder().addCallback(this);
camerasurface.setKeepScreenOn(true);
facedetecter = new FaceDetecter();
if (!facedetecter.init(this, "5mizjzcsify5094mocb4")) {
Log.e("diff", "有错误 ");
}
facedetecter.setTrackingMode(true);
}
@Override
protected void onResume() {
super.onResume();
camera = Camera.open(1);
Camera.Parameters para = camera.getParameters();
para.setPreviewSize(width, height);
camera.setParameters(para);
}
@Override
protected void onPause() {
super.onPause();
if (camera != null) {
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
finish();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
facedetecter.release(this);
handleThread.quit();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
camera.setDisplayOrientation(90);
camera.startPreview();
camera.setPreviewCallback(this);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public void onPreviewFrame(final byte[] data, Camera camera) {
camera.setPreviewCallback(null);
detectHandler.post(new Runnable() {
@Override
public void run() {
byte[] ori = new byte[width * height];
int is = 0;
for (int x = width - 1; x >= 0; x--) {
for (int y = height - 1; y >= 0; y--) {
ori[is] = data[y * width + x];
is++;
}
}
final Face[] faceinfo = facedetecter.findFaces( ori, height,
width);
runOnUiThread(new Runnable() {
@Override
public void run() {
mask.setFaceInfo(faceinfo);
}
});
CameraPreview.this.camera.setPreviewCallback(CameraPreview.this);
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.megvii.apitest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.faceplusplus.apitest.MainActivity"
android:label="@string/app_name2" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.faceplusplus.apitest.CameraPreview"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ImageView
android:id="@+id/imageview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitCenter" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal" >
<Button
android:id="@+id/pick"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:text="选择图片" />
<Button
android:id="@+id/detect"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="onClick"
android:text="检测" />
</LinearLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<SurfaceView
android:id="@+id/camera_preview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.faceplusplus.apitest.FaceMask
android:id="@+id/mask"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</com.faceplusplus.apitest.FaceMask>
</RelativeLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.megvii.apitest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.faceplusplus.apitest.MainActivity"
android:label="@string/app_name2" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.faceplusplus.apitest.CameraPreview"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
app下的build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 18
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.megvii.apitest"
minSdkVersion 10
targetSdkVersion 18
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile 'com.android.support:support-v4:18.0.0'
compile files('libs/faceppofflinesdk.jar')
compile files('libs/faceppsdk.jar')
}