更新记录

1.0.0(2026-09-14)

  • 新版发布

平台兼容性

uni-app(5.05)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(5.05)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × × × ×

yt-bdlineface

yt-bdlineface 是百度“人脸实名认证 App 方案”的 Android UTS 插件,可供 uni-app x 和普通 uni-app(Vue 3) 项目调用。插件封装了百度原生 SDK 的初始化、在线活体检测和在线活体+人脸 1:1 比对功能。

当前插件仅支持 Android,不支持 iOS、HarmonyOS、Web 和小程序。

功能说明

导出方法 作用
initializeBaiduFace 初始化百度人脸 SDK
startLiveness 启动在线活体检测,要求 match_source=2verifyToken
startFaceCompare 启动在线活体+人脸 1:1,要求已上传底图的 match_source=1 Token
setFaceLiveConfig 动态设置后续流程使用的本地活体方式、动作数量和候选动作
getFaceLiveConfig 获取百度 SDK 当前实际生效的本地活体配置
isBaiduFaceInitialized 查询 SDK 是否初始化成功
isBaiduFaceRunning 查询是否有活体或 1:1 流程正在运行
releaseBaiduFace 释放百度 SDK 资源

插件只负责调用 Android 原生 SDK,不负责保存百度 AK/SK、生成 verify_token、上传 1:1 底图或查询最终业务结果。

运行环境

  • uni-app x Android 项目,或普通 uni-app(Vue 3)Android 项目。
  • 当前工程已使用 HBuilderX 5.23 验证。
  • Android minSdkVersion 不低于 21。
  • 支持 armeabi-v7aarm64-v8a
  • 必须使用 ARM 真机测试;普通 x86 模拟器可能无法加载百度 SO。
  • 必须制作 Android 自定义调试基座,标准基座不包含本插件的 AAR、SO 和授权资源。

插件目录

uni_modules/yt-bdlineface/
├── package.json
├── readme.md
└── utssdk/
    ├── interface.uts
    └── app-android/
        ├── assets/
        │   ├── idl-license.face-android
        │   ├── idl-key.face-android
        │   ├── local_config.json
        │   └── quality_config.json
        ├── libs/
        │   ├── baidu-face-release.aar
        │   ├── lib-FaceAuthEnhanceSDK-3.0.1-release.aar
        │   ├── lib-FacePlatform-UI-6.4.6-release.aar
        │   └── lib-LiantianStaticLiteAes-3.9.0.8.7.2-gua-release.aar
        ├── AndroidManifest.xml
        ├── config.json
        └── index.uts

百度授权文件放在插件自己的 utssdk/app-android/assets 中。将插件复制到其他 uni-app x 或普通 uni-app 项目时,可直接在插件目录中替换授权文件。

授权配置

去哪里下载授权文件

授权文件不是由本插件生成,需要登录百度智能云控制台申请和下载。操作路径如下:

  1. 在百度智能云控制台进入“人脸识别”服务。
  2. 进入“人脸实名认证 → 项目管理 → 方案管理”。
  3. 新建或选择一个“人脸实名认证 App 方案”,平台选择 Android。
  4. 按实际宿主 App 填写 Android 包名和签名证书 MD5,并完成方案配置。
  5. 提交方案,进入方案管理页面,下载该方案的 Android 集成文件(含示例工程)
  6. 解压下载包,从示例工程的 assets 目录中取得该方案配套的授权和配置文件。

详细控制台操作可参考百度官方文档:方案集成前准备Android 方案集成指南。百度官方说明,方案提交后需要在方案管理页面下载 Android 集成文件;方案发生修改后也要重新下载,不能继续使用旧授权文件。

替换插件中的授权文件

把下载包中的文件替换到以下目录:

uni_modules/yt-bdlineface/utssdk/app-android/assets/
├── idl-license.face-android   # 人脸授权文件,必须替换
├── idl-key.face-android       # 风控密钥文件,必须替换
├── local_config.json          # 下载包提供新文件时一起替换
└── quality_config.json        # 下载包提供新文件时一起替换

注意事项:

  • idl-license.face-androididl-key.face-android 必须来自同一个 App 方案并成套使用,不能跨方案混用。
  • 不要修改授权文件内容,也不要随意修改文件名;当前插件初始化默认使用上面列出的文件名。
  • 授权文件应放在插件自己的 utssdk/app-android/assets,不要放到项目级 nativeResources/android/assets
  • 初始化传入的 licenseKey 应使用该 Android App 方案对应的值。
  • App 实际包名和实际签名必须与申请方案时填写的信息一致,否则通常会出现 1006(签名不匹配)或 1008(包名不匹配)。

必须重新打基座: 替换任一授权文件或配置文件后,保存项目并重新制作 Android 自定义调试基座,然后安装并使用新基座调试。授权文件会在制作基座时打进 APK,普通热更新、重新运行页面或继续使用旧基座都不会让新文件生效。建议卸载旧基座后安装新基座,避免误用旧 APK。

下面四项必须属于百度控制台中的同一个 Android 应用:

  1. Android applicationId,即 APK 包名。
  2. APK 的实际签名证书,正式环境通常为 Release 签名。
  3. 初始化时传入的百度 License Key。
  4. 插件 assets 中的 idl-license.face-androididl-key.face-android

如果百度控制台同时下发了新的 local_config.jsonquality_config.json,也应一起替换。

常见授权错误:

初始化码 含义 排查方向
1000 初始化成功 可以启动活体或 1:1
1004 License Key 校验错误 检查初始化参数和授权文件
1006 签名 MD5 校验错误 检查实际 APK 签名
1008 包名校验错误 检查 applicationId
1012 授权文件读取失败 检查文件名和插件 assets
1013 远程授权数据拉取失败 检查包名、签名和网络

替换 AAR、SO、插件 assets、Manifest、包名、签名或 ABI 后,必须重新制作并安装自定义基座。制作基座时使用的包名和签名也必须与百度 App 方案一致,代码热更新无法改变已经安装的原生基座内容。

总体调用边界

生产环境推荐调用链:

用户同意人脸信息处理规则
        ↓
App 初始化百度 SDK
        ↓
App 可选设置并读取当前 FaceLiveConfig
        ↓
App 请求客户业务服务端
        ↓
业务服务端使用百度 AK/SK 调用百度接口
        ↓
业务服务端返回短期 verifyToken
        ↓
App 调用 startLiveness 或 startFaceCompare
        ↓
百度 SDK 返回 success / fail / complete
        ↓
业务服务端按 verifyToken 查询最终结果并决定业务是否通过

生产环境禁止把以下内容写入 App、UTS 插件或 AAR:

  • 百度 API Key(AK)。
  • 百度 Secret Key(SK)。
  • 百度 access_token
  • 业务 plan_id
  • 用户的 1:1 对比底图。

示例项目的页面为方便开发验证,临时演示了 App 直连百度获取 Token 的方式。这种方式只能用于内部测试,正式发布前必须删除,改成请求客户业务服务端。

第一步:根据项目类型导入插件 API

uni-app x 页面

.uvue<script setup lang="uts"> 中导入方法以及参数、结果类型:

import {
    initializeBaiduFace,
    startLiveness,
    startFaceCompare,
    setFaceLiveConfig,
    getFaceLiveConfig,
    releaseBaiduFace,
    isBaiduFaceInitialized,
    isBaiduFaceRunning,
    BaiduFaceInitOptions,
    BaiduFaceInitResult,
    BaiduFaceLiveConfig,
    BaiduFaceVerifyOptions,
    BaiduFaceVerifyResult
} from '@/uni_modules/yt-bdlineface'

uni-app x 使用 UTS 强类型。创建配置对象时应通过 as BaiduFaceInitOptionsas BaiduFaceLiveConfigas BaiduFaceVerifyOptions 明确对象类型,回调参数也应声明为对应结果类型。

普通 uni-app 页面

普通 uni-app 的 .vue 页面使用 JavaScript,只导入需要调用的方法:

import {
    initializeBaiduFace,
    startLiveness,
    startFaceCompare,
    setFaceLiveConfig,
    getFaceLiveConfig,
    releaseBaiduFace,
    isBaiduFaceInitialized,
    isBaiduFaceRunning
} from '@/uni_modules/yt-bdlineface'

普通 uni-app 不需要也不能在 JavaScript 中写 UTS 类型断言,例如:

// 普通 uni-app:直接传普通 JavaScript 对象。
const options = {
    verifyToken: token,
    requestCameraPermission: true
}
startLiveness(options)

不要在普通 .vue<script> 中复制以下 uni-app x 写法:

// 仅用于 uni-app x / UTS,普通 JavaScript 会产生语法错误。
const options = { /* ... */ } as BaiduFaceVerifyOptions

第二步:隐私同意和 SDK 初始化

初始化前必须向用户说明人脸信息处理目的、方式和范围,并取得用户单独同意。建议整个 App 生命周期只初始化一次。

uni-app x 初始化

function initializeFaceSdk() : void {
    const options = {
        // 百度控制台 Android 应用对应的 License Key。
        licenseKey: '你的LicenseKey',

        // 默认就是下面两个文件名。如果没有改名,可以省略。
        licenseFileName: 'idl-license.face-android',
        keyFileName: 'idl-key.face-android',

        success: (result : BaiduFaceInitResult) => {
            // 百度初始化成功码为1000。
            console.log(`百度SDK初始化成功:${JSON.stringify(result)}`)
        },
        fail: (result : BaiduFaceInitResult) => {
            // 重点检查包名、APK签名、License Key和插件assets授权文件。
            console.log(`百度SDK初始化失败:${JSON.stringify(result)}`)
        },
        complete: (result : BaiduFaceInitResult) => {
            // success或fail执行后都会执行complete。
            console.log(`百度SDK初始化结束:code=${result.resultCode}`)
        }
    } as BaiduFaceInitOptions

    initializeBaiduFace(options)
}

初始化前后可以查询状态:

const initialized = isBaiduFaceInitialized()
console.log(`SDK是否已初始化:${initialized}`)

普通 uni-app 初始化

普通 uni-app 直接传入 JavaScript 对象,回调参数不需要写类型:

function initializeFaceSdk() {
    const options = {
        // 必须与Android包名、签名和插件assets授权文件匹配。
        licenseKey: '你的LicenseKey',
        licenseFileName: 'idl-license.face-android',
        keyFileName: 'idl-key.face-android',

        success: (result) => {
            console.log(`百度SDK初始化成功:${JSON.stringify(result)}`)
        },
        fail: (result) => {
            console.log(`百度SDK初始化失败:${JSON.stringify(result)}`)
        },
        complete: (result) => {
            console.log(`百度SDK初始化结束:code=${result.resultCode}`)
        }
    }

    // 普通uni-app不写“as BaiduFaceInitOptions”。
    initializeBaiduFace(options)
}

const initialized = isBaiduFaceInitialized()
console.log(`SDK是否已初始化:${initialized}`)

动态设置和读取活体配置

动态配置必须在 SDK 初始化成功后、人脸流程启动前调用。百度 FaceLiveConfig 是进程级单例,因此设置结果会同时作用于后续的 startLivenessstartFaceCompare,直到再次设置或释放 SDK。

配置类型:

export type BaiduFaceLiveConfig = {
    openActionLive : boolean
    openColorLive : boolean
    openDistanceLive : boolean
    activeStrict : boolean
    actionNum : number
    actionList : Array<string>
}

字段说明:

字段 说明
openActionLive 是否开启动作活体
openColorLive 是否开启炫彩/炫瞳活体
openDistanceLive 是否开启远近活体
activeStrict 是否开启眨眼、张嘴遮挡严格检测
actionNum 每次从候选列表随机执行的动作数,不能大于 actionList.length
actionList 动作候选列表;开启动作活体时不能为空

支持的动作:

动作名 含义
eye 眨眼
mouth 张嘴
headLeft 向左转头
headRight 向右转头
headUp 抬头
headDown 低头
headShake 摇头
headUpDown 点头

uni-app x 动态配置

function configureFaceLiveness() : void {
    const config = {
        openActionLive: true,
        openColorLive: true,
        openDistanceLive: false,
        activeStrict: false,
        // 从下面四个候选动作中随机执行两个。
        actionNum: 2,
        actionList: ['eye', 'mouth', 'headLeft', 'headRight']
    } as BaiduFaceLiveConfig

    try {
        setFaceLiveConfig(config)
        const current = getFaceLiveConfig()
        console.log(`当前动作数:${current.actionNum}`)
        console.log(`当前候选动作:${current.actionList.join(',')}`)
    } catch (error) {
        // 未初始化、流程正在运行、动作名错误、重复动作或数量越界都会失败。
        console.log(`活体配置失败:${error}`)
    }
}

普通 uni-app 动态配置

普通 uni-app 使用相同字段,但不需要 BaiduFaceLiveConfig 类型断言:

function configureFaceLiveness() {
    const config = {
        openActionLive: true,
        openColorLive: true,
        openDistanceLive: false,
        activeStrict: false,
        // 从四个候选动作中随机执行两个。
        actionNum: 2,
        actionList: ['eye', 'mouth', 'headLeft', 'headRight']
    }

    try {
        // 普通uni-app不写“as BaiduFaceLiveConfig”。
        setFaceLiveConfig(config)
        const current = getFaceLiveConfig()
        console.log(`当前动作数:${current.actionNum}`)
        console.log(`当前候选动作:${current.actionList.join(',')}`)
    } catch (error) {
        console.log(`活体配置失败:${error}`)
    }
}

配置规则:

  • 必须先完成 initializeBaiduFace
  • setFaceLiveConfig 只能在人脸流程未运行时调用。
  • 开启动作活体时,actionList 不能为空且 actionNum 至少为 1
  • actionNum 不能超过候选动作数量,候选动作不能重复。
  • 所有活体方式都关闭时表示静默活体;具体组合应按客户业务和风控要求确定。
  • 插件 assets 中的 local_config.json 是 SDK 初始化时的默认配置;动态设置只影响当前 App 进程,不会写回该文件。

在线活体检测流程

服务端流程

在线活体使用 match_source=2

App请求业务服务端获取活体Token
        ↓
业务服务端通过AK/SK获取或复用百度access_token
        ↓
业务服务端调用 verifyToken/generate
        ↓
请求参数 match_source=2、plan_id=客户方案ID
        ↓
业务服务端只把 verify_token 返回App
        ↓
App可选调用 setFaceLiveConfig 设置本次活体策略
        ↓
App调用 startLiveness

百度生成 Token 的接口:

POST https://aip.baidubce.com/rpc/2.0/brain/solution/faceprint/verifyToken/generate?access_token=ACCESS_TOKEN
Content-Type: application/json

请求体:

{
  "match_source": 2,
  "plan_id": "客户的APP方案ID"
}

成功响应中需要返回给 App 的字段:

{
  "success": true,
  "result": {
    "verify_token": "短期Token"
  }
}

verify_token 有效期约两小时,建议每次开始新的人脸流程时重新获取。活体 Token 和 1:1 Token 的类型不同,不能混用。

uni-app x 调用活体

function startOnlineLiveness(verifyToken : string) : void {
    if (!isBaiduFaceInitialized()) {
        console.log('请先初始化百度人脸SDK')
        return
    }
    if (isBaiduFaceRunning()) {
        console.log('已有一个百度人脸流程正在运行')
        return
    }

    const options = {
        // 必须是业务服务端生成的match_source=2 Token。
        verifyToken: verifyToken,

        // 默认为true,由插件动态申请CAMERA权限。
        requestCameraPermission: true,

        success: (result : BaiduFaceVerifyResult) => {
            console.log(`[在线活体][success] ${JSON.stringify(result)}`)
        },
        fail: (result : BaiduFaceVerifyResult) => {
            // 用户取消、本地权限失败、SDK错误或百度云错误都会进入fail。
            console.log(`[在线活体][fail] ${JSON.stringify(result)}`)
        },
        complete: (result : BaiduFaceVerifyResult) => {
            // success或fail之后必定执行。
            console.log(`[在线活体][complete] sdkCode=${result.sdkResultCode}`)
        }
    } as BaiduFaceVerifyOptions

    startLiveness(options)
}

普通 uni-app 调用活体

function startOnlineLiveness(verifyToken) {
    if (!isBaiduFaceInitialized()) {
        console.log('请先初始化百度人脸SDK')
        return
    }
    if (isBaiduFaceRunning()) {
        console.log('已有一个百度人脸流程正在运行')
        return
    }

    const options = {
        // 必须是业务服务端生成的match_source=2 Token。
        verifyToken,
        requestCameraPermission: true,

        success: (result) => {
            console.log(`[在线活体][success] ${JSON.stringify(result)}`)
        },
        fail: (result) => {
            console.log(`[在线活体][fail] ${JSON.stringify(result)}`)
        },
        complete: (result) => {
            console.log(`[在线活体][complete] sdkCode=${result.sdkResultCode}`)
        }
    }

    // 普通uni-app不写“as BaiduFaceVerifyOptions”。
    startLiveness(options)
}

仅活体场景不需要上传 1:1 底图。业务服务端取得 match_source=2 的 Token 后可以直接返回 App。

在线活体+人脸 1:1 流程

1:1 场景不能在生成 Token 后直接启动 SDK,必须先使用同一个 Token 上传可信底图。

服务端流程

App向业务服务端提交当前业务用户标识
        ↓
服务端找到该用户可信底图
        ↓
服务端调用 verifyToken/generate,match_source=1
        ↓
服务端取得 verify_token
        ↓
服务端使用同一个 verify_token 调用 uploadMatchImage 上传底图
        ↓
确认底图上传成功
        ↓
服务端把 verify_token 返回App
        ↓
App可选调用 setFaceLiveConfig 设置本次活体策略
        ↓
App调用 startFaceCompare

生成 1:1 Token:

POST https://aip.baidubce.com/rpc/2.0/brain/solution/faceprint/verifyToken/generate?access_token=ACCESS_TOKEN
Content-Type: application/json
{
  "match_source": 1,
  "plan_id": "客户的APP方案ID"
}

使用同一个 Token 上传底图:

POST https://aip.baidubce.com/rpc/2.0/brain/solution/faceprint/uploadMatchImage?access_token=ACCESS_TOKEN
Content-Type: application/json
{
  "verify_token": "刚生成的match_source=1 Token",
  "image": "不带data:image前缀的图片Base64",
  "quality_control": "LOW",
  "liveness_control": "NONE"
}

注意:

  • generateuploadMatchImage 必须使用同一个 verify_token
  • 必须确认 uploadMatchImage 成功后才能把 Token 返回 App。
  • 底图应由服务端根据当前登录用户获取,不应让 App 任意指定其他用户的底图。
  • 底图 Base64 不带 data:image/jpeg;base64, 前缀。
  • 按百度接口要求控制图片格式、尺寸和大小。

uni-app x 调用 1:1

function startOnlineFaceCompare(verifyToken : string) : void {
    if (!isBaiduFaceInitialized()) {
        console.log('请先初始化百度人脸SDK')
        return
    }
    if (isBaiduFaceRunning()) {
        console.log('已有一个百度人脸流程正在运行')
        return
    }

    const options = {
        // 必须是match_source=1,并且服务端已经用该Token上传过底图。
        verifyToken: verifyToken,
        requestCameraPermission: true,

        success: (result : BaiduFaceVerifyResult) => {
            console.log(`[人脸1:1][success] ${JSON.stringify(result)}`)
        },
        fail: (result : BaiduFaceVerifyResult) => {
            console.log(`[人脸1:1][fail] ${JSON.stringify(result)}`)
        },
        complete: (result : BaiduFaceVerifyResult) => {
            console.log(`[人脸1:1][complete] sdkCode=${result.sdkResultCode}`)
        }
    } as BaiduFaceVerifyOptions

    startFaceCompare(options)
}

普通 uni-app 调用 1:1

function startOnlineFaceCompare(verifyToken) {
    if (!isBaiduFaceInitialized()) {
        console.log('请先初始化百度人脸SDK')
        return
    }
    if (isBaiduFaceRunning()) {
        console.log('已有一个百度人脸流程正在运行')
        return
    }

    const options = {
        // 必须是match_source=1,且服务端已用同一个Token上传可信底图。
        verifyToken,
        requestCameraPermission: true,

        success: (result) => {
            console.log(`[人脸1:1][success] ${JSON.stringify(result)}`)
        },
        fail: (result) => {
            console.log(`[人脸1:1][fail] ${JSON.stringify(result)}`)
        },
        complete: (result) => {
            console.log(`[人脸1:1][complete] sdkCode=${result.sdkResultCode}`)
        }
    }

    // 普通uni-app不写“as BaiduFaceVerifyOptions”。
    startFaceCompare(options)
}

App 调用 startFaceCompare 时不再上传底图,只把服务端准备好的 verifyToken 交给插件。

完成后的服务端结果确认

SDK 回调中的云端 error_code=0 是百度返回的认证建议结果。涉及开户、支付、身份变更等敏感业务时,客户服务端应保存本次 verifyToken,并在 SDK 流程结束后调用百度的核验结果接口确认最终状态。

查询本 Token 全部核验记录:

POST https://aip.baidubce.com/rpc/2.0/brain/solution/faceprint/result/getall?access_token=ACCESS_TOKEN
Content-Type: application/json
{
  "verify_token": "本次人脸流程使用的Token"
}

服务端应以返回记录中的 is_verify_passedcodemessage 和风控字段完成最终业务判定,再把业务结果返回 App。百度文档说明核验记录在云端保留三天,客户服务端应在时限内完成查询;不要依赖 App 把客户端回调内容原样上报后直接判定成功。

建议客户服务端至少向 App 提供三个业务接口:

业务接口 App 请求内容 服务端职责
获取活体 Token 当前登录态、业务流水号 生成 match_source=2 Token并绑定当前用户和流水号
获取 1:1 Token 当前登录态、业务流水号 生成 match_source=1 Token,用同一 Token 上传该用户可信底图,成功后返回 Token
查询业务结果 业务流水号 根据服务端保存的 Token 查询百度最终结果并返回业务判定

以上是业务接口职责示例,实际 URL、鉴权方式和返回结构由客户后端定义。App 不需要也不应获取 AK、SK、百度 access_token 或可信底图。

回调结果说明

startLivenessstartFaceCompare 使用相同的回调结果:

以下是插件的 UTS 类型定义。普通 uni-app 收到的是包含相同字段的 JavaScript 对象,不需要导入或断言该类型。

export type BaiduFaceVerifyResult = {
    success : boolean
    cancelled : boolean
    sdkResultCode : number
    sdkMessage : string
    cloudErrorCode : number | null
    cloudErrorMessage : string | null
    logId : string | null
    rawData : string | null
}
字段 说明
success SDK 本地流程完成且百度云 error_code=0 时为 true
cancelled 用户主动关闭或取消采集流程时为 true
sdkResultCode SDK/插件本地结果码;0 表示已经取得云端响应,不代表最终一定通过
sdkMessage SDK 或插件本地提示信息
cloudErrorCode 百度云错误码;本地阶段失败时为 null
cloudErrorMessage 百度云错误说明
logId 百度链路日志 ID,提交百度工单时应提供
rawData 百度 SDK 返回的原始 JSON,仅供开发排障

uni-app x 判断回调

function handleVerifyResult(result : BaiduFaceVerifyResult) : void {
    if (result.success) {
        console.log('SDK建议结果成功')
    } else if (result.cancelled) {
        console.log('用户取消了人脸流程')
    } else if (result.cloudErrorCode != null) {
        console.log(`百度云失败:${result.cloudErrorCode},${result.cloudErrorMessage}`)
    } else {
        console.log(`本地失败:${result.sdkResultCode},${result.sdkMessage}`)
    }
}

普通 uni-app 判断回调

function handleVerifyResult(result) {
    if (result.success) {
        console.log('SDK建议结果成功')
    } else if (result.cancelled) {
        console.log('用户取消了人脸流程')
    } else if (result.cloudErrorCode != null) {
        console.log(`百度云失败:${result.cloudErrorCode},${result.cloudErrorMessage}`)
    } else {
        console.log(`本地失败:${result.sdkResultCode},${result.sdkMessage}`)
    }
}

客户端回调适合用于页面提示,不建议把客户端的 success=true 直接作为发放资金、修改身份等敏感业务的唯一判断条件。正式业务应由客户服务端使用 verifyToken 查询百度最终结果,并在服务端完成业务判定。

插件本地错误码

错误码 含义
-21001 当前前台 Activity 不可用
-21002 用户拒绝相机权限
-21003 无法取得 Android Application Context

百度 SDK 常见结果:

错误码 含义
-102 用户取消采集
-103 SDK 尚未初始化
-302 没有相机权限
-310 相机打开失败
-401 人脸采集超时
-1001 网络超时
云端 18 百度 OpenAPI QPS 超限,需要降低并发或让客户提高额度

错误排查时建议同时保留:场景、发生时间、sdkResultCodecloudErrorCodelogId。不要在生产日志中保存完整 Token、底图、视频或其他人脸数据。

相机权限

默认调用:

requestCameraPermission: true

插件会先检查并申请 android.permission.CAMERA。用户拒绝权限时,通过 failcomplete 返回 -21002

如果业务页面已经完成权限申请,可以设置:

requestCameraPermission: false

此时业务 App 必须保证调用前已经获得相机权限。

防止重复调用

百度 SDK 不支持同时启动多个人脸流程。调用前可进行检查:

if (isBaiduFaceRunning()) {
    uni.showToast({
        title: '人脸流程正在运行,请勿重复点击',
        icon: 'none'
    })
    return
}

业务按钮还应增加 busy 状态,直到 complete 回调执行后再恢复点击。

释放 SDK

if (!isBaiduFaceRunning()) {
    releaseBaiduFace()
}

不要在人脸采集页面运行过程中释放 SDK。通常只在确定不再使用人脸能力或 App 退出对应业务模块时调用。

自定义基座模块

插件自身通过 Android 原生代码调用百度 SDK。如果业务示例页面还使用网络、相册和文件读取 API,需要把模块配置写在对应项目类型的 Manifest 中,并重新制作自定义基座。

在开始制作基座前,请先完成前面“授权配置”中的文件替换。正确顺序是:

从百度方案管理下载Android集成文件
        ↓
替换插件app-android/assets中的配套文件
        ↓
确认HBuilderX打包使用的包名和签名与百度方案一致
        ↓
重新制作并安装Android自定义调试基座
        ↓
选择新基座运行并初始化SDK

uni-app x 的 manifest.json

{
  "app-android": {
    "distribute": {
      "modules": {
        "uni-network": {},
        "uni-media": {},
        "uni-fileSystemManager": {}
      }
    }
  }
}

普通 uni-app 的 manifest.json

普通 uni-app 的对应位置是 app-plus.modules

{
  "app-plus": {
    "modules": {
      "uni-network": {},
      "uni-media": {},
      "uni-fileSystemManager": {}
    }
  }
}
  • uni-network:页面使用 uni.request
  • uni-media:页面使用 uni.chooseImage
  • uni-fileSystemManager:uni-app x 页面读取图片 Base64。

需要注意:普通 uni-app App 的 JavaScript 页面不能照搬 uni-app x 的 uni.getFileSystemManager()。本文配套普通 uni-app 完整页面使用 plus.io.resolveLocalFileSystemURLplus.io.FileReader 读取图片 Base64;这部分同样不需要任何 as ... 类型断言。

生产环境如果页面只调用自己的业务服务端获取 Token,仍然需要 uni-network。如果 1:1 底图完全由业务服务端管理,正式页面通常不需要 uni-mediauni-fileSystemManager

遇到“当前运行的基座未包含 API”时,应保存代码和 Manifest 后重新制作自定义基座,并确认运行时选择了新基座。旧基座不能通过热更新增加原生模块。

完整页面示例

uni-app x 完整示例:

见示例工程的BDLineFaceDemo/pages/index/index.uvue(uniappx的示例工作在uniapp项目的static文件夹下BDLineFaceDemo.zip文件复制出去直接解压即可)

普通 uni-app(Vue 3)完整示例:

见示例工程的/pages/index/index.vue

页面演示了:

  • 隐私同意。
  • SDK 初始化和状态查询。
  • 动态设置随机两个动作并读取当前 FaceLiveConfig
  • 测试阶段自动获取活体 Token。
  • 选择 1:1 底图、生成 Token、上传底图。
  • 活体和 1:1 的 successfailcomplete 回调。
  • 完整调试回调打印。
  • SDK 释放。

两份页面的业务流程相同,区别只在宿主语言:

  • uni-app x 页面使用 UTS 类型和 as BaiduFace... 类型断言。
  • 普通 uni-app 页面使用 JavaScript 普通对象,不写任何 as ...

页面中直连百度和选择底图的代码只用于当前内部联调,不能直接作为生产架构使用。

官方文档

本插件走“人脸实名认证 App 方案”的 Android SDK 流程,应优先参考第一份百度文档。后两份百度 REST API 是服务端直接上传图片的通用接口,不能代替本插件所需的 verifyToken/generateuploadMatchImage 和 Android SDK 调用链。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Android 需要相机、网络和网络状态权限。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件会调用百度人脸 SDK 采集人脸信息并进行在线活体或人脸1:1核验,接入方必须完成隐私告知并取得单独同意。详情参考https://ai.baidu.com/ai-doc/FACE/kloqr0mja

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。