Browse Source

face activity change & face sdk config & switchCameraByDeviceType

main
MTing 2 weeks ago
parent
commit
c8edb130c0
  1. 11
      app/src/main/AndroidManifest.xml
  2. 81
      app/src/main/java/com/baidu/idl/face/main/finance/utils/TestPopWindow.java
  3. 26
      app/src/main/java/com/ouxuan/oxface/DebugActivity.java
  4. 125
      app/src/main/java/com/ouxuan/oxface/MainActivity.java
  5. 547
      app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java
  6. 12
      app/src/main/res/drawable/finance_radius.xml
  7. 5
      app/src/main/res/drawable/gate_imageview_radius.xml
  8. 13
      app/src/main/res/drawable/gate_radius_compare.xml
  9. 10
      app/src/main/res/drawable/spot.xml
  10. 7
      app/src/main/res/layout/activity_debug.xml
  11. 219
      app/src/main/res/layout/activity_oxface_online.xml
  12. 124
      app/src/main/res/layout/layout_by_living_detection.xml
  13. 119
      app/src/main/res/layout/layout_failed_in_vivo_test.xml
  14. 37
      app/src/main/res/layout/layout_hint.xml
  15. 70
      app/src/main/res/layout/layout_no_face_detected.xml
  16. 108
      app/src/main/res/layout/layout_quality_test_failed.xml
  17. BIN
      app/src/main/res/mipmap-hdpi/ic_finance_back.png
  18. BIN
      app/src/main/res/mipmap-hdpi/ic_finance_setting.png
  19. BIN
      app/src/main/res/mipmap-hdpi/ic_finance_view.png
  20. BIN
      app/src/main/res/mipmap-hdpi/ic_icon_develop_fail.png
  21. BIN
      app/src/main/res/mipmap-hdpi/ic_icon_develop_success.png
  22. BIN
      app/src/main/res/mipmap-hdpi/ic_image_video.png
  23. BIN
      app/src/main/res/mipmap-hdpi/ic_loading_blue.png
  24. BIN
      app/src/main/res/mipmap-hdpi/ic_loading_grey.png
  25. BIN
      app/src/main/res/mipmap-xxhdpi/ic_finance_back.png
  26. BIN
      app/src/main/res/mipmap-xxhdpi/ic_finance_setting.png
  27. BIN
      app/src/main/res/mipmap-xxhdpi/ic_finance_view.png
  28. BIN
      app/src/main/res/mipmap-xxhdpi/ic_icon_develop_fail.png
  29. BIN
      app/src/main/res/mipmap-xxhdpi/ic_icon_develop_success.png
  30. BIN
      app/src/main/res/mipmap-xxhdpi/ic_image_video.png
  31. BIN
      app/src/main/res/mipmap-xxhdpi/ic_loading_blue.png
  32. BIN
      app/src/main/res/mipmap-xxhdpi/ic_loading_grey.png
  33. 17
      app/src/main/res/values/colors.xml
  34. 63
      app/src/main/res/values/dimens.xml
  35. 24
      financelibrary/src/main/java/com/baidu/idl/face/main/finance/manager/FaceSDKManager.java
  36. 16
      financelibrary/src/main/java/com/baidu/idl/face/main/finance/utils/BitmapUtils.java

11
app/src/main/AndroidManifest.xml

@ -7,6 +7,11 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 相机权限 -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<!-- 24小时无人值守所需权限 --> <!-- 24小时无人值守所需权限 -->
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
@ -103,6 +108,12 @@
android:name=".DebugActivity" android:name=".DebugActivity"
android:exported="false" android:exported="false"
android:theme="@style/Theme.OxFaceLogin" /> android:theme="@style/Theme.OxFaceLogin" />
<!-- 人脸识别在线检测Activity -->
<activity
android:name=".OXFaceOnlineActivity"
android:exported="false"
android:theme="@style/Theme.OxFaceLogin" />
</application> </application>
</manifest> </manifest>

81
app/src/main/java/com/baidu/idl/face/main/finance/utils/TestPopWindow.java

@ -0,0 +1,81 @@
package com.baidu.idl.face.main.finance.utils;
import android.content.Context;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;
import com.baidu.idl.main.facesdk.financelibrary.R;
public class TestPopWindow extends PopupWindow {
private String TAG = "TestPopWindow";
private final Context gContext;
private View view;
public TestPopWindow(Context context) {
this(context, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
Log.d(TAG, "TestPopWindow: " + ViewGroup.LayoutParams.WRAP_CONTENT
+ "bbb:" + ViewGroup.LayoutParams.WRAP_CONTENT);
}
public TestPopWindow(Context context, int width, int height) {
super(context);
this.gContext = context;
view = View.inflate(context, R.layout.layout_no_face_detected, null);
view.findViewById(R.id.retest_detectBtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mOnClickFinance.rester(true);
}
});
view.findViewById(R.id.back_homeBtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mOnClickFinance.rester(false);
}
});
setContentView(view);
// 设置窗口的高和宽
setWidth(width);
setHeight(height);
// 设置弹窗内科点击
setTouchable(true);
setOutsideTouchable(true);
setFocusable(true);
// TODO去除背景
setBackgroundDrawable(null);
}
/**
* 显示popupWindow
*/
public void showPopupWindow(View parent) {
if (!this.isShowing()) {
// 以下拉方式显示popupwindow调整位置使其不会完全遮挡预览界面
this.showAtLocation(parent, Gravity.CENTER, 0, -50);
} else {
this.dismiss();
}
}
public void closePopupWindow() {
if (this.isShowing()) {
this.dismiss();
}
}
public void setmOnClickFinance(OnClickFinance mOnClickFinance) {
this.mOnClickFinance = mOnClickFinance;
}
public OnClickFinance mOnClickFinance;
public interface OnClickFinance {
void rester(boolean isReTest);
}
}

26
app/src/main/java/com/ouxuan/oxface/DebugActivity.java

@ -171,6 +171,15 @@ public class DebugActivity extends Activity {
} }
}); });
// 人脸识别测试按钮
Button btnFaceRecognitionTest = findViewById(R.id.btnFaceRecognitionTest);
btnFaceRecognitionTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startFaceRecognitionTest();
}
});
// 关闭按钮 // 关闭按钮
Button btnClose = findViewById(R.id.btnClose); Button btnClose = findViewById(R.id.btnClose);
btnClose.setOnClickListener(new View.OnClickListener() { btnClose.setOnClickListener(new View.OnClickListener() {
@ -461,6 +470,23 @@ public class DebugActivity extends Activity {
} }
/** /**
* 启动人脸识别测试
*/
private void startFaceRecognitionTest() {
logMessage("启动人脸识别测试...");
try {
Intent intent = new Intent(this, OXFaceOnlineActivity.class);
startActivity(intent);
logMessage("已启动人脸识别测试界面");
showToast("已启动人脸识别测试界面");
} catch (Exception e) {
Log.e(TAG, "启动人脸识别测试失败", e);
logMessage("启动人脸识别测试失败: " + e.getMessage());
showToast("启动人脸识别测试失败");
}
}
/**
* 在日志输出区域添加消息 * 在日志输出区域添加消息
* @param message 要添加的消息 * @param message 要添加的消息
*/ */

125
app/src/main/java/com/ouxuan/oxface/MainActivity.java

@ -59,6 +59,7 @@ public class MainActivity extends AppCompatActivity {
private DeviceSelectDataManager deviceSelectDataManager; // 设备选择数据管理器 private DeviceSelectDataManager deviceSelectDataManager; // 设备选择数据管理器
private KeepAliveManager keepAliveManager; // 保持活跃管理器 private KeepAliveManager keepAliveManager; // 保持活跃管理器
private AutoStartManager autoStartManager; // 自启动管理器 private AutoStartManager autoStartManager; // 自启动管理器
private Dialog currentDialog; // 用于跟踪当前显示的Dialog防止WindowLeaked错误
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -110,6 +111,9 @@ public class MainActivity extends AppCompatActivity {
// 设置长按登录按钮显示日志路径信息调试功能 // 设置长按登录按钮显示日志路径信息调试功能
setupLogPathDebug(); setupLogPathDebug();
//切换第六批设备
switchCameraByDeviceType(5);
} }
/** /**
@ -170,14 +174,17 @@ public class MainActivity extends AppCompatActivity {
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override @Override
public void run() { public void run() {
if (loginDataManager.isLoggedIn()) {
showToast("自动登录成功!");
showLoginSuccessDialog(loginDataManager.getLoginData());
} else {
android.util.Log.w("MainActivity", "自动登录失败,本地数据可能已失效");
showToast("自动登录失败,请手动登录");
// 清除可能已失效的登录数据
loginDataManager.clearLoginData();
// 检查Activity是否仍然有效
if (!isFinishing() && !isDestroyed()) {
if (loginDataManager.isLoggedIn()) {
showToast("自动登录成功!");
showLoginSuccessDialog(loginDataManager.getLoginData());
} else {
android.util.Log.w("MainActivity", "自动登录失败,本地数据可能已失效");
showToast("自动登录失败,请手动登录");
// 清除可能已失效的登录数据
loginDataManager.clearLoginData();
}
} }
} }
}, 1000); // 延迟1秒 }, 1000); // 延迟1秒
@ -305,10 +312,12 @@ public class MainActivity extends AppCompatActivity {
// 打印存储的data // 打印存储的data
android.util.Log.d("MainActivity", "Login Data: " + data.toString()); android.util.Log.d("MainActivity", "Login Data: " + data.toString());
// 显示登录成功弹框传入登录数据
showToast("登录成功!");
showLoginSuccessDialog(data);
// 检查Activity是否仍然有效再显示Dialog
if (!isFinishing() && !isDestroyed()) {
// 显示登录成功弹框传入登录数据
showToast("登录成功!");
showLoginSuccessDialog(data);
}
} }
@Override @Override
@ -384,6 +393,7 @@ public class MainActivity extends AppCompatActivity {
private void showLoginSuccessDialog(PadApiService.PadLoginResponse loginData) { private void showLoginSuccessDialog(PadApiService.PadLoginResponse loginData) {
// 创建自定义弹框 // 创建自定义弹框
Dialog dialog = new Dialog(this); Dialog dialog = new Dialog(this);
currentDialog = dialog; // 保存Dialog引用以防止WindowLeaked错误
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_login_success); dialog.setContentView(R.layout.dialog_login_success);
@ -437,6 +447,7 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
dialog.dismiss(); dialog.dismiss();
currentDialog = null; // 清除引用
} }
}); });
@ -496,6 +507,7 @@ public class MainActivity extends AppCompatActivity {
// 显示成功消息并关闭弹框 // 显示成功消息并关闭弹框
showToast("进入 " + selectedPlatform + " 成功!"); showToast("进入 " + selectedPlatform + " 成功!");
dialog.dismiss(); dialog.dismiss();
currentDialog = null; // 清除引用
// 这里可以添加跳转到主界面的逻辑 // 这里可以添加跳转到主界面的逻辑
} }
@ -697,6 +709,7 @@ public class MainActivity extends AppCompatActivity {
initializeFaceSDKIfNeeded(); initializeFaceSDKIfNeeded();
dialog.dismiss(); dialog.dismiss();
currentDialog = null; // 清除引用
// 这里可以添加跳转到主界面的逻辑 // 这里可以添加跳转到主界面的逻辑
} }
@ -769,6 +782,19 @@ public class MainActivity extends AppCompatActivity {
android.util.Log.d("MainActivity", logMessage); android.util.Log.d("MainActivity", logMessage);
LogManager.logInfo("FaceSDK", logMessage); LogManager.logInfo("FaceSDK", logMessage);
// 先检查和初始化配置文件
final boolean configSuccess = initAndCheckFaceConfig(this);
// 在UI线程显示配置文件状态提示
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,
configSuccess ? "配置文件加载成功" : "初始配置失败,已重置为默认配置",
Toast.LENGTH_SHORT).show();
}
});
// 获取FaceSDKManager实例 // 获取FaceSDKManager实例
com.baidu.idl.face.main.finance.manager.FaceSDKManager faceSDKManager = com.baidu.idl.face.main.finance.manager.FaceSDKManager faceSDKManager =
com.baidu.idl.face.main.finance.manager.FaceSDKManager.getInstance(); com.baidu.idl.face.main.finance.manager.FaceSDKManager.getInstance();
@ -865,11 +891,11 @@ public class MainActivity extends AppCompatActivity {
android.util.Log.e("MainActivity", logMessage, e); android.util.Log.e("MainActivity", logMessage, e);
LogManager.logError("FaceSDK", logMessage, e); LogManager.logError("FaceSDK", logMessage, e);
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override
public void run() {
showToast("人脸SDK初始化异常: " + e.getMessage());
}
});
@Override
public void run() {
showToast("人脸SDK初始化异常: " + e.getMessage());
}
});
} }
} }
@ -887,6 +913,9 @@ public class MainActivity extends AppCompatActivity {
android.util.Log.d("MainActivity", logMessage); android.util.Log.d("MainActivity", logMessage);
LogManager.logInfo("FaceSDK", logMessage); LogManager.logInfo("FaceSDK", logMessage);
// 在初始化模型前再次检查配置文件确保配置已正确加载
initAndCheckFaceConfig(this);
faceSDKManager.initModel(this, new com.baidu.idl.face.main.finance.listener.SdkInitListener() { faceSDKManager.initModel(this, new com.baidu.idl.face.main.finance.listener.SdkInitListener() {
@Override @Override
public void initStart() { public void initStart() {
@ -941,6 +970,39 @@ public class MainActivity extends AppCompatActivity {
} }
} }
/**
* 根据设备类型切换摄像头配置
* @param deviceType 设备类型5表示第6批设备其他值表示非第6批设备
*/
private void switchCameraByDeviceType(int deviceType) {
try {
// 获取FaceSDKManager实例
com.baidu.idl.face.main.finance.manager.FaceSDKManager faceSDKManager =
com.baidu.idl.face.main.finance.manager.FaceSDKManager.getInstance();
// 调用FaceSDKManager中的方法
faceSDKManager.switchCameraByDeviceType(deviceType);
String logMessage = "已根据设备类型(" + deviceType + ")切换摄像头配置";
android.util.Log.d("MainActivity", logMessage);
LogManager.logInfo("FaceSDK", logMessage);
// 显示切换成功提示
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this,
"摄像头配置已切换为" + (deviceType == 5 ? "第6批" : "非第6批") + "设备",
Toast.LENGTH_SHORT).show();
}
});
} catch (Exception e) {
String errorMessage = "切换摄像头配置失败: " + e.getMessage();
android.util.Log.e("MainActivity", errorMessage, e);
LogManager.logError("FaceSDK", errorMessage, e);
}
}
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
@ -964,6 +1026,12 @@ public class MainActivity extends AppCompatActivity {
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
// 关闭任何正在显示的Dialog以防止WindowLeaked错误
if (currentDialog != null && currentDialog.isShowing()) {
currentDialog.dismiss();
currentDialog = null;
}
LogManager.logOperation("MainActivity", "主界面正在销毁"); LogManager.logOperation("MainActivity", "主界面正在销毁");
// 只在应用真正退出时才停止保持活跃 // 只在应用真正退出时才停止保持活跃
@ -1239,4 +1307,27 @@ public class MainActivity extends AppCompatActivity {
showToast("自启动管理器未初始化"); showToast("自启动管理器未初始化");
} }
} }
/**
* 初始化并检查人脸识别配置文件
* @param context 上下文
* @return 配置文件是否已成功初始化
*/
private boolean initAndCheckFaceConfig(Context context) {
boolean isFinanceConfigExit = com.baidu.idl.face.main.finance.utils.FinanceConfigUtils.isConfigExit(context);
boolean isFinanceInitConfig = com.baidu.idl.face.main.finance.utils.FinanceConfigUtils.initConfig();
String logMessage = "配置文件状态: 存在=" + isFinanceConfigExit + ", 初始化=" + isFinanceInitConfig;
android.util.Log.d("MainActivity", logMessage);
if (isFinanceInitConfig && isFinanceConfigExit) {
LogManager.logInfo("FaceSDK", "配置文件加载成功");
return true;
} else {
LogManager.logWarning("FaceSDK", "初始配置失败,将重置文件内容为默认配置");
// 修改为默认配置
com.baidu.idl.face.main.finance.utils.FinanceConfigUtils.modityJson();
return false;
}
}
} }

547
app/src/main/java/com/ouxuan/oxface/OXFaceOnlineActivity.java

@ -0,0 +1,547 @@
package com.ouxuan.oxface;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.RectF;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.baidu.idl.face.main.finance.activity.BaseActivity;
import com.baidu.idl.face.main.finance.callback.CameraDataCallback;
import com.baidu.idl.face.main.finance.callback.FaceDetectCallBack;
import com.baidu.idl.face.main.finance.camera.AutoTexturePreviewView;
import com.baidu.idl.face.main.finance.camera.CameraPreviewManager;
import com.baidu.idl.face.main.finance.manager.FaceSDKManager;
import com.baidu.idl.face.main.finance.model.LivenessModel;
import com.baidu.idl.face.main.finance.model.SingleBaseConfig;
import com.baidu.idl.face.main.finance.utils.BitmapUtils;
import com.baidu.idl.face.main.finance.utils.FaceOnDrawTexturViewUtil;
import com.baidu.idl.face.main.finance.utils.TestPopWindow;
import com.baidu.idl.main.facesdk.FaceInfo;
import com.baidu.idl.main.facesdk.model.BDFaceImageInstance;
import com.ouxuan.oxface.utils.LogManager;
/**
* 简化版人脸识别界面 - 只显示视频流
*/
public class OXFaceOnlineActivity extends BaseActivity implements View.OnClickListener {
private static final float MIN_FACE_AREA = 1500; //人脸靠近阈值: 人脸面积在屏幕中的像素乘积
private static final String TAG = "OXFaceOnlineActivity";
private static final int CAMERA_PERMISSION_REQUEST_CODE = 1001;
// 图片越大性能消耗越大也可以选择640*480 1280*720
private static final int PREFER_WIDTH = SingleBaseConfig.getBaseConfig().getRgbAndNirWidth();
private static final int PERFER_HEIGH = SingleBaseConfig.getBaseConfig().getRgbAndNirHeight();
private Context mContext;
private AutoTexturePreviewView mAutoCameraPreviewView;
private TextureView mDrawDetectFaceView;
private RelativeLayout relativeLayout;
private boolean isNeedCamera = true;
private RectF rectF;
private Paint paint;
private Paint paintBg;
private boolean liveStatus;
private LivenessModel currentLivenessModel;
// 新增的视图元素
private TextView preText;
private ImageView previewView;
private RelativeLayout preViewRelativeLayout;
private TextView deveLop;
private RelativeLayout deveLopRelativeLayout;
private ImageView developView;
private TextView preToastText;
private TextView detectSurfaceText;
private ImageView isCheckImage;
private ImageView mFaceDetectImageView;
private TextView mTvDetect;
private TextView mTvLive;
private TextView mTvLiveScore;
private TextView mTvAllTime;
private RelativeLayout progressLayout;
private RelativeLayout layoutCompareStatus;
private TextView textCompareStatus;
private ImageView progressBarView;
private RelativeLayout payHintRl;
private boolean mIsPayHint = true;
private boolean count = true;
private RelativeLayout financeQualityTestFailed;
private TextView qualityTestTimeTv;
private TextView qualityDetectedTv;
private TextView qualityShelteredPart;
private Button qualityRetestDetectBtn;
private RelativeLayout financeByLivingDetection;
private RelativeLayout financeFailedInVivoTest;
private TextView failedInVivoTestRgb;
private TextView failedInVivoTestNir;
private TextView failedInVivoTestDepth;
private TextView failedInVivoTestTime;
private TextView failedInVivoTestFrames;
private TextView byLivingDetectionRgb;
private TextView byLivingDetectionNir;
private TextView byLivingDetectionDepth;
private TextView byLivingTetectionTime;
private TextView byLivingDetectionFrames;
private ImageView qualityDetectRegImageItem;
private ImageView noDetectRegImageItem;
private ImageView detectRegImageItem;
private TestPopWindow testPopWindow;
private View saveCamera;
private boolean isSaveImage;
private View spot;
private boolean isCheck = false;
private boolean isTime = true;
private long searshTime;
private boolean isCompareCheck = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_oxface_online);
mContext = this;
initView();
// 检查并请求相机权限
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.CAMERA},
CAMERA_PERMISSION_REQUEST_CODE);
} else {
LogManager.logInfo(TAG, "相机权限已授予");
}
LogManager.logInfo(TAG, "OXFaceOnlineActivity onCreate");
}
/**
* View
*/
private void initView() {
LogManager.logInfo(TAG, "初始化界面视图");
// 获取整个布局
relativeLayout = findViewById(R.id.all_relative);
// 单目摄像头RGB 图像预览
mAutoCameraPreviewView = findViewById(R.id.auto_camera_preview_view);
// 画人脸框
rectF = new RectF();
paint = new Paint();
paintBg = new Paint();
mDrawDetectFaceView = findViewById(R.id.draw_detect_face_view);
mDrawDetectFaceView.setOpaque(false);
mDrawDetectFaceView.setKeepScreenOn(true);
LogManager.logInfo(TAG, "镜像设置getRgbRevert"+SingleBaseConfig.getBaseConfig().getRgbRevert());
//TODO 还需要根据实际情况继续调整摄像头镜像参数
android.util.Log.d( "OXFaceOnlineActivity", ": 666666" + SingleBaseConfig.getBaseConfig().getRgbRevert());
if (SingleBaseConfig.getBaseConfig().getRgbRevert()){
mDrawDetectFaceView.setRotationY(180);
}else{
// mDrawDetectFaceView.setRotationY(0);
}
// 返回
ImageView mButReturn = findViewById(R.id.btn_back);
mButReturn.setOnClickListener(this);
// ***************预览模式*************
// 导航栏
// preText = findViewById(R.id.preview_text);
// if (preText != null) {
// preText.setOnClickListener(this);
// preText.setTextColor(Color.parseColor("#ffffff"));
// }
// previewView = findViewById(R.id.preview_view);
// 信息展示
preViewRelativeLayout = findViewById(R.id.yvlan_relativeLayout);
preToastText = findViewById(R.id.pre_toast_text);
progressLayout = findViewById(R.id.progress_layout);
progressBarView = findViewById(R.id.progress_bar_view);
// 隐藏圆形进度条
if (progressLayout != null) {
progressLayout.setVisibility(View.GONE);
}
// 预览模式下提示
payHintRl = findViewById(R.id.pay_hintRl);
// ***************开发模式*************
// 导航栏
// deveLop = findViewById(R.id.develop_text);
// if (deveLop != null) {
// deveLop.setOnClickListener(this);
// deveLop.setTextColor(Color.parseColor("#a9a9a9"));
// }
// developView = findViewById(R.id.develop_view);
// if (developView != null) {
// developView.setVisibility(View.GONE);
// }
// 信息展示
// deveLopRelativeLayout = findViewById(R.id.kaifa_relativeLayout);
// isCheckImage = findViewById(R.id.is_check_image);
// detectSurfaceText = findViewById(R.id.detect_surface_text);
// if (detectSurfaceText != null) {
// detectSurfaceText.setVisibility(View.GONE);
// }
// 送检RGB 图像回显
// mFaceDetectImageView = findViewById(R.id.face_detect_image_view);
// if (mFaceDetectImageView != null) {
// mFaceDetectImageView.setVisibility(View.GONE);
// }
// 检测耗时
// mTvDetect = findViewById(R.id.tv_detect_time);
// RGB活体
// mTvLive = findViewById(R.id.tv_rgb_live_time);
// mTvLiveScore = findViewById(R.id.tv_rgb_live_score);
// 总耗时
// mTvAllTime = findViewById(R.id.tv_all_time);
layoutCompareStatus = findViewById(R.id.layout_compare_status);
if (layoutCompareStatus != null) {
layoutCompareStatus.setVisibility(View.GONE);
}
textCompareStatus = findViewById(R.id.text_compare_status);
// 存图按钮
saveCamera = findViewById(R.id.save_camera);
if (saveCamera != null) {
saveCamera.setOnClickListener(this);
saveCamera.setVisibility(View.GONE);
}
spot = findViewById(R.id.spot);
// 质量检测未通过
financeQualityTestFailed = findViewById(R.id.finance_quality_test_failed);
qualityTestTimeTv = findViewById(R.id.quality_test_timeTv);
qualityDetectedTv = findViewById(R.id.quality_detectedTv);
qualityShelteredPart = findViewById(R.id.quality_sheltered_part);
qualityRetestDetectBtn = findViewById(R.id.quality_retest_detectBtn);
if (qualityRetestDetectBtn != null) {
qualityRetestDetectBtn.setOnClickListener(this);
}
// 活体通过
financeByLivingDetection = findViewById(R.id.finance_by_living_detection);
byLivingDetectionRgb = findViewById(R.id.by_living_detection_rgb);
byLivingDetectionNir = findViewById(R.id.by_living_detection_nir);
byLivingDetectionDepth = findViewById(R.id.by_living_detection_depth);
byLivingTetectionTime = findViewById(R.id.by_living_detection_time);
byLivingDetectionFrames = findViewById(R.id.by_living_detection_Frames);
Button byLivingDetectionBtn = findViewById(R.id.by_living_detection_btn);
if (byLivingDetectionBtn != null) {
byLivingDetectionBtn.setOnClickListener(this);
}
detectRegImageItem = findViewById(R.id.detect_reg_image_item);
// 活体未通过
financeFailedInVivoTest = findViewById(R.id.finance_failed_in_vivo_test);
failedInVivoTestRgb = findViewById(R.id.failed_in_vivo_test_rgb);
failedInVivoTestNir = findViewById(R.id.failed_in_vivo_test_nir);
failedInVivoTestDepth = findViewById(R.id.failed_in_vivo_test_depth);
failedInVivoTestTime = findViewById(R.id.failed_in_vivo_test_time);
failedInVivoTestFrames = findViewById(R.id.failed_in_vivo_test_Frames);
Button failed_in_vivo_testBtn = findViewById(R.id.failed_in_vivo_testBtn);
if (failed_in_vivo_testBtn != null) {
failed_in_vivo_testBtn.setOnClickListener(this);
}
noDetectRegImageItem = findViewById(R.id.no_detect_reg_image_item);
testPopWindow = new TestPopWindow(this,
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
testPopWindow.setmOnClickFinance(new TestPopWindow.OnClickFinance() {
@Override
public void rester(boolean isReTest) {
// 重新检测
if (isReTest) {
if (testPopWindow != null) {
testPopWindow.closePopupWindow();
}
if (payHintRl != null) {
payHintRl.setVisibility(View.GONE);
}
count = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (count) {
isNeedCamera = true;
}
}
}, 500); // 延迟0.5秒执行
} else {
if (testPopWindow != null) {
testPopWindow.closePopupWindow();
}
finish();
}
}
});
}
@Override
protected void onResume() {
super.onResume();
// 只有在拥有相机权限时才启动预览
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
startTestOpenDebugRegisterFunction();
}
LogManager.logInfo(TAG, "OXFaceOnlineActivity onResume");
}
private void startTestOpenDebugRegisterFunction() {
LogManager.logInfo(TAG, "启动摄像头预览");
// 设置摄像头方向
if (SingleBaseConfig.getBaseConfig().getRBGCameraId() != -1){
CameraPreviewManager.getInstance().setCameraFacing(SingleBaseConfig.getBaseConfig().getRBGCameraId());
} else {
CameraPreviewManager.getInstance().setCameraFacing(CameraPreviewManager.CAMERA_FACING_FRONT);
}
CameraPreviewManager.getInstance().startPreview(mContext, mAutoCameraPreviewView,
PREFER_WIDTH, PERFER_HEIGH, new CameraDataCallback() {
@Override
public void onGetCameraData(byte[] data, Camera camera, int width, int height) {
// 摄像头预览数据进行人脸检测
if (isNeedCamera) {
FaceSDKManager.getInstance().onDetectCheck(data, null, null,
height, width, 1, new FaceDetectCallBack() {
@Override
public void onFaceDetectCallback(LivenessModel livenessModel) {
// 开发模式结果输出
checkOpenDebugResult(livenessModel);
}
@Override
public void onTip(int code, String msg) {
LogManager.logInfo(TAG, "人脸检测提示 - 代码: " + code + ", 消息: " + msg);
}
@Override
public void onFaceDetectDarwCallback(LivenessModel livenessModel) {
// 绘制人脸框
showFrame(livenessModel);
}
});
}
}
});
}
/**
* 绘制人脸框
*/
private void showFrame(final LivenessModel model) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Canvas canvas = mDrawDetectFaceView.lockCanvas();
if (canvas == null) {
mDrawDetectFaceView.unlockCanvasAndPost(canvas);
return;
}
if (model == null) {
// 清空canvas
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
mDrawDetectFaceView.unlockCanvasAndPost(canvas);
return;
}
FaceInfo[] faceInfos = model.getTrackFaceInfo();
if (faceInfos == null || faceInfos.length == 0) {
// 清空canvas
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
mDrawDetectFaceView.unlockCanvasAndPost(canvas);
return;
}
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
for (int i = 0 ; i < faceInfos.length;i++) {
FaceInfo faceInfo = faceInfos[i];
rectF.set(FaceOnDrawTexturViewUtil.getFaceRectTwo(faceInfo));
// 检测图片的坐标和显示的坐标不一样需要转换
FaceOnDrawTexturViewUtil.mapFromOriginalRect(rectF,
mAutoCameraPreviewView, model.getBdFaceImageInstance());
// 人脸框颜色
FaceOnDrawTexturViewUtil.drawFaceColor(paint, paintBg, liveStatus, model);
// 绘制人脸框
FaceOnDrawTexturViewUtil.drawRect(canvas,
rectF, paint, 5f, 50f, 25f);
}
// 清空canvas
mDrawDetectFaceView.unlockCanvasAndPost(canvas);
}
});
}
@Override
public void onClick(View view) {
int id = view.getId();
if (id == R.id.btn_back) {
finish();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
LogManager.logInfo(TAG, "相机权限已授予,启动摄像头预览");
startTestOpenDebugRegisterFunction();
} else {
LogManager.logError(TAG, "相机权限被拒绝");
Toast.makeText(this, "需要相机权限才能使用人脸识别功能", Toast.LENGTH_LONG).show();
finish();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
LogManager.logInfo(TAG, "OXFaceOnlineActivity onDestroy");
}
// ***************开发模式结果输出*************
private void checkOpenDebugResult(final LivenessModel livenessModel) {
// 当未检测到人脸UI显示
runOnUiThread(new Runnable() {
@Override
public void run() {
layoutCompareStatus.setBackgroundColor(Color.parseColor("#CC000000"));
if (livenessModel == null) {
liveStatus = false;
layoutCompareStatus.setVisibility(View.GONE);
// mFaceDetectImageView.setImageResource(R.mipmap.ic_image_video);
// mTvDetect.setText(String.format("检测耗时 :%s ms", 0));
// mTvLive.setText(String.format("RGB活体检测耗时 :%s ms", 0));
// mTvLiveScore.setText(String.format("RGB活体检测结果 :%s", false));
// mTvAllTime.setText(String.format("总耗时 :%s ms", 0));
return;
}
BDFaceImageInstance image = livenessModel.getBdFaceImageInstance();
if (image != null) {
// mFaceDetectImageView.setImageBitmap(BitmapUtils.getInstaceBmp(image));
float faceArea = livenessModel.getFaceInfo().width * livenessModel.getFaceInfo().height;
image.destory();
// 新增人脸过小检测
if (faceArea < MIN_FACE_AREA) {
layoutCompareStatus.setVisibility(View.VISIBLE);
textCompareStatus.setTextColor(Color.parseColor("#fec133"));
textCompareStatus.setText("请靠近设备");
return;
}
}
// 模糊结果过滤
float blur = livenessModel.getFaceInfo().bluriness;
if (blur > SingleBaseConfig.getBaseConfig().getBlur()) {
//照片模糊
layoutCompareStatus.setVisibility(View.VISIBLE);
textCompareStatus.setTextColor(Color.parseColor("#fec133"));
textCompareStatus.setText("人脸模糊,请靠近");
return;
}
//质量检测
if (!livenessModel.isQualityCheck()) {
liveStatus = false;
} else {
// 活体检测逻辑
if (SingleBaseConfig.getBaseConfig().isLivingControl()) {
if (livenessModel.isRGBLiveStatus()) {
liveStatus = true;
layoutCompareStatus.setVisibility(View.VISIBLE);
textCompareStatus.setTextColor(Color.parseColor("#009874"));
textCompareStatus.setText("通过活体检测");
} else {
liveStatus = false;
layoutCompareStatus.setVisibility(View.VISIBLE);
textCompareStatus.setTextColor(Color.parseColor("#fec133"));
textCompareStatus.setText("未通过活体检测");
return;
}
}
}
FaceInfo faceInfo = livenessModel.getFaceInfo();
if (faceInfo.bestImageScore < SingleBaseConfig.getBaseConfig().getBestImageScore()) {
layoutCompareStatus.setVisibility(View.VISIBLE);
textCompareStatus.setTextColor(Color.parseColor("#fec133"));
textCompareStatus.setText("阈值低于" + SingleBaseConfig.getBaseConfig().getBestImageScore());
return;
}
//通过检测
if (livenessModel != null) {
checkResultOnline(livenessModel);//在线人脸检测
} else {
currentLivenessModel = null;
}
}
});
}
private void checkResultOnline(LivenessModel livenessModel) {
this.currentLivenessModel = livenessModel;
// 当未检测到人脸UI显示
runOnUiThread(new Runnable() {
@Override
public void run() {
if (livenessModel == null) {
return;
}
String base64img = getFaceImageBase64(currentLivenessModel);
if (base64img != null) {
// Log.i(TAG, "checkResultOnline: " + base64img);
Log.i(TAG, "checkResultOnline: Yes! Got a base64img!" );
} else {
Log.i(TAG, "run:checkResultOnline base64img score too low ");
layoutCompareStatus.setVisibility(View.VISIBLE);
textCompareStatus.setTextColor(Color.parseColor("#fec133"));
textCompareStatus.setText("请重新识别");
}
}
});
}
private String getFaceImageBase64(LivenessModel livenessModel) {
if (livenessModel == null) return null;
FaceInfo faceInfo = livenessModel.getFaceInfo();
if (true) { //判定条件
BDFaceImageInstance image = livenessModel.getBdFaceImageInstance();
Bitmap bitmap = BitmapUtils.getInstaceBmp(image);
String bitmap_str = BitmapUtils.bitmapToBase64(bitmap);
image.destory();
return bitmap_str; // 简化实现实际项目中需要实现 bitmap base64 的功能
} else {
return null;
}
}
}

12
app/src/main/res/drawable/finance_radius.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 填充的颜色 -->
<solid android:color="#CC000000" />
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners android:radius="0dp" />
</shape>

5
app/src/main/res/drawable/gate_imageview_radius.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置按钮的四个角为弧形 -->
<corners android:radius="5dp" />
</shape>

13
app/src/main/res/drawable/gate_radius_compare.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 填充的颜色 -->
<solid android:color="#CC000000" />
<!-- <solid android:color="#CCFFFFFF" />-->
<!-- 设置按钮的四个角为弧形 -->
<!-- android:radius 弧形的半径 -->
<corners android:radius="8dp" />
</shape>

10
app/src/main/res/drawable/spot.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 填充的颜色 -->
<solid android:color="#F34B60" />
<!-- 设置按钮的四个角为弧形 -->
<corners
android:radius="6dp" />
</shape>

7
app/src/main/res/layout/activity_debug.xml

@ -193,15 +193,14 @@
android:textSize="12sp" /> android:textSize="12sp" />
<Button <Button
android:id="@+id/btnPlaceholder1"
android:id="@+id/btnFaceRecognitionTest"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text="占位符1"
android:text="人脸识别测试"
android:layout_marginStart="4dp" android:layout_marginStart="4dp"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:textSize="12sp"
android:visibility="invisible" />
android:textSize="12sp" />
<Button <Button
android:id="@+id/btnPlaceholder2" android:id="@+id/btnPlaceholder2"

219
app/src/main/res/layout/activity_oxface_online.xml

@ -0,0 +1,219 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/all_relative"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000">
<!-- 摄像头预览区域 -->
<com.baidu.idl.face.main.finance.camera.AutoTexturePreviewView
android:id="@+id/auto_camera_preview_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000" />
<!-- 人脸框绘制区域 -->
<TextureView
android:id="@+id/draw_detect_face_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- 圆形进度条 -->
<RelativeLayout
android:id="@+id/progress_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/progress_bar_view"
android:layout_width="355dp"
android:layout_height="355dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@mipmap/ic_loading_grey" />
</RelativeLayout>
<!-- 提示文本 -->
<TextView
android:id="@+id/pre_toast_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="100dp"
android:gravity="center_horizontal"
android:text="请保持面部在取景框内"
android:textColor="#ffffff"
android:textSize="22sp"
android:visibility="gone" />
<!-- 信息展示部分 -->
<RelativeLayout
android:id="@+id/yvlan_relativeLayout"
android:layout_width="match_parent"
android:layout_height="127dp"
android:layout_alignParentBottom="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="5dp"
android:background="@drawable/finance_radius"
android:orientation="horizontal"
android:visibility="gone">
<include layout="@layout/layout_hint"
android:id="@+id/pay_hintRl" />
</RelativeLayout>
<!-- 开发模式信息展示 -->
<RelativeLayout
android:id="@+id/kaifa_relativeLayout"
android:layout_width="match_parent"
android:layout_height="127dp"
android:layout_alignParentBottom="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="5dp"
android:background="@drawable/finance_radius"
android:orientation="horizontal"
android:visibility="gone">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="15dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_detect_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="检测耗时:"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_rgb_live_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="RGB活体检测耗时:"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_rgb_live_score"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="RGB活体检测结果:"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_all_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="总耗时:"
android:textColor="#ffffff"
android:textSize="12sp" />
</LinearLayout>
<ImageView
android:id="@+id/face_detect_image_view"
android:layout_width="110dp"
android:layout_height="83dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="15dp"
android:background="@drawable/gate_imageview_radius"
android:src="@mipmap/ic_image_video" />
<!-- 存图相关视图 -->
<TextView
android:id="@+id/detect_surface_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="检测表面"
android:textColor="#ffffff"
android:textSize="12sp"
android:visibility="gone" />
<View
android:id="@+id/spot"
android:layout_width="10dp"
android:layout_height="10dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/spot"
android:visibility="gone" />
<ImageView
android:id="@+id/save_camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="10dp"
android:layout_marginRight="10dp"
android:src="@mipmap/ic_save_camera"
android:visibility="gone" />
</RelativeLayout>
</RelativeLayout>
<!-- 质量检测未通过 -->
<include layout="@layout/layout_quality_test_failed"
android:id="@+id/finance_quality_test_failed"
android:visibility="gone" />
<!-- 活体检测未通过 -->
<include layout="@layout/layout_failed_in_vivo_test"
android:id="@+id/finance_failed_in_vivo_test"
android:visibility="gone" />
<!-- 活体检测通过 -->
<include layout="@layout/layout_by_living_detection"
android:id="@+id/finance_by_living_detection"
android:visibility="gone" />
<!-- 返回按钮 -->
<ImageView
android:id="@+id/btn_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
android:src="@mipmap/ic_finance_back"
android:visibility="visible" />
<RelativeLayout
android:id="@+id/layout_compare_status"
android:layout_width="150dp"
android:layout_height="44dp"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
android:layout_marginTop="50dp"
android:background="@drawable/gate_radius_compare"
android:visibility="gone">
<TextView
android:id="@+id/text_compare_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center"
android:textColor="#FF00BAF2"
android:textSize="20sp" />
</RelativeLayout>
</RelativeLayout>

124
app/src/main/res/layout/layout_by_living_detection.xml

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<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:layout_gravity="center"
android:background="@android:color/transparent">
<RelativeLayout
android:id="@+id/quality_detectedRl"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/detect_reg_layout"
android:layout_width="108dp"
android:layout_height="108dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="80dp">
<com.baidu.idl.face.main.finance.view.CircleImageView
android:id="@+id/detect_reg_image_item"
android:layout_width="108dp"
android:layout_height="108dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
<ImageView
android:id="@+id/quality_no_detectIv"
android:layout_width="108dp"
android:layout_height="108dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@mipmap/ic_mask_success" />
</RelativeLayout>
<ImageView
android:layout_width="@dimen/finance_47_dp"
android:layout_height="@dimen/finance_47_dp"
android:layout_alignEnd="@+id/detect_reg_layout"
android:layout_alignParentTop="true"
android:layout_marginTop="65dp"
android:background="@mipmap/stars"
tools:ignore="RtlCompat" />
<TextView
android:id="@+id/no_detectTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/detect_reg_layout"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/finance_35_dp"
android:text="通过活体检测"
android:textColor="@color/finance_00BAF2"
android:textSize="33sp" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/no_detectTv"
android:layout_centerHorizontal="true"
android:layout_marginTop="40dp">
<TextView
android:id="@+id/by_living_detection_rgb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
<TextView
android:id="@+id/by_living_detection_nir"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/by_living_detection_rgb"
android:layout_marginTop="@dimen/finance_10_dp"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
<TextView
android:id="@+id/by_living_detection_depth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/by_living_detection_nir"
android:layout_marginTop="@dimen/finance_10_dp"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
<TextView
android:id="@+id/by_living_detection_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/by_living_detection_depth"
android:layout_marginTop="@dimen/finance_10_dp"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
<TextView
android:id="@+id/by_living_detection_Frames"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/by_living_detection_time"
android:layout_marginTop="@dimen/finance_10_dp"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
</RelativeLayout>
</RelativeLayout>
<Button
android:id="@+id/by_living_detection_btn"
android:layout_width="match_parent"
android:layout_height="66dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginLeft="74dp"
android:layout_marginBottom="100dp"
android:background="@drawable/button_selector"
android:text="重新检测"
android:textColor="@color/finance_white"
android:textSize="27sp" />
<include layout="@layout/layout_buttom" />
</RelativeLayout>

119
app/src/main/res/layout/layout_failed_in_vivo_test.xml

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<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:layout_gravity="center"
android:background="@android:color/transparent">
<RelativeLayout
android:id="@+id/no_detect_reg_layout"
android:layout_width="108dp"
android:layout_height="108dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="80dp">
<com.baidu.idl.face.main.finance.view.CircleImageView
android:id="@+id/no_detect_reg_image_item"
android:layout_width="108dp"
android:layout_height="108dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
<ImageView
android:id="@+id/no_detectIv"
android:layout_width="108dp"
android:layout_height="108dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@mipmap/ic_mask_fail" />
</RelativeLayout>
<ImageView
android:layout_width="@dimen/finance_47_dp"
android:layout_height="@dimen/finance_47_dp"
android:layout_alignEnd="@+id/no_detect_reg_layout"
android:layout_alignParentTop="true"
android:layout_marginTop="65dp"
android:background="@mipmap/waterdrop"
tools:ignore="RtlCompat" />
<TextView
android:id="@+id/no_detectTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/no_detect_reg_layout"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/finance_35_dp"
android:text="未通过活体检测"
android:textColor="@color/finance_FFFECD33"
android:textSize="33sp" />
<RelativeLayout
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/no_detectTv"
android:layout_marginTop="40dp">
<TextView
android:id="@+id/failed_in_vivo_test_rgb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
<TextView
android:id="@+id/failed_in_vivo_test_nir"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/failed_in_vivo_test_rgb"
android:layout_marginTop="@dimen/finance_10_dp"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
<TextView
android:id="@+id/failed_in_vivo_test_depth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/failed_in_vivo_test_nir"
android:layout_marginTop="@dimen/finance_10_dp"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
<TextView
android:id="@+id/failed_in_vivo_test_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/failed_in_vivo_test_depth"
android:layout_marginTop="@dimen/finance_10_dp"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
<TextView
android:id="@+id/failed_in_vivo_test_Frames"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/failed_in_vivo_test_time"
android:layout_marginTop="@dimen/finance_10_dp"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
</RelativeLayout>
<Button
android:id="@+id/failed_in_vivo_testBtn"
android:layout_width="match_parent"
android:layout_height="66dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginLeft="74dp"
android:layout_marginBottom="100dp"
android:background="@drawable/button_selector"
android:text="重新检测"
android:textColor="@color/finance_white"
android:textSize="27sp" />
<include layout="@layout/layout_buttom"/>
</RelativeLayout>

37
app/src/main/res/layout/layout_hint.xml

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pay_hintRl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="top"
android:background="#121212"
android:visibility="visible">
<!-- 质量检测未通过-->
<include
android:id="@+id/finance_quality_test_failed"
layout="@layout/layout_quality_test_failed"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:visibility="gone" />
<!-- 活体检测未通过-->
<include
android:id="@+id/finance_failed_in_vivo_test"
layout="@layout/layout_failed_in_vivo_test"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:visibility="gone" />
<!-- 活体检测通过-->
<include
android:id="@+id/finance_by_living_detection"
layout="@layout/layout_by_living_detection"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:visibility="gone" />
</RelativeLayout>

70
app/src/main/res/layout/layout_no_face_detected.xml

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clipChildren="false">
<RelativeLayout
android:layout_marginBottom="80dp"
android:layout_marginTop="80dp"
android:layout_marginRight="@dimen/finance_50_dp"
android:layout_marginLeft="@dimen/finance_50_dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/face_detected_round">
<ImageView
android:id="@+id/no_detectIv"
android:layout_width="@dimen/finance_108_dp"
android:layout_height="@dimen/finance_108_dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="80dp"
android:background="@mipmap/ic_mask_fail" />
<ImageView
android:layout_width="@dimen/finance_47_dp"
android:layout_height="@dimen/finance_47_dp"
android:layout_alignEnd="@+id/no_detectIv"
android:layout_alignParentTop="true"
android:layout_marginTop="65dp"
android:background="@mipmap/waterdrop"
tools:ignore="RtlCompat" />
<TextView
android:id="@+id/no_detectTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/no_detectIv"
android:layout_centerHorizontal="true"
android:layout_marginTop="40dp"
android:text="未检测到人脸"
android:textColor="@color/finance_FFFECD33"
android:textSize="33sp" />
<Button
android:id="@+id/retest_detectBtn"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:layout_below="@+id/no_detectTv"
android:layout_centerHorizontal="true"
android:layout_marginTop="60dp"
android:background="@drawable/button_selector"
android:text="重新检测"
android:textColor="@color/finance_white"
android:textSize="27sp" />
<Button
android:id="@+id/back_homeBtn"
android:layout_width="wrap_content"
android:layout_height="60dp"
android:layout_below="@+id/retest_detectBtn"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:layout_marginBottom="@dimen/finance_73_dp"
android:background="@drawable/button_selector_grey"
android:text="回到首页"
android:textColor="@color/finance_white"
android:textSize="27sp" />
</RelativeLayout>
</RelativeLayout>

108
app/src/main/res/layout/layout_quality_test_failed.xml

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<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:layout_gravity="center"
android:background="@android:color/transparent">
<RelativeLayout
android:id="@+id/quality_detectedRl"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/detect_reg_layout"
android:layout_width="108dp"
android:layout_height="108dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="80dp">
<com.baidu.idl.face.main.finance.view.CircleImageView
android:id="@+id/quality_detect_reg_image_item"
android:layout_width="108dp"
android:layout_height="108dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
<ImageView
android:id="@+id/quality_no_detectIv"
android:layout_width="108dp"
android:layout_height="108dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:background="@mipmap/ic_mask_fail" />
</RelativeLayout>
<ImageView
android:layout_width="@dimen/finance_47_dp"
android:layout_height="@dimen/finance_47_dp"
android:layout_alignEnd="@+id/detect_reg_layout"
android:layout_alignParentTop="true"
android:layout_marginTop="65dp"
android:background="@mipmap/waterdrop"
tools:ignore="RtlCompat" />
<TextView
android:id="@+id/no_detectTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/detect_reg_layout"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/finance_35_dp"
android:text="未通过质量检测"
android:textColor="@color/finance_FFFECD33"
android:textSize="33sp" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/no_detectTv"
android:layout_centerHorizontal="true"
android:layout_marginTop="80dp">
<TextView
android:id="@+id/quality_test_timeTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
<TextView
android:id="@+id/quality_detectedTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/quality_test_timeTv"
android:layout_marginTop="@dimen/finance_10_dp"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
<TextView
android:id="@+id/quality_sheltered_part"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/quality_detectedTv"
android:layout_marginTop="@dimen/finance_10_dp"
android:textColor="@color/finance_FFCCCCCC"
android:textSize="18sp" />
</RelativeLayout>
</RelativeLayout>
<Button
android:id="@+id/quality_retest_detectBtn"
android:layout_width="match_parent"
android:layout_height="66dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginLeft="74dp"
android:layout_marginBottom="100dp"
android:background="@drawable/button_selector"
android:text="重新检测"
android:textColor="@color/finance_white"
android:textSize="27sp" />
<include layout="@layout/layout_buttom" />
</RelativeLayout>

BIN
app/src/main/res/mipmap-hdpi/ic_finance_back.png

After

Width: 66  |  Height: 66  |  Size: 1017 B

BIN
app/src/main/res/mipmap-hdpi/ic_finance_setting.png

After

Width: 66  |  Height: 66  |  Size: 1.6 KiB

BIN
app/src/main/res/mipmap-hdpi/ic_finance_view.png

After

Width: 343  |  Height: 342  |  Size: 3.7 KiB

BIN
app/src/main/res/mipmap-hdpi/ic_icon_develop_fail.png

After

Width: 68  |  Height: 68  |  Size: 1.1 KiB

BIN
app/src/main/res/mipmap-hdpi/ic_icon_develop_success.png

After

Width: 68  |  Height: 68  |  Size: 1.0 KiB

BIN
app/src/main/res/mipmap-hdpi/ic_image_video.png

After

Width: 330  |  Height: 248  |  Size: 3.0 KiB

BIN
app/src/main/res/mipmap-hdpi/ic_loading_blue.png

After

Width: 796  |  Height: 796  |  Size: 35 KiB

BIN
app/src/main/res/mipmap-hdpi/ic_loading_grey.png

After

Width: 796  |  Height: 796  |  Size: 36 KiB

BIN
app/src/main/res/mipmap-xxhdpi/ic_finance_back.png

After

Width: 66  |  Height: 66  |  Size: 1017 B

BIN
app/src/main/res/mipmap-xxhdpi/ic_finance_setting.png

After

Width: 66  |  Height: 66  |  Size: 1.6 KiB

BIN
app/src/main/res/mipmap-xxhdpi/ic_finance_view.png

After

Width: 343  |  Height: 342  |  Size: 3.7 KiB

BIN
app/src/main/res/mipmap-xxhdpi/ic_icon_develop_fail.png

After

Width: 68  |  Height: 68  |  Size: 1.1 KiB

BIN
app/src/main/res/mipmap-xxhdpi/ic_icon_develop_success.png

After

Width: 68  |  Height: 68  |  Size: 1.0 KiB

BIN
app/src/main/res/mipmap-xxhdpi/ic_image_video.png

After

Width: 330  |  Height: 248  |  Size: 3.0 KiB

BIN
app/src/main/res/mipmap-xxhdpi/ic_loading_blue.png

After

Width: 796  |  Height: 796  |  Size: 35 KiB

BIN
app/src/main/res/mipmap-xxhdpi/ic_loading_grey.png

After

Width: 796  |  Height: 796  |  Size: 36 KiB

17
app/src/main/res/values/colors.xml

@ -28,4 +28,21 @@
<color name="teal_700">#FF018786</color> <color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color> <color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color> <color name="white">#FFFFFFFF</color>
<!-- 金融库颜色 -->
<color name="finance_white">#FFFFFF</color>
<color name="finance_activition_red">#F34B56</color>
<color name="finance_activition_on">#999999</color>
<color name="finance_buttom_title">#666666</color>
<color name="finance_off_view">#121212</color>
<color name="finance_00BAF2">#00BAF2</color>
<color name="finance_buttonColor">#FF6600</color>
<color name="finance_333333">#333333</color>
<color name="finance_d3d3d3">#d3d3d3</color>
<color name="finance_FF222222">#FF222222</color>
<color name="finance_FFFECD33">#FFFECD33</color>
<color name="finance_FFCCCCCC">#FFCCCCCC</color>
<color name="activition_color">#999999</color>
<color name="gate_FF999999">#999999</color>
<color name="hui_color">#636363</color>
</resources> </resources>

63
app/src/main/res/values/dimens.xml

@ -2,4 +2,67 @@
<resources> <resources>
<!-- 最小屏幕高度,确保内容在小屏幕上也能正确显示 --> <!-- 最小屏幕高度,确保内容在小屏幕上也能正确显示 -->
<dimen name="min_screen_height">600dp</dimen> <dimen name="min_screen_height">600dp</dimen>
<!-- 金融库尺寸 -->
<dimen name="finance_title_font">25sp</dimen>
<dimen name="finance_15">15dp</dimen>
<dimen name="finance_20">20dp</dimen>
<dimen name="finance_20_sp">20sp</dimen>
<dimen name="finance_355_dp">355dp</dimen>
<dimen name="finance_22_sp">22sp</dimen>
<dimen name="finance_108_dp">108dp</dimen>
<dimen name="finance_47_dp">47dp</dimen>
<dimen name="finance_73_dp">73dp</dimen>
<dimen name="finance_30_dp">30dp</dimen>
<dimen name="finance_110_dp">110dp</dimen>
<dimen name="finance_83_dp">83dp</dimen>
<dimen name="finance_5_dp">5dp</dimen>
<dimen name="finance_10_dp">10dp</dimen>
<dimen name="finance_23_dp">23dp</dimen>
<dimen name="finance_2_dp">2dp</dimen>
<dimen name="finance_120_dp">120dp</dimen>
<dimen name="finance_44_dp">44dp</dimen>
<dimen name="finance_127_dp">127dp</dimen>
<dimen name="finance_12_sp">12sp</dimen>
<dimen name="finance_14_sp">14sp</dimen>
<dimen name="finance_200_dp">200dp</dimen>
<dimen name="finance_50_dp">50dp</dimen>
<dimen name="finance_16_sp">16sp</dimen>
<dimen name="finance_30_sp">30sp</dimen>
<dimen name="finance_91_dp">91dp</dimen>
<dimen name="finance_22_dp">22dp</dimen>
<dimen name="finance_24_dp">24dp</dimen>
<dimen name="finance_25_dp">25dp</dimen>
<dimen name="finance_1_dp">1dp</dimen>
<dimen name="finance_27_dp">27dp</dimen>
<dimen name="finance_45_dp">45dp</dimen>
<dimen name="finance_0_dp">0dp</dimen>
<dimen name="finance_6_dp">6dp</dimen>
<dimen name="finance_28_dp">28dp</dimen>
<dimen name="finance_24_sp">24sp</dimen>
<dimen name="finance_56_dp">56dp</dimen>
<dimen name="finance_12_dp">12dp</dimen>
<dimen name="finance_35_dp">35dp</dimen>
<dimen name="finance_102_dp">102dp</dimen>
<dimen name="finance_60_dp">60dp</dimen>
<dimen name="title_font">25sp</dimen>
<dimen name="bottom_font">12sp</dimen>
<dimen name="start_title">27.3sp</dimen>
<dimen name="start_15">15dp</dimen>
<dimen name="activition_15_sp">15sp</dimen>
<dimen name="activition_16">16sp</dimen>
<dimen name="start_77">77.7dp</dimen>
<dimen name="start_10">10dp</dimen>
<dimen name="activition_20">20dp</dimen>
<dimen name="activition_14">14dp</dimen>
<dimen name="activition_14_sp">14sp</dimen>
<dimen name="activition_18">18dp</dimen>
<dimen name="activition_18_sp">18sp</dimen>
<dimen name="activition_49">49.3dp</dimen>
<dimen name="home_tv">17sp</dimen>
<dimen name="activition_20_sp">20sp</dimen>
<dimen name="gate_20_sp">20sp</dimen>
<dimen name="gete_56_dp">56dp</dimen>
<dimen name="gete_24_dp">24dp</dimen>
<dimen name="gate_30_dp">30dp</dimen>
</resources> </resources>

24
financelibrary/src/main/java/com/baidu/idl/face/main/finance/manager/FaceSDKManager.java

@ -161,14 +161,20 @@ public class FaceSDKManager {
listener.initLicenseFail(code, response); listener.initLicenseFail(code, response);
} }
} }
}); });
} else { } else {
if (listener != null) { if (listener != null) {
listener.initLicenseFail(-1, "授权码不存在,请重新输入!"); listener.initLicenseFail(-1, "授权码不存在,请重新输入!");
} }
} }
} }
/** /**
* 初始化模型目前包含检查活体识别模型因为初始化是顺序执行可以在最好初始化回掉中返回状态结果 * 初始化模型目前包含检查活体识别模型因为初始化是顺序执行可以在最好初始化回掉中返回状态结果
* *
@ -840,6 +846,24 @@ public class FaceSDKManager {
return true; return true;
} }
/**
* 根据设备类型切换摄像头配置
* @param deviceType 设备类型5表示第6批设备其他值表示非第6批设备
*/
public void switchCameraByDeviceType(int deviceType) {
if (deviceType != 5) {
Log.e("FaceSDKManager", "switchCamera--非第6批");
SingleBaseConfig.getBaseConfig().setVideoDirection(270);
SingleBaseConfig.getBaseConfig().setRgbVideoDirection(270);
SingleBaseConfig.getBaseConfig().setMirrorDetectRGB(0);
} else {
Log.e("FaceSDKManager", "switchCamera--第6批");
SingleBaseConfig.getBaseConfig().setVideoDirection(90);
SingleBaseConfig.getBaseConfig().setRgbVideoDirection(90);
SingleBaseConfig.getBaseConfig().setMirrorDetectRGB(1);
}
com.baidu.idl.face.main.finance.utils.FinanceConfigUtils.modityJson();
}
/** /**
* 卸载模型 * 卸载模型

16
financelibrary/src/main/java/com/baidu/idl/face/main/finance/utils/BitmapUtils.java

@ -522,4 +522,20 @@ public final class BitmapUtils {
e.printStackTrace(); e.printStackTrace();
} }
} }
/**
* 将Bitmap转换为Base64编码的字符串
* @param bm 要转换的Bitmap
* @return Base64编码的字符串
*/
public static String bitmapToBase64(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 30, baos);
byte[] byteArray = baos.toByteArray();
// 使用Base64进行编码
String encodedString = Base64.encodeToString(byteArray, Base64.DEFAULT);
return encodedString;
}
} }
Loading…
Cancel
Save