Face_reg_app/android-sdk/SDK_INTERFACE.md

6.4 KiB

Face SDK 接口文档 (Java)

本文档详细说明了 face-sdk-v1.0.0.aar 提供的 Java 接口,供 Android 开发人员集成使用。

1. 核心类概览

类名 说明
com.bonuos.facesdk.FaceRecognizer 人脸识别核心类。负责特征提取、人脸比对和识别。
com.bonuos.facesdk.LivenessDetector 活体检测类。负责检测摄像头预览或图片中的人脸是否为活体。
com.bonuos.facesdk.SyncManager 数据同步管理类。负责从服务器拉取最新的人脸数据库。
com.bonuos.facesdk.FaceRepository 本地数据库仓库。提供对本地 SQLite 数据库的直接访问(通常不需要直接使用)。

2. 接口详解

2.1 FaceRecognizer (人脸识别)

负责加载本地人脸库并对输入的图像进行识别。

构造方法

public FaceRecognizer(Context context)
  • 参数: context - 应用程序上下文。
  • 说明: 初始化 SDK 引擎,并从本地数据库加载所有人脸特征到内存缓存。

方法

recognize

public RecognitionResult recognize(Bitmap bitmap)
  • 说明: 对输入图片进行人脸检测、特征提取,并与本地库进行比对。
  • 参数: bitmap - 包含人脸的图片(建议预处理为正向人脸)。
  • 返回: RecognitionResult 对象。

setThreshold

public void setThreshold(float threshold)
  • 说明: 设置识别的相似度阈值。
  • 参数: threshold - 浮点数 (0.0 - 1.0)。默认约为 0.65,建议根据实际场景微调。

reloadUsers

public synchronized void reloadUsers()
  • 说明: 重新从数据库加载用户数据到内存。
  • 场景: 当 SyncManager 完成数据同步后调用,以刷新内存缓存。

extractFeature

public float[] extractFeature(Bitmap bitmap)
  • 说明: 仅提取人脸特征向量,不进行比对。
  • 返回: 特征数组 float[],如果提取失败返回 null

release

public void release()
  • 说明: 释放底层算法引擎资源。建议在 Activity.onDestroy() 中调用。

2.2 LivenessDetector (活体检测)

基于 Silent-Face-Anti-Spoofing 模型的静默活体检测。

方法

init

public void init(Context context)
  • 说明: 初始化活体检测模型。建议在子线程执行,因为加载模型可能耗时。

detect

public LivenessResult detect(Bitmap bitmap)
  • 说明: 检测输入图片中的人脸活体得分。
  • 参数: bitmap - 待检测图片。
  • 返回: LivenessResult 对象。包含活体得分和人脸位置。

release

public void release()
  • 说明: 释放模型资源。

2.3 SyncManager (数据同步)

负责与后端服务器通信,更新本地人脸库。

构造方法

public SyncManager(Context context)

方法

syncData

public void syncData()
  • 说明: 阻塞式方法(需要在子线程调用)。从服务器下载最新的用户列表和特征数据,并更新到本地数据库。
  • 注意: 若需修改服务器地址,请修改源码中的 SYNC_URL 常量或扩展该类。

3. 数据模型

3.1 RecognitionResult

识别结果封装类。

字段 类型 说明
success boolean 识别是否成功。
user FaceRepository.FaceUser 识别到的用户信息(仅当 success=true 时有效)。
similarity float 相似度得分 (0.0 - 1.0)。
message String 错误信息或提示。

3.2 LivenessResult

活体检测结果。

字段 类型 说明
score float 活体得分。一般 > 0.9 可认为是活体,根据实际模型调整。
faceBox FaceBox 检测到的人脸框坐标信息。

3.3 FaceRepository.FaceUser

单一用户实体。

字段 类型 说明
userId String 用户唯一 ID。
name String 用户姓名。
feature float[] 512维人脸特征向量。
featureVersion String 特征版本号。

4. 集成示例

步骤 1: 引入 AAR

face-sdk-v1.0.0.aar 放入 libs 目录,并在 build.gradle 中配置:

[!IMPORTANT] 关键依赖说明 由于 AAR 以本地文件方式引入,无法自动解析传递性依赖。必须手动添加以下 Gson 和 WebSocket 库,否则运行时会发生 Crash (ClassNotFoundException)

dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar"))))
    
    // [必须] JSON 解析库
    implementation("com.google.code.gson:gson:2.10.1")
    
    // [必须] 数据同步需要的 WebSocket
    implementation("org.java-websocket:Java-WebSocket:1.5.4")
}

步骤 2: 完整调用流程

public class FaceAuthActivity extends AppCompatActivity {
    private FaceRecognizer recognizer;
    private LivenessDetector livenessDetector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 1. 初始化
        recognizer = new FaceRecognizer(this);
        livenessDetector = new LivenessDetector();
        livenessDetector.init(this);
        
        // 2. 开启线程进行识别
        new Thread(() -> {
            Bitmap captureInfo = getCameraFrame(); // 获取摄像头帧
            
            // 2.1 活体检测
            LivenessResult liveResult = livenessDetector.detect(captureInfo);
            if (liveResult.score > 0.9f) {
                
                // 2.2 人脸识别
                RecognitionResult result = recognizer.recognize(captureInfo);
                
                runOnUiThread(() -> {
                    if (result.success) {
                        Toast.makeText(this, "欢迎, " + result.user.name, Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(this, "识别失败: " + result.message, Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }).start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 3. 释放资源
        if (recognizer != null) recognizer.release();
        if (livenessDetector != null) livenessDetector.release();
    }
}