1.按照官网的注册进行之后,设置应用信息 完成后下载sdk
2.按照文档进行接入 如果出现包重复的情况 在facesdk 的build.gradle文件中 将 compile 改为compileOnly 即可
compileOnly files('libs/facesdk.jar')
compileOnly files('libs/baidu_license.jar')
compileOnly files('libs/ast.jar')
3.下载demo 导入你的项目中 我使用的类为
public class Face_Login_Activity extends BaseActivity {
private ActivityFaceLoginBinding activityFaceLoginBinding;
private final static int MSG_INITVIEW = 1001;
private final static int MSG_DETECTTIME = 1002;
private final static int MSG_INITWAVE = 1003;
private boolean mGoodDetect = false;
private static final double ANGLE = 15;
private boolean mDetectStoped = false;
private Handler mHandler;
private String mCurTips;
private boolean mDetectTime = true;
// private ProgressBar mProgress;
private boolean mUploading = false;
private long mLastTipsTime = 0;
private int mDetectCount = 0;
private int mCurFaceId = -1;
private FaceDetectManager faceDetectManager;
private DetectRegionProcessor cropProcessor = new DetectRegionProcessor();
private WaveHelper mWaveHelper;
private WaveView mWaveview;
private int mBorderColor = Color.parseColor("#28FFFFFF");
private int mBorderWidth = 0;
private int mScreenW;
private int mScreenH;
@Override
public int getLayout() {
return R.layout.activity_face_login;
}
@Override
protected void initView(ActivityFaceLoginBinding bindView) {
activityFaceLoginBinding=bindView;
faceDetectManager = new FaceDetectManager(this);
initScreen();
mHandler = new InnerHandler(this);
mHandler.sendEmptyMessageDelayed(MSG_INITVIEW, 500);
final CameraImageSource cameraImageSource = new CameraImageSource(this);
cameraImageSource.setPreviewView(activityFaceLoginBinding.previewView);
faceDetectManager.setImageSource(cameraImageSource);
faceDetectManager.setOnFaceDetectListener(new FaceDetectManager.OnFaceDetectListener() {
@Override
public void onDetectFace(final int retCode, FaceInfo[] infos, ImageFrame frame) {
if (mUploading) {
// Log.d("DetectLoginActivity", "is uploading ,not detect time");
return;
}
// Log.d("DetectLoginActivity", "retCode is:" + retCode);
String str = "";
if (retCode == 0) {
if (infos != null && infos[0] != null) {
FaceInfo info = infos[0];
boolean distance = false;
if (info != null && frame != null) {
if (info.mWidth >= (0.9 * frame.getWidth())) {
distance = false;
str = getResources().getString(R.string.detect_zoom_out);
} else if (info.mWidth <= 0.4 * frame.getWidth()) {
distance = false;
str = getResources().getString(R.string.detect_zoom_in);
} else {
distance = true;
}
}
boolean headUpDown;
if (info != null) {
if (info.headPose[0] >= ANGLE) {
headUpDown = false;
str = getResources().getString(R.string.detect_head_up);
} else if (info.headPose[0] <= -ANGLE) {
headUpDown = false;
str = getResources().getString(R.string.detect_head_down);
} else {
headUpDown = true;
}
boolean headLeftRight;
if (info.headPose[1] >= ANGLE) {
headLeftRight = false;
str = getResources().getString(R.string.detect_head_left);
} else if (info.headPose[1] <= -ANGLE) {
headLeftRight = false;
str = getResources().getString(R.string.detect_head_right);
} else {
headLeftRight = true;
}
if (distance && headUpDown && headLeftRight) {
mGoodDetect = true;
} else {
mGoodDetect = false;
}
}
}
} else if (retCode == 1) {
str = getResources().getString(R.string.detect_head_up);
} else if (retCode == 2) {
str = getResources().getString(R.string.detect_head_down);
} else if (retCode == 3) {
str = getResources().getString(R.string.detect_head_left);
} else if (retCode == 4) {
str = getResources().getString(R.string.detect_head_right);
} else if (retCode == 5) {
str = getResources().getString(R.string.detect_low_light);
} else if (retCode == 6) {
str = getResources().getString(R.string.detect_face_in);
} else if (retCode == 7) {
str = getResources().getString(R.string.detect_face_in);
} else if (retCode == 10) {
str = getResources().getString(R.string.detect_keep);
} else if (retCode == 11) {
str = getResources().getString(R.string.detect_occ_right_eye);
} else if (retCode == 12) {
str = getResources().getString(R.string.detect_occ_left_eye);
} else if (retCode == 13) {
str = getResources().getString(R.string.detect_occ_nose);
} else if (retCode == 14) {
str = getResources().getString(R.string.detect_occ_mouth);
} else if (retCode == 15) {
str = getResources().getString(R.string.detect_right_contour);
} else if (retCode == 16) {
str = getResources().getString(R.string.detect_left_contour);
} else if (retCode == 17) {
str = getResources().getString(R.string.detect_chin_contour);
}
boolean faceChanged = true;
if (infos != null && infos[0] != null) {
Log.d("DetectLogin", "face id is:" + infos[0].face_id);
if (infos[0].face_id == mCurFaceId) {
faceChanged = false;
} else {
faceChanged = true;
}
mCurFaceId = infos[0].face_id;
}
if (faceChanged) {
showProgressBar(false);
onRefreshSuccessView(false);
}
final int resultCode = retCode;
if (!(mGoodDetect && retCode == 0)) {
if (faceChanged) {
showProgressBar(false);
onRefreshSuccessView(false);
}
}
if (retCode == 6 || retCode == 7 || retCode < 0) {
activityFaceLoginBinding.rectView.processDrawState(true);
} else {
activityFaceLoginBinding.rectView.processDrawState(false);
}
mCurTips = str;
runOnUiThread(new Runnable() {
@Override
public void run() {
if ((System.currentTimeMillis() - mLastTipsTime) > 1000) {
activityFaceLoginBinding.nameTextView.setText(mCurTips);
mLastTipsTime = System.currentTimeMillis();
}
if (mGoodDetect && resultCode == 0) {
activityFaceLoginBinding.nameTextView.setText("");
onRefreshSuccessView(true);
showProgressBar(true);
}
}
});
if (infos == null) {
mGoodDetect = false;
}
}
});
faceDetectManager.setOnTrackListener(new FaceFilter.OnTrackListener() {
@Override
public void onTrack(FaceFilter.TrackedModel trackedModel) {
if (trackedModel.meetCriteria() && mGoodDetect) {
upload(trackedModel);
mGoodDetect = false;
}
}
});
cameraImageSource.getCameraControl().setPermissionCallback(new PermissionCallback() {
@Override
public boolean onRequestPermission() {
ActivityCompat.requestPermissions(Face_Login_Activity.this,
new String[]{Manifest.permission.CAMERA}, 100);
return true;
}
});
activityFaceLoginBinding.rectView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
start();
activityFaceLoginBinding.rectView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
ICameraControl control = cameraImageSource.getCameraControl();
control.setPreviewView(activityFaceLoginBinding.previewView);
// 设置检测裁剪处理器
faceDetectManager.addPreProcessor(cropProcessor);
int orientation = getResources().getConfiguration().orientation;
boolean isPortrait = (orientation == Configuration.ORIENTATION_PORTRAIT);
if (isPortrait) {
activityFaceLoginBinding.previewView.setScaleType(PreviewView.ScaleType.FIT_WIDTH);
} else {
activityFaceLoginBinding.previewView.setScaleType(PreviewView.ScaleType.FIT_HEIGHT);
}
int rotation = getWindowManager().getDefaultDisplay().getRotation();
cameraImageSource.getCameraControl().setDisplayOrientation(rotation);
activityFaceLoginBinding.successImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (activityFaceLoginBinding.successImage.getTag() == null) {
Rect rect = activityFaceLoginBinding.rectView.getFaceRoundRect();
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) activityFaceLoginBinding.successImage.getLayoutParams();
int w = (int) getResources().getDimension(R.dimen.dp_45);
rlp.setMargins(
rect.centerX() - (w / 2),
rect.top - (w / 2),
0,
0);
activityFaceLoginBinding.successImage.setLayoutParams(rlp);
activityFaceLoginBinding.successImage.setTag("setlayout");
}
activityFaceLoginBinding. successImage.setVisibility(View.GONE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
activityFaceLoginBinding.successImage.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
activityFaceLoginBinding.successImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
});
init();
}
@Override
protected void setVM() {
}
@Override
protected void setListener() {
activityFaceLoginBinding.closeIv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
private void initScreen() {
WindowManager manager = getWindowManager();
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
mScreenW = outMetrics.widthPixels;
mScreenH = outMetrics.heightPixels;
}
@Override
protected void initData() {
}
private void initWaveview(Rect rect) {
RelativeLayout.LayoutParams waveParams = new RelativeLayout.LayoutParams(
rect.width(), rect.height());
waveParams.setMargins(rect.left, rect.top, rect.left, rect.top);
waveParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
waveParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
mWaveview = new WaveView(this);
activityFaceLoginBinding.rootView.addView(mWaveview, waveParams);
mWaveHelper = new WaveHelper(mWaveview);
mWaveview.setShapeType(WaveView.ShapeType.CIRCLE);
mWaveview.setWaveColor(
Color.parseColor("#28FFFFFF"),
Color.parseColor("#3cFFFFFF"));
mBorderColor = Color.parseColor("#28f16d7a");
mWaveview.setBorder(mBorderWidth, mBorderColor);
}
private void visibleView() {
activityFaceLoginBinding.cameraLayout.setVisibility(View.INVISIBLE);
}
private void initBrightness() {
int brightness = BrightnessTools.getScreenBrightness(this);
if (brightness < 200) {
BrightnessTools.setBrightness(this, 200);
}
}
private void init() {
FaceSDKManager.getInstance().getFaceTracker(this).set_min_face_size(200);
FaceSDKManager.getInstance().getFaceTracker(this).set_isCheckQuality(true);
// 该角度为商学,左右,偏头的角度的阀值,大于将无法检测出人脸,为了在1:n的时候分数高,注册尽量使用比较正的人脸,可自行条件角度
FaceSDKManager.getInstance().getFaceTracker(this).set_eulur_angle_thr(15, 15, 15);
FaceSDKManager.getInstance().getFaceTracker(this).set_isVerifyLive(true);
initBrightness();
}
private void start() {
Rect dRect = activityFaceLoginBinding.rectView.getFaceRoundRect();
int preGap = getResources().getDimensionPixelOffset(R.dimen.dp_50);
int w = getResources().getDimensionPixelOffset(R.dimen.dp_2);
int orientation = getResources().getConfiguration().orientation;
boolean isPortrait = (orientation == Configuration.ORIENTATION_PORTRAIT);
if (isPortrait) {
// 检测区域矩形宽度
int rWidth = mScreenW - 2 * preGap;
// 圆框宽度
int dRectW = dRect.width();
// 检测矩形和圆框偏移
int h = (rWidth - dRectW) / 2;
// Log.d("liujinhui hi is:", " h is:" + h + "d is:" + (dRect.left - 150));
int rLeft = w;
int rRight = rWidth - w;
int rTop = dRect.top - h - preGap + w;
int rBottom = rTop + rWidth - w;
// Log.d("liujinhui", " rLeft is:" + rLeft + "rRight is:" + rRight + "rTop is:" + rTop + "rBottom is:" + rBottom);
RectF newDetectedRect = new RectF(rLeft, rTop, rRight, rBottom);
cropProcessor.setDetectedRect(newDetectedRect);
} else {
int rLeft = mScreenW / 2 - mScreenH / 2 + w;
int rRight = mScreenW / 2 + mScreenH / 2 + w;
int rTop = 0;
int rBottom = mScreenH;
RectF newDetectedRect = new RectF(rLeft, rTop, rRight, rBottom);
cropProcessor.setDetectedRect(newDetectedRect);
}
faceDetectManager.start();
initWaveview(dRect);
}
@Override
protected void onStop() {
super.onStop();
faceDetectManager.stop();
mDetectStoped = true;
onRefreshSuccessView(false);
if (mWaveview != null) {
mWaveview.setVisibility(View.GONE);
mWaveHelper.cancel();
}
}
/**
*
* image 是 string 图像base64编码,每次仅支持单张图片,图片编码后大小不超过10M
* 返回登录认证的参数给客户端
* @param model
*/
private void upload(FaceFilter.TrackedModel model) {
if (mUploading) {
Log.d("liujinhui", "is uploading");
return;
}
mUploading = true;
if (model.getEvent() != FaceFilter.Event.OnLeave) {
mDetectCount++;
try {
final Bitmap face = model.cropFace();
final File file = File.createTempFile(UUID.randomUUID().toString() + "", ".jpg");
ImageUtil.resize(face, file, 200, 200);
ImageSaveUtil.saveCameraBitmap(this, face, "head_tmp.jpg");
String base64Img = "";
try {
byte[] buf = readFile(file);
base64Img = new String(Base64.encode(buf, Base64.NO_WRAP));
//此处获得base64的人脸图片 将图片传递给后台即可。
Intent intent=new Intent();
intent.putExtra("face_img",base64Img);
setResult(0,intent);
finish();
} catch (Exception e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
} else {
onRefreshSuccessView(false);
showProgressBar(false);
mUploading = false;
}
}
private void showProgressBar(final boolean show) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (show) {
if (mWaveview != null) {
mWaveview.setVisibility(View.VISIBLE);
mWaveHelper.start();
}
} else {
if (mWaveview != null) {
mWaveview.setVisibility(View.GONE);
mWaveHelper.cancel();
}
}
}
});
}
private void deleteFace(File file) {
if (file != null && file.exists()) {
file.delete();
}
}
@Override
protected void onPause() {
super.onPause();
if (mWaveview != null) {
mWaveHelper.cancel();
mWaveview.setVisibility(View.GONE);
}
}
@Override
protected void onResume() {
super.onResume();
mDetectTime = true;
if (mDetectStoped) {
faceDetectManager.start();
mDetectStoped = false;
}
}
private void onRefreshSuccessView(final boolean isShow) {
runOnUiThread(new Runnable() {
@Override
public void run() {
activityFaceLoginBinding.successImage.setVisibility(isShow ? View.VISIBLE : View.INVISIBLE);
}
});
}
private static class InnerHandler extends Handler {
private WeakReference mWeakReference;
public InnerHandler(Face_Login_Activity activity) {
super();
this.mWeakReference = new WeakReference(activity);
}
@Override
public void handleMessage(Message msg) {
if (mWeakReference == null || mWeakReference.get() == null) {
return;
}
Face_Login_Activity activity = mWeakReference.get();
if (activity == null) {
return;
}
if (msg == null) {
return;
}
switch (msg.what) {
case MSG_INITVIEW:
activity.visibleView();
break;
case MSG_DETECTTIME:
activity.mDetectTime = true;
break;
default:
break;
}
}
}
}