如何使用HarmonyOS面部识别能力_deveco studio 人脸识别

打印 上一主题 下一主题

主题 502|帖子 502|积分 1506

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索发展,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术故步自封!
因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初志也很简朴,就是希望能够资助到想自学提升又不知道该从何学起的朋友。





既有适合小白学习的零基础资料,也有适合3年以上履历的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习条记、源码讲义、实战项目、大纲蹊径、解说视频,并且后续会持续更新
如果你必要这些资料,可以添加V获取:vip204888 (备注鸿蒙)

正文

/**


  • 事件分发器
    */
    private class MyEventHandle extends EventHandler {
    MyEventHandle(EventRunner runner) throws IllegalArgumentException {
    super(runner);
    }
@Override
protected void processEvent(InnerEvent event) {
super.processEvent(event);
int eventId = event.eventId;
getAndSetText(ResourceTable.Id_text_status, eventId, true);
}
}
取消人脸识别
点击取消人脸识别Button,触发取消人脸识别操作,代码示例如下:
private void createCancelBtn() {
// 创建点击事件
Component component = findComponentById(ResourceTable.Id_button_cancel);
// 创建按钮
Button cancelBtn = null;
if (component != null && component instanceof Button) {
cancelBtn = (Button) component;
cancelBtn.setClickedListener(view -> {
if (mBiometricAuthentication != null) {
// 调用取消接口
int result = mBiometricAuthentication.cancelAuthenticationAction();
LogUtils.info(“createCancelBtn:”, result + “”);
}
});
}
}
页面跳转
人脸识别乐成后,跳转到模仿相机页面,代码示例如下:
private void toAuthAfterPage() {
Intent secondIntent = new Intent();
// 指定待启动FA的bundleName和abilityName
Operation operation = new Intent.OperationBuilder()
.withDeviceId(“”)
.withBundleName(getBundleName())
.withAbilityName(OpenCamera.class.getName())
.build();
secondIntent.setOperation(operation);
// startAbility接口实现启动另一个页面
startAbility(secondIntent);
}
7. 相机相干业务逻辑
在模仿相机页面(ability_open_camera.xml)中,包含打开相机和切换前后置摄像头的功能,我们下面将逐一介绍。
初始化SurfaceProvider
用户授权后,开始初始化SurfaceProvider,代码示例如下:
private void initSurface() {
surfaceProvider = new SurfaceProvider(this);
DirectionalLayout.LayoutConfig params = new DirectionalLayout.LayoutConfig(
ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_PARENT);
surfaceProvider.setLayoutConfig(params);
surfaceProvider.pinToZTop(false);
// 添加SurfaceCallBack回调
surfaceProvider.getSurfaceOps().get().addCallback(new SurfaceCallBack());
// 将SurfaceProvider参加到结构中
Component component = findComponentById(ResourceTable.Id_surface_container);
if (component instanceof ComponentContainer) {
((ComponentContainer) component).addComponent(surfaceProvider);
}
}
实现SurfaceOps.Callback回调,当Surface创建时,执行打开相机的操作,代码示例如下:
/**


  • SurfaceCallBack,Surface回调
    */
    class SurfaceCallBack implements SurfaceOps.Callback {
    @Override
    public void surfaceCreated(SurfaceOps callbackSurfaceOps) {
    if (callbackSurfaceOps != null) {
    callbackSurfaceOps.setFixedSize(SCREEN_HEIGHT, SCREEN_WIDTH);
    }
    openCamera();
    }
@Override
public void surfaceChanged(SurfaceOps callbackSurfaceOps, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceOps callbackSurfaceOps) {
}
}
打开相机
创建surface后触发surfaceCreated回调,执行打开相机的操作。打开相机并添加相片接收的监听,代码示例如下:
private void openCamera() {
CameraKit cameraKit = CameraKit.getInstance(getApplicationContext());
String[] cameraLists = cameraKit.getCameraIds();
String cameraId = cameraLists.length > 1 && isCameraRear ? cameraLists[1] : cameraLists[0];
CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl();
cameraKit.createCamera(cameraId, cameraStateCallback, creamEventHandler);
}
/**


  • CameraStateCallbackImpl 相机状态回调
    */
    class CameraStateCallbackImpl extends CameraStateCallback {
    CameraStateCallbackImpl() {
    }
@Override
public void onCreated(Camera camera) {
// 获取预览
previewSurface = surfaceProvider.getSurfaceOps().get().getSurface();
if (previewSurface == null) {
LogUtils.error(TAG, “create camera filed, preview surface is null”);
return;
}
// Wait until the preview surface is created.
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException exception) {
LogUtils.warn(TAG, “Waiting to be interrupted”);
}
CameraConfig.Builder cameraConfigBuilder = camera.getCameraConfigBuilder();
// 设置预览
cameraConfigBuilder.addSurface(previewSurface);
camera.configure(cameraConfigBuilder.build());
cameraDevice = camera;
enableImageGroup();
}
@Override
public void onConfigured(Camera camera) {
FrameConfig.Builder framePreviewConfigBuilder
= camera.getFrameConfigBuilder(Camera.FrameConfigType.FRAME_CONFIG_PREVIEW);
framePreviewConfigBuilder.addSurface(previewSurface);
// 开启循环捕捉
camera.triggerLoopingCapture(framePreviewConfigBuilder.build());
}
private void enableImageGroup() {
if (!exitImage.isEnabled()) {
exitImage.setEnabled(true);
switchCameraImage.setEnabled(true);
}
}
}
切换前后置摄像头
点击切换摄像头图标后,执行切换前后置摄像头操作,代码示例如下:
private void switchClicked() {
isCameraRear = !isCameraRear;
openCamera();
}
8. 效果展示
人脸识别FA(MainAbilitySlice)完成了检验设备是否支持人脸识别,人脸识别,人脸识别效果表现,乐成后跳转到打开相机的FA(OpenCameraSlice);相机FA实现了相机的打开,照相,相片存储,摄像头切换的功能。具体效果图如下:
人脸识别初始页面:

人脸识别效果表现:

相机页面:

9. 完整代码示例
编写结构与样式
1.base/graphic/background_ability_main.xml
<?xml version="1.0" encoding="UTF-8" ?>


2.base/graphic/button_element.xml
<?xml version="1.0" encoding="utf-8"?>



3.base/layout/ability_main.xml
<?xml version="1.0" encoding="utf-8"?>
   
   



4.base/layout/ability_open_camera.xml
<?xml version="1.0" encoding="utf-8"?>









功能逻辑代码
1.com/huawei/cookbook/slice/MainAbilitySlice.java
package com.huawei.cookbook.slice;
import com.huawei.cookbook.MainAbility;
import com.huawei.cookbook.OpenCamera;
import com.huawei.cookbook.ResourceTable;
import com.huawei.cookbook.util.FaceAuthResult;
import com.huawei.cookbook.util.LogUtils;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.aafwk.content.Operation;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.agp.components.Text;
import ohos.agp.utils.Color;
import ohos.biometrics.authentication.BiometricAuthentication;
import ohos.eventhandler.EventHandler;
import ohos.eventhandler.EventRunner;
import ohos.eventhandler.InnerEvent;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**


  • MainAbilitySlice

  • @since 2021-04-12
    /
    public class MainAbilitySlice extends AbilitySlice {
    private static final int POOL_CORE_SIZE = 2;
    private static final int POOL_MAX_SIZE = 5;
    private static final int NO_FACE_RET = -1;
    private static final int KEEP_ALIVE_TIME = 3;
    private static final int QUEUE_SIZE = 6;
    private static final int RET_NOT_SUPPORTED = 1;
    private static final int RET_SAFE_LEVEL_NOT_SUPPORTED = 2;
    private static final int RET_NOT_LOCAL = 3;
    private EventRunner runner;
    private MyEventHandle myEventHandle;
    private BiometricAuthentication mBiometricAuthentication;
    /
    *
  • 新建线程进行认证,制止壅闭其他任务
    */
    private Runnable runnable = new Runnable() {
    private void initHandler() {
    runner = EventRunner.getMainEventRunner();
    if (runner == null) {
    return;
    }
    myEventHandle = new MyEventHandle(runner);
    }
@Override
public void run() {
// 初始化myEventHandle
initHandler();
// 开始认证
startAuth();
}
};
/**


  • onStart

  • @param intent intent
    */
    @Override
    public void onStart(Intent intent) {
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_ability_main);
    // 创建开始认证按钮,并添加点击事件
    createStartBtn();
    // 创建取消认证按钮,并添加点击事件
    createCancelBtn();
    }
/**


  • 创建取消按钮
    */
    private void createCancelBtn() {
    // 创建点击事件
    Component component = findComponentById(ResourceTable.Id_button_cancel);
    // 创建按钮
    Button cancelBtn = null;
    if (component != null && component instanceof Button) {
    cancelBtn = (Button) component;
    cancelBtn.setClickedListener(view -> {
    if (mBiometricAuthentication != null) {
    // 调用取消接口
    int result = mBiometricAuthentication.cancelAuthenticationAction();
    LogUtils.info(“createCancelBtn:”, result + “”);
    }
    });
    }
    }
/**


  • 创建开始识别的按钮点击事件
    */
    private void createStartBtn() {
    // 创建点击事件
    Component component = findComponentById(ResourceTable.Id_button_start);
    // 创建按钮
    Button featureBtn = null;
    if (component != null && component instanceof Button) {
    featureBtn = (Button) component;
    featureBtn.setClickedListener(view -> {
    createStartListener();
    });
    }
    }
private void createStartListener() {
// 提示用户人脸识别时将人脸对准摄像头
getAndSetText(ResourceTable.Id_text_status, NO_FACE_RET, true);
try {
// 创建生物识别对象
mBiometricAuthentication = BiometricAuthentication.getInstance(MainAbility.getMainAbility());
// 检验设备是否有人脸识别功能
// BiometricAuthentication.AuthType中有三个类别
// 分别为AUTH_TYPE_BIOMETRIC_FINGERPRINT_ONLY指纹识别
// AUTH_TYPE_BIOMETRIC_FACE_ONLY脸部识别
// AUTH_TYPE_BIOMETRIC_ALL指纹和面部
// BiometricAuthentication.SecureLevel 2D人脸识别建议使用SECURE_LEVEL_S2,3D人脸识别建议使用SECURE_LEVEL_S3
int hasAuth = mBiometricAuthentication.checkAuthenticationAvailability(
BiometricAuthentication.AuthType.AUTH_TYPE_BIOMETRIC_FACE_ONLY,
BiometricAuthentication.SecureLevel.SECURE_LEVEL_S2, true);
// hasAuth 0是支持,1是不支持,2安全级别不支持 3不是当地认证 4无人脸录入
if (hasAuth == 0) {
ThreadPoolExecutor pool = new ThreadPoolExecutor(
POOL_CORE_SIZE, POOL_MAX_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(QUEUE_SIZE), new ThreadPoolExecutor.DiscardOldestPolicy());
pool.submit(runnable);
} else {
// 人脸识别不支持或存在其他问题 ,直接回显页面,
// 在主线程不必要通过EventHandler发送回显任务
int retExcAuth = getRetExcAuth(hasAuth);
getAndSetText(ResourceTable.Id_text_status, retExcAuth, true);
}
} catch (IllegalAccessException e) {
LogUtils.error(“createStartBtn”, “IllegalAccessException when start auth”);
}
}
/**


  • 开始认证
    */
    private void startAuth() {
    // retExcAuth 0认证乐成 1:比对失败 2:取消认证 3认证超时 4:打开相机失败
    // 5:busy,可能上一个认证没有结束 6:入参错误 7:人脸认证锁定(达到错误认证次数了)
    // 8:没有录入人脸 100:其他错误。
    int retExcAuth = mBiometricAuthentication.execAuthenticationAction(
    BiometricAuthentication.AuthType.AUTH_TYPE_BIOMETRIC_FACE_ONLY,
    BiometricAuthentication.SecureLevel.SECURE_LEVEL_S2,
    true, false, null);
    // 将修改页面发送到主线程执行
    myEventHandle.sendEvent(retExcAuth);
    }
/**


  • 根据检验是否支持认证返回值获取提示code

  • @param hasAuth 是否有认证能力
  • @return 返回认证码
    */
    private int getRetExcAuth(int hasAuth) {
    int retExcAuth;
    if (hasAuth == RET_NOT_SUPPORTED) {
    // 1是不支持2D人脸识别
    retExcAuth = FaceAuthResult.AUTH_2D_NOT_SUPPORTED;
    } else if (hasAuth == RET_SAFE_LEVEL_NOT_SUPPORTED) {
    // 安全级别不支持
    retExcAuth = FaceAuthResult.AUTH_SAFE_LEVEL_NOT_SUPPORTED;
    } else if (hasAuth == RET_NOT_LOCAL) {
    // 是不是当地认证
    retExcAuth = FaceAuthResult.AUTH_NOT_LOCAL;
    } else {
    // 无人脸录入
    retExcAuth = FaceAuthResult.AUTH_NO_FACE;
    }
    return retExcAuth;
    }
/**


  • 获取并设置text

  • @param textId 文本框id
  • @param retExcAuth 认证返回码
  • @param isVisible 是否表现
    */
    private void getAndSetText(int textId, int retExcAuth, boolean isVisible) {
    // 获取状态Text
    Component componentText = findComponentById(textId);
    if (componentText != null && componentText instanceof Text) {
    Text text = (Text) componentText;
    setTextValueAndColor(retExcAuth, text);
    if (isVisible) {
    text.setVisibility(Component.VISIBLE);
    }
    }
    }
/**


  • 设置文本提示信息

  • @param text 文本对象
  • @param textValue 文本值
  • @param color 文本颜色
    */
    private void setTextValueAndColor(Text text, String textValue, Color color) {
    text.setText(textValue);
    text.setTextColor(color);
    }
/**


  • 设置文本表现值和文本颜色

  • @param retExcAuth 认证返回值
  • @param text 文本对象
    */
    private void setTextValueAndColor(int retExcAuth, Text text) {
    switch (retExcAuth) {
    case FaceAuthResult.AUTH_SUCCESS:
    setTextValueAndColor(text, “认证乐成”, Color.GREEN);
    // 页面跳转
    toAuthAfterPage();
    break;
    case FaceAuthResult.AUTH_FAIL:
    setTextValueAndColor(text, “比对失败”, Color.RED);
    break;
    case FaceAuthResult.AUTH_CANCLE:
    setTextValueAndColor(text, “取消认证”, Color.RED);
    break;
    case FaceAuthResult.AUTH_TIME_OUT:
    setTextValueAndColor(text, “认证超时”, Color.RED);
    break;
    case FaceAuthResult.AUTH_OPEN_CAMERA_FAIL:
    setTextValueAndColor(text, “打开相机失败”, Color.RED);
    break;
    case FaceAuthResult.AUTH_BUSY:
    setTextValueAndColor(text, “busy,可能上一个认证没有结束”, Color.RED);
    break;
    case FaceAuthResult.AUTH_PARAM_ERROR:
    setTextValueAndColor(text, “入参错误”, Color.RED);
    break;
    case FaceAuthResult.AUTH_FACE_LOCKED:
    setTextValueAndColor(text, “人脸认证锁定(达到错误认证次数了)”, Color.RED);
    break;
    case FaceAuthResult.AUTH_NO_FACE:
    setTextValueAndColor(text, “无人脸录入,请录入人脸。”, Color.BLUE);
    break;
    case FaceAuthResult.AUTH_OTHER_ERROR:
    setTextValueAndColor(text, “其他错误。”, Color.RED);
    break;
    case FaceAuthResult.AUTH_2D_NOT_SUPPORTED:
    setTextValueAndColor(text, “不支持2D人脸识别。”, Color.BLUE);
    break;
    case FaceAuthResult.AUTH_SAFE_LEVEL_NOT_SUPPORTED:
    setTextValueAndColor(text, “安全级别不支持。”, Color.BLUE);
    break;
    case FaceAuthResult.AUTH_NOT_LOCAL:
    setTextValueAndColor(text, “不是当地认证。”, Color.BLUE);
    break;
    default:
    setTextValueAndColor(text, “开始认证,请将视线对准摄像头。。。。。。。”, Color.BLUE);
    break;
    }
    }
private void toAuthAfterPage() {
Intent secondIntent = new Intent();
// 指定待启动FA的bundleName和abilityName
Operation operation = new Intent.OperationBuilder()
.withDeviceId(“”)
.withBundleName(getBundleName())
.withAbilityName(OpenCamera.class.getName())
.build();
secondIntent.setOperation(operation);
// 通过AbilitySlice的startAbility接口实现启动另一个页面
startAbility(secondIntent);
}
/**


  • 事件分发器

  • @since 2021-04-12
    */
    private class MyEventHandle extends EventHandler {
    MyEventHandle(EventRunner runner) throws IllegalArgumentException {
    super(runner);
    }
@Override
protected void processEvent(InnerEvent event) {
super.processEvent(event);
int eventId = event.eventId;
getAndSetText(ResourceTable.Id_text_status, eventId, true);
}
}
@Override
public void onStop() {
mBiometricAuthentication.cancelAuthenticationAction();
BiometricAuthentication.AuthenticationTips authenticationTips
= mBiometricAuthentication.getAuthenticationTips();
String tips = authenticationTips.tipInfo;
}
}
2.com/huawei/cookbook/slice/OpenCameraSlice.java
package com.huawei.cookbook.slice;
import com.huawei.cookbook.ResourceTable;
import com.huawei.cookbook.util.LogUtils;
import com.huawei.cookbook.util.PermissionBridge;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Component;
import ohos.agp.components.ComponentContainer;
import ohos.agp.components.DirectionalLayout;
import ohos.agp.components.Image;
import ohos.agp.components.surfaceprovider.SurfaceProvider;
import ohos.agp.graphics.Surface;
import ohos.agp.graphics.SurfaceOps;
import ohos.agp.window.dialog.ToastDialog;
import ohos.app.Context;
import ohos.eventhandler.EventHandler;
import ohos.eventhandler.EventRunner;
import ohos.media.camera.CameraKit;
import ohos.media.camera.device.Camera;
import ohos.media.camera.device.CameraConfig;
import ohos.media.camera.device.CameraStateCallback;
import ohos.media.camera.device.FrameConfig;
/**


  • 打开相机slice
    */
    public class OpenCameraSlice extends AbilitySlice implements PermissionBridge.OnPermissionStateListener {
    private static final String TAG = OpenCameraSlice.class.getName();
private static final int SCREEN_WIDTH = 1080;
private static final int SCREEN_HEIGHT = 1920;
private static final int SLEEP_TIME = 200;
private EventHandler creamEventHandler;
private Image exitImage;
private SurfaceProvider surfaceProvider;
private Image switchCameraImage;
private boolean isCameraRear;
private Camera cameraDevice;
private Surface previewSurface;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_open_camera);
new PermissionBridge().setOnPermissionStateListener(this);
}
private void initSurface() {
surfaceProvider = new SurfaceProvider(this);
DirectionalLayout.LayoutConfig params = new DirectionalLayout.LayoutConfig(
ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_PARENT);
surfaceProvider.setLayoutConfig(params);
surfaceProvider.pinToZTop(false);
// 添加SurfaceCallBack回调
surfaceProvider.getSurfaceOps().get().addCallback(new SurfaceCallBack());
// 将SurfaceProvider参加到结构中
Component component = findComponentById(ResourceTable.Id_surface_container);
if (component instanceof ComponentContainer) {
((ComponentContainer) component).addComponent(surfaceProvider);
}
}
private void initControlComponents() {
// 退出照相页面图标
Component exitImageCom = findComponentById(ResourceTable.Id_exit);
if (exitImageCom instanceof Image) {
exitImage = (Image) exitImageCom;
exitImage.setClickedListener(component -> terminate());
}
// 切换前后置摄像头图标
Component switchCameraImageCom = findComponentById(ResourceTable.Id_switch_camera_btn);
if (switchCameraImageCom instanceof Image) {
switchCameraImage = (Image) switchCameraImageCom;
switchCameraImage.setClickedListener(component -> switchClicked());
}
}
private void switchClicked() {
isCameraRear = !isCameraRear;
openCamera();
}
private void openCamera() {
CameraKit cameraKit = CameraKit.getInstance(getApplicationContext());
String[] cameraLists = cameraKit.getCameraIds();
String cameraId = cameraLists.length > 1 && isCameraRear ? cameraLists[1] : cameraLists[0];
CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl();
cameraKit.createCamera(cameraId, cameraStateCallback, creamEventHandler);
}
private void showTips(Context context, String message) {
getUITaskDispatcher().asyncDispatch(() -> {
ToastDialog toastDialog = new ToastDialog(context);
toastDialog.setAutoClosable(false);
toastDialog.setContentText(message);
toastDialog.show();
});
}
@Override
public void onPermissionGranted() {
getWindow().setTransparent(true);
initSurface();
initControlComponents();
creamEventHandler = new EventHandler(EventRunner.create(“======CameraBackground”));
}
@Override
public void onPermissionDenied() {
showTips(OpenCameraSlice.this, “=======No permission”);
}
/**


  • CameraStateCallbackImpl
    */
    class CameraStateCallbackImpl extends CameraStateCallback {
    CameraStateCallbackImpl() {
    }
@Override
public void onCreated(Camera camera) {
// 获取预览
previewSurface = surfaceProvider.getSurfaceOps().get().getSurface();
if (previewSurface == null) {
LogUtils.error(TAG, “create camera filed, preview surface is null”);
return;
}
// Wait until the preview surface is created.
try {
Thread.sleep(SLEEP_TIME);
} catch (InterruptedException exception) {
LogUtils.warn(TAG, “Waiting to be interrupted”);
}
CameraConfig.Builder cameraConfigBuilder = camera.getCameraConfigBuilder();
// 设置预览
cameraConfigBuilder.addSurface(previewSurface);
camera.configure(cameraConfigBuilder.build());
cameraDevice = camera;
enableImageGroup();
}
@Override
public void onConfigured(Camera camera) {
FrameConfig.Builder framePreviewConfigBuilder
= camera.getFrameConfigBuilder(Camera.FrameConfigType.FRAME_CONFIG_PREVIEW);
framePreviewConfigBuilder.addSurface(previewSurface);
// 开启循环捕捉
camera.triggerLoopingCapture(framePreviewConfigBuilder.build());
}
private void enableImageGroup() {
if (!exitImage.isEnabled()) {
exitImage.setEnabled(true);
switchCameraImage.setEnabled(true);
}
}
}
/**


  • SurfaceCallBack
    */
    class SurfaceCallBack implements SurfaceOps.Callback {
    @Override
    public void surfaceCreated(SurfaceOps callbackSurfaceOps) {
    if (callbackSurfaceOps != null) {
    callbackSurfaceOps.setFixedSize(SCREEN_HEIGHT, SCREEN_WIDTH);
    }
    openCamera();
    }
@Override
public void surfaceChanged(SurfaceOps callbackSurfaceOps, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceOps callbackSurfaceOps) {
}
}
@Override
public void onStop() {
cameraDevice.release();
}
}
3.com/huawei/cookbook/util/FaceAuthResult.java
package com.huawei.cookbook.util;
/**


  • 人脸认证返回码

  • @since 2021-04-12
    /
    public class FaceAuthResult {
    /
    *
  • 认证乐成
    /
    public static final int AUTH_SUCCESS = 0;
    /
    *
  • 认证失败
    /
    public static final int AUTH_FAIL = 1;
    /
    *
  • 取消认证
    /
    public static final int AUTH_CANCLE = 2;
    /
    *
  • 认证超时
    /
    public static final int AUTH_TIME_OUT = 3;
    /
    *
  • 打开相机失败
    /
    public static final int AUTH_OPEN_CAMERA_FAIL = 4;
    /
    *
  • busy,可能上一个认证没有结束
    /
    public static final int AUTH_BUSY = 5;
    /
    *
  • 入参错误
    /
    public static final int AUTH_PARAM_ERROR = 6;
    /
    *
  • 人脸认证锁定(达到错误认证次数了)
    /
    public static final int AUTH_FACE_LOCKED = 7;
    /
    *
  • 没有录入人脸
    /
    public static final int AUTH_NO_FACE = 8;
    /
    *
  • 不支持2D人脸识别。
    /
    public static final int AUTH_2D_NOT_SUPPORTED = 9;
    /
    *
  • 安全级别不支持
    /
    public static final int AUTH_SAFE_LEVEL_NOT_SUPPORTED = 10;
    /
    *
  • 不是当地认证
    /
    public static final int AUTH_NOT_LOCAL = 11;
    /
    *
  • 其他问题
    */
    public static final int AUTH_OTHER_ERROR = 100;
private FaceAuthResult() {
super();
}
}
4.com/huawei/cookbook/util/LogUtils.java
package com.huawei.cookbook.util;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
/**


  • LogUtils

  • @since 2021-04-12
    */
    public class LogUtils {
    private static final String TAG_LOG = “LogUtil”;
private static final HiLogLabel LABEL_LOG = new HiLogLabel(0, 0, LogUtils.TAG_LOG);
private static final String LOG_FORMAT = “%{public}s: %{public}s”;
private LogUtils() {
}
/**


  • Print debug log

  • @param tag log tag
  • @param msg log message
    */
    public static void debug(String tag, String msg) {
    HiLog.debug(LABEL_LOG, LOG_FORMAT, tag, msg);
    }
/**


  • Print info log

  • @param tag log tag
  • @param msg log message
    */
    public static void info(String tag, String msg) {
    HiLog.info(LABEL_LOG, LOG_FORMAT, tag, msg);
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
必要这份体系化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎参加我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习发展!
.huawei.cookbook.util;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
/**


  • LogUtils

  • @since 2021-04-12
    */
    public class LogUtils {
    private static final String TAG_LOG = “LogUtil”;
private static final HiLogLabel LABEL_LOG = new HiLogLabel(0, 0, LogUtils.TAG_LOG);
private static final String LOG_FORMAT = “%{public}s: %{public}s”;
private LogUtils() {
}
/**


  • Print debug log

  • @param tag log tag
  • @param msg log message
    */
    public static void debug(String tag, String msg) {
    HiLog.debug(LABEL_LOG, LOG_FORMAT, tag, msg);
    }
/**


  • Print info log

  • @param tag log tag
  • @param msg log message
    */
    public static void info(String tag, String msg) {
    HiLog.info(LABEL_LOG, LOG_FORMAT, tag, msg);
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
必要这份体系化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-AQoaMLra-1713187175498)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都欢迎参加我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习发展!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表