1 package com.faceplusplus.apitest;
2
3 import com.faceplusplus.api.FaceDetecter;
4 import com.faceplusplus.api.FaceDetecter.Face;
5 import com.facepp.error.FaceppParseException;
6 import com.facepp.http.HttpRequests;
7 import com.facepp.http.PostParameters;
8 import com.megvii.apitest.R;
9
10 import android.app.Activity;
11 import android.content.Intent;
12 import android.database.Cursor;
13 import android.graphics.Bitmap;
14 import android.graphics.BitmapFactory;
15 import android.graphics.Canvas;
16 import android.graphics.Paint;
17 import android.graphics.RectF;
18 import android.net.Uri;
19 import android.os.Bundle;
20 import android.os.Handler;
21 import android.os.HandlerThread;
22 import android.provider.MediaStore;
23 import android.view.View;
24 import android.widget.Button;
25 import android.widget.ImageView;
26 import android.widget.Toast;
27
28 public class MainActivity extends Activity {
29
30 private Bitmap curBitmap;
31 private final static int REQUEST_GET_PHOTO = 1;
32 ImageView imageView = null;
33 HandlerThread detectThread = null;
34 Handler detectHandler = null;
35 Button button = null;
36 FaceDetecter detecter = null;
37 HttpRequests request = null;// 在线api
38
39 @Override
40 protected void onCreate(Bundle savedInstanceState) {
41 super.onCreate(savedInstanceState);
42 setContentView(R.layout.activity_main);
43 detectThread = new HandlerThread("detect");
44 detectThread.start();
45 detectHandler = new Handler(detectThread.getLooper());
46
47 imageView = (ImageView) findViewById(R.id.imageview);
48 curBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.temp4);
49 imageView.setImageBitmap(curBitmap);
50 detecter = new FaceDetecter();
51 detecter.init(this, "cbf408f2a3982fd0b54ab1ddacd682fa");
52
53
54 //FIXME 替换成申请的key
55 request = new HttpRequests("cbf408f2a3982fd0b54ab1ddacd682fa", "Ck9lv8ynuq7VLQYgQvxXXSzJJdxyfBMk");
56 }
57
58 @Override
59 protected void onDestroy() {
60 super.onDestroy();
61 detecter.release(this);// 释放引擎
62 }
63
64 public static Bitmap getFaceInfoBitmap(Face[] faceinfos,
65 Bitmap oribitmap) {
66 Bitmap tmp;
67 tmp = oribitmap.copy(Bitmap.Config.ARGB_8888, true);
68
69 Canvas localCanvas = new Canvas(tmp);
70 Paint localPaint = new Paint();
71 localPaint.setColor(0xffff0000);
72 localPaint.setStyle(Paint.Style.STROKE);
73 for (Face localFaceInfo : faceinfos) {
74 RectF rect = new RectF(oribitmap.getWidth() * localFaceInfo.left, oribitmap.getHeight()
75 * localFaceInfo.top, oribitmap.getWidth() * localFaceInfo.right,
76 oribitmap.getHeight()
77 * localFaceInfo.bottom);
78 localCanvas.drawRect(rect, localPaint);
79 }
80 return tmp;
81 }
82
83 public static Bitmap getScaledBitmap(String fileName, int dstWidth)
84 {
85 BitmapFactory.Options localOptions = new BitmapFactory.Options();
86 localOptions.inJustDecodeBounds = true;
87 BitmapFactory.decodeFile(fileName, localOptions);
88 int originWidth = localOptions.outWidth;
89 int originHeight = localOptions.outHeight;
90
91 localOptions.inSampleSize = originWidth > originHeight ? originWidth / dstWidth
92 : originHeight / dstWidth;
93 localOptions.inJustDecodeBounds = false;
94 return BitmapFactory.decodeFile(fileName, localOptions);
95 }
96
97 public void onClick(View view) {
98 switch (view.getId())
99 {
100 case R.id.pick:
101 startActivityForResult(new Intent("android.intent.action.PICK",
102 MediaStore.Images.Media.EXTERNAL_CONTENT_URI), REQUEST_GET_PHOTO);
103 break;
104 case R.id.detect:
105 detectHandler.post(new Runnable() {
106
107 @Override
108 public void run() {
109 Face[] faceinfo = detecter.findFaces(curBitmap);// 进行人脸检测
110 if (faceinfo == null)
111 {
112 runOnUiThread(new Runnable() {
113
114 @Override
115 public void run() {
116 Toast.makeText(MainActivity.this, "未发现人脸信息", Toast.LENGTH_LONG).show();
117 }
118 });
119 return;
120 }
121
122 //在线api交互
123 try {
124 request.offlineDetect(detecter.getImageByteArray(),detecter.getResultJsonString(), new PostParameters());
125 } catch (FaceppParseException e) {
126 // TODO 自动生成的 catch 块
127 e.printStackTrace();
128 }
129 final Bitmap bit = getFaceInfoBitmap(faceinfo, curBitmap);
130 runOnUiThread(new Runnable() {
131
132 @Override
133 public void run() {
134 imageView.setImageBitmap(bit);
135 System.gc();
136 }
137 });
138 }
139 });
140 }
141 }
142
143 @Override
144 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
145 // TODO Auto-generated method stub
146 if (resultCode == RESULT_OK) {
147 switch (requestCode) {
148 case REQUEST_GET_PHOTO: {
149 if (data != null) {
150 final String str;
151 Uri localUri = data.getData();
152 String[] arrayOfString = new String[1];
153 arrayOfString[0] = "_data";
154 Cursor localCursor = getContentResolver().query(localUri,
155 arrayOfString, null, null, null);
156 if (localCursor == null)
157 return;
158 localCursor.moveToFirst();
159 str = localCursor.getString(localCursor
160 .getColumnIndex(arrayOfString[0]));
161 localCursor.close();
162 if ((curBitmap != null) && (!curBitmap.isRecycled()))
163 curBitmap.recycle();
164 curBitmap = getScaledBitmap(str, 600);
165 imageView.setImageBitmap(curBitmap);
166 }
167 break;
168 }
169 }
170
171 }
172 }
173 }