public class FaceUtil { private static final String TAG = FaceUtil.class.getSimpleName(); private static FaceUtil faceInstance = null; public FaceDB mFaceDB; private AFR_FSDKFace mAFR_FSDKFace; private static Context mContext = null; //face detect private AFT_FSDKVersion version = new AFT_FSDKVersion(); private AFT_FSDKEngine engine = new AFT_FSDKEngine(); private ASAE_FSDKVersion mAgeVersion = new ASAE_FSDKVersion(); private ASAE_FSDKEngine mAgeEngine = new ASAE_FSDKEngine(); private ASGE_FSDKVersion mGenderVersion = new ASGE_FSDKVersion(); private ASGE_FSDKEngine mGenderEngine = new ASGE_FSDKEngine(); private List<AFT_FSDKFace> result = new ArrayList<>(); private List<ASAE_FSDKAge> ages = new ArrayList<>(); private List<ASGE_FSDKGender> genders = new ArrayList<>(); private AFT_FSDKFace mAFT_FSDKFace = null; private boolean openFace = false; public static FaceUtil getInstance(Context context) { if(faceInstance == null) { faceInstance = new FaceUtil(context); } return faceInstance; } public FaceUtil(Context context) { mContext = context; } public void setFaceDB() { //face mFaceDB = new FaceDB(mContext.getExternalCacheDir().getPath()); Log.d(TAG,"getExternalCacheDir : "+mContext.getExternalCacheDir().getPath()); } public void initFaceDetect() { AFT_FSDKError err = engine.AFT_FSDK_InitialFaceEngine(FaceDB.appid, FaceDB.ft_key, AFT_FSDKEngine.AFT_OPF_0_HIGHER_EXT, 16, 5); Log.d(TAG, "AFT_FSDK_InitialFaceEngine =" + err.getCode()); err = engine.AFT_FSDK_GetVersion(version); Log.d(TAG, "AFT_FSDK_GetVersion:" + version.toString() + "," + err.getCode()); ASAE_FSDKError error = mAgeEngine.ASAE_FSDK_InitAgeEngine(FaceDB.appid, FaceDB.age_key); Log.d(TAG, "ASAE_FSDK_InitAgeEngine =" + error.getCode()); error = mAgeEngine.ASAE_FSDK_GetVersion(mAgeVersion); Log.d(TAG, "ASAE_FSDK_GetVersion:" + mAgeVersion.toString() + "," + error.getCode()); ASGE_FSDKError error1 = mGenderEngine.ASGE_FSDK_InitgGenderEngine(FaceDB.appid, FaceDB.gender_key); Log.d(TAG, "ASGE_FSDK_InitgGenderEngine =" + error1.getCode()); error1 = mGenderEngine.ASGE_FSDK_GetVersion(mGenderVersion); Log.d(TAG, "ASGE_FSDK_GetVersion:" + mGenderVersion.toString() + "," + error1.getCode()); } public void deInitFaceDetect() { AFT_FSDKError err = engine.AFT_FSDK_UninitialFaceEngine(); Log.d(TAG, "AFT_FSDK_UninitialFaceEngine =" + err.getCode()); ASAE_FSDKError err1 = mAgeEngine.ASAE_FSDK_UninitAgeEngine(); Log.d(TAG, "ASAE_FSDK_UninitAgeEngine =" + err1.getCode()); ASGE_FSDKError err2 = mGenderEngine.ASGE_FSDK_UninitGenderEngine(); Log.d(TAG, "ASGE_FSDK_UninitGenderEngine =" + err2.getCode()); } public boolean faceFeatureDetect(byte[] mYUVData,int width,int height) { boolean bDectectFace = false; AFT_FSDKError err =engine.AFT_FSDK_FaceFeatureDetect(mYUVData, width, height, AFT_FSDKEngine.CP_PAF_NV21, result); Log.d(TAG, "AFT_FSDK_FaceFeatureDetect =" + err.getCode()); Log.d(TAG, "Face=" + result.size()); if (!result.isEmpty()) { for (AFT_FSDKFace face : result) { Log.d(TAG, "Face:" + face.toString()); } mAFT_FSDKFace = result.get(0).clone(); bDectectFace = true; } else { Log.d(TAG,"没有检测到人脸"); bDectectFace = false; } result.clear(); return bDectectFace; } public AFT_FSDKFace getmAFT_FSDKFace() { return mAFT_FSDKFace; } public String getAge(byte[] mYUVData,int width,int height,List<ASAE_FSDKFace> face1) { String age; ASAE_FSDKError error1 = mAgeEngine.ASAE_FSDK_AgeEstimation_Image(mYUVData, width, height, AFT_FSDKEngine.CP_PAF_NV21, face1, ages); Log.d("face", "ASAE_FSDK_AgeEstimation_Image:" + error1.getCode()); if(ages.size()== 0) { Log.d(TAG, "ages.size()== 0" ); age = "年龄未知"; } else { Log.d(TAG, "age:" + ages.get(0).getAge()); age = ages.get(0).getAge() == 0 ? "年龄未知" : ages.get(0).getAge() + "岁"; } return age; } public String getGender(byte[] mYUVData,int width,int height,List<ASGE_FSDKFace> face2) { String gender; ASGE_FSDKError error2 = mGenderEngine.ASGE_FSDK_GenderEstimation_Image(mYUVData, width, height, AFT_FSDKEngine.CP_PAF_NV21, face2, genders); Log.d("face", ",ASGE_FSDK_GenderEstimation_Image:" + error2.getCode()); if(ages.size()== 0) { Log.d(TAG, "ages.size()== 0" ); gender = "性别未知"; } else { Log.d(TAG, "gender:" + genders.get(0).getGender()); gender = genders.get(0).getGender() == -1 ? "性别未知" : (genders.get(0).getGender() == 0 ? "男" : "女"); } return gender; } /** * @param path * @return */ public static Bitmap decodeImage(String path) { Bitmap res; try { ExifInterface exif = new ExifInterface(path); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); BitmapFactory.Options op = new BitmapFactory.Options(); op.inSampleSize = 1; op.inJustDecodeBounds = false; //op.inMutable = true; res = BitmapFactory.decodeFile(path, op); //rotate and scale. Matrix matrix = new Matrix(); if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { matrix.postRotate(90); } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { matrix.postRotate(180); } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { matrix.postRotate(270); } Bitmap temp = Bitmap.createBitmap(res, 0, 0, res.getWidth(), res.getHeight(), matrix, true); Log.d(TAG, "check target Image:" + temp.getWidth() + "X" + temp.getHeight()); if (!temp.equals(res)) { res.recycle(); } return temp; } catch (Exception e) { e.printStackTrace(); } return null; } public void bitmapDetect(String name,Bitmap mBitmap) { byte[] data = new byte[mBitmap.getWidth() * mBitmap.getHeight() * 3 / 2]; ImageConverter convert = new ImageConverter(); convert.initial(mBitmap.getWidth(), mBitmap.getHeight(), ImageConverter.CP_PAF_NV21); if (convert.convert(mBitmap, data)) { Log.d(TAG, "convert ok!"); } convert.destroy(); AFD_FSDKEngine engine = new AFD_FSDKEngine(); AFD_FSDKVersion version = new AFD_FSDKVersion(); List<AFD_FSDKFace> result = new ArrayList<AFD_FSDKFace>(); AFD_FSDKError err = engine.AFD_FSDK_InitialFaceEngine(FaceDB.appid, FaceDB.fd_key, AFD_FSDKEngine.AFD_OPF_0_HIGHER_EXT, 16, 5); Log.d(TAG, "AFD_FSDK_InitialFaceEngine = " + err.getCode()); if (err.getCode() != AFD_FSDKError.MOK) { // Message reg = Message.obtain(); // reg.what = MSG_CODE; // reg.arg1 = MSG_EVENT_FD_ERROR; // reg.arg2 = err.getCode(); // mUIHandler.sendMessage(reg); Log.d(TAG, "MSG_EVENT_FD_ERROR"); ToastUtil.showToast("sdk error :MSG_EVENT_FD_ERROR "+err.getCode()); } err = engine.AFD_FSDK_GetVersion(version); Log.d(TAG, "AFD_FSDK_GetVersion =" + version.toString() + ", " + err.getCode()); err = engine.AFD_FSDK_StillImageFaceDetection(data, mBitmap.getWidth(), mBitmap.getHeight(), AFD_FSDKEngine.CP_PAF_NV21, result); Log.d(TAG, "AFD_FSDK_StillImageFaceDetection =" + err.getCode() + "<" + result.size()); if (!result.isEmpty()) { AFR_FSDKVersion version1 = new AFR_FSDKVersion(); AFR_FSDKEngine engine1 = new AFR_FSDKEngine(); AFR_FSDKFace result1 = new AFR_FSDKFace(); AFR_FSDKError error1 = engine1.AFR_FSDK_InitialEngine(FaceDB.appid, FaceDB.fr_key); Log.d(TAG, "AFR_FSDK_InitialEngine = " + error1.getCode()); if (error1.getCode() != AFD_FSDKError.MOK) { // Message reg = Message.obtain(); // reg.what = MSG_CODE; // reg.arg1 = MSG_EVENT_FR_ERROR; // reg.arg2 = error1.getCode(); // mUIHandler.sendMessage(reg); Log.d(TAG, "MSG_EVENT_FR_ERROR"); ToastUtil.showToast("sdk error :MSG_EVENT_FR_ERROR "+error1.getCode()); } error1 = engine1.AFR_FSDK_GetVersion(version1); Log.d(TAG, "FR=" + version.toString() + "," + error1.getCode()); //(210, 178 - 478, 446), degree = 1 780, 2208 - 1942, 3370 error1 = engine1.AFR_FSDK_ExtractFRFeature(data, mBitmap.getWidth(), mBitmap.getHeight(), AFR_FSDKEngine.CP_PAF_NV21, new Rect(result.get(0).getRect()), result.get(0).getDegree(), result1); Log.d(TAG, "Face=" + result1.getFeatureData()[0] + "," + result1.getFeatureData()[1] + "," + result1.getFeatureData()[2] + "," + error1.getCode()); if(error1.getCode() == error1.MOK) { mAFR_FSDKFace = result1.clone(); // int width = result.get(0).getRect().width(); // int height = result.get(0).getRect().height(); // Bitmap face_bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); // Canvas face_canvas = new Canvas(face_bitmap); // face_canvas.drawBitmap(mBitmap, result.get(0).getRect(), new Rect(0, 0, width, height), null); // Message reg = Message.obtain(); // reg.what = MSG_CODE; // reg.arg1 = MSG_EVENT_REG; // reg.obj = face_bitmap; // mUIHandler.sendMessage(reg); mFaceDB.addFace(name, mAFR_FSDKFace); Log.d(TAG, "addFace MSG_EVENT_REG jxd"); ToastUtil.showToast(mContext.getString(R.string.register_face_success)+name); } else { // Message reg = Message.obtain(); // reg.what = MSG_CODE; // reg.arg1 = MSG_EVENT_NO_FEATURE; // mUIHandler.sendMessage(reg); Log.d(TAG, "MSG_EVENT_NO_FEATURE"); ToastUtil.showToast(mContext.getString(R.string.no_feature)); } error1 = engine1.AFR_FSDK_UninitialEngine(); Log.d(TAG, "AFR_FSDK_UninitialEngine : " + error1.getCode()); } else { // Message reg = Message.obtain(); // reg.what = MSG_CODE; // reg.arg1 = MSG_EVENT_NO_FACE; // mUIHandler.sendMessage(reg); Log.d(TAG, "MSG_EVENT_NO_FACE"); ToastUtil.showToast(mContext.getString(R.string.no_face)); } err = engine.AFD_FSDK_UninitialFaceEngine(); Log.d(TAG, "AFD_FSDK_UninitialFaceEngine =" + err.getCode()); } public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } public String getPath(Uri uri) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (DocumentsContract.isDocumentUri(mContext, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } // TODO handle non-primary volumes } else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(mContext, contentUri, null, null); } else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[] { split[1] }; return getDataColumn(mContext, contentUri, selection, selectionArgs); } } } String[] proj = { MediaStore.Images.Media.DATA }; Cursor actualimagecursor = mContext.getContentResolver().query(uri, proj, null, null, null); int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); actualimagecursor.moveToFirst(); String img_path = actualimagecursor.getString(actual_image_column_index); String end = img_path.substring(img_path.length() - 4); if (0 != end.compareToIgnoreCase(".jpg") && 0 != end.compareToIgnoreCase(".png")) { return null; } return img_path; } public void setFaceFunction() { openFace = SharedPreferenceUtil.getBoolean(OPEN_FACE, Constant.FACE, false); openFace = !openFace; SharedPreferenceUtil.putBoolean(OPEN_FACE, Constant.FACE, openFace); if(openFace) { ToastUtil.showToast(R.string.open_face); } else { ToastUtil.showToast(R.string.close_face); } } public boolean getFaceIsOpen() { return openFace; } }