更新记录
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=2 的 verifyToken |
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-v7a、arm64-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 项目时,可直接在插件目录中替换授权文件。
授权配置
去哪里下载授权文件
授权文件不是由本插件生成,需要登录百度智能云控制台申请和下载。操作路径如下:
- 在百度智能云控制台进入“人脸识别”服务。
- 进入“人脸实名认证 → 项目管理 → 方案管理”。
- 新建或选择一个“人脸实名认证 App 方案”,平台选择 Android。
- 按实际宿主 App 填写 Android 包名和签名证书 MD5,并完成方案配置。
- 提交方案,进入方案管理页面,下载该方案的 Android 集成文件(含示例工程)。
- 解压下载包,从示例工程的
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-android和idl-key.face-android必须来自同一个 App 方案并成套使用,不能跨方案混用。- 不要修改授权文件内容,也不要随意修改文件名;当前插件初始化默认使用上面列出的文件名。
- 授权文件应放在插件自己的
utssdk/app-android/assets,不要放到项目级nativeResources/android/assets。 - 初始化传入的
licenseKey应使用该 Android App 方案对应的值。 - App 实际包名和实际签名必须与申请方案时填写的信息一致,否则通常会出现
1006(签名不匹配)或1008(包名不匹配)。
必须重新打基座: 替换任一授权文件或配置文件后,保存项目并重新制作 Android 自定义调试基座,然后安装并使用新基座调试。授权文件会在制作基座时打进 APK,普通热更新、重新运行页面或继续使用旧基座都不会让新文件生效。建议卸载旧基座后安装新基座,避免误用旧 APK。
下面四项必须属于百度控制台中的同一个 Android 应用:
- Android
applicationId,即 APK 包名。 - APK 的实际签名证书,正式环境通常为 Release 签名。
- 初始化时传入的百度 License Key。
- 插件
assets中的idl-license.face-android、idl-key.face-android。
如果百度控制台同时下发了新的 local_config.json、quality_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 BaiduFaceInitOptions、as BaiduFaceLiveConfig 或 as 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 是进程级单例,因此设置结果会同时作用于后续的 startLiveness 和 startFaceCompare,直到再次设置或释放 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"
}
注意:
generate和uploadMatchImage必须使用同一个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_passed、code、message 和风控字段完成最终业务判定,再把业务结果返回 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 或可信底图。
回调结果说明
startLiveness 和 startFaceCompare 使用相同的回调结果:
以下是插件的 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 超限,需要降低并发或让客户提高额度 |
错误排查时建议同时保留:场景、发生时间、sdkResultCode、cloudErrorCode 和 logId。不要在生产日志中保存完整 Token、底图、视频或其他人脸数据。
相机权限
默认调用:
requestCameraPermission: true
插件会先检查并申请 android.permission.CAMERA。用户拒绝权限时,通过 fail 和 complete 返回 -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.resolveLocalFileSystemURL 和 plus.io.FileReader 读取图片 Base64;这部分同样不需要任何 as ... 类型断言。
生产环境如果页面只调用自己的业务服务端获取 Token,仍然需要 uni-network。如果 1:1 底图完全由业务服务端管理,正式页面通常不需要 uni-media 和 uni-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 的
success、fail、complete回调。 - 完整调试回调打印。
- SDK 释放。
两份页面的业务流程相同,区别只在宿主语言:
- uni-app x 页面使用 UTS 类型和
as BaiduFace...类型断言。 - 普通 uni-app 页面使用 JavaScript 普通对象,不写任何
as ...。
页面中直连百度和选择底图的代码只用于当前内部联调,不能直接作为生产架构使用。
官方文档
- 百度 Android App 方案集成指南
- 百度人脸 1:1 对比 REST API
- 百度在线图片活体 V3 REST API
- 百度人脸识别错误码
- DCloud UTS 插件开发
- DCloud Android 原生应用资源
- DCloud uni-app x 模块配置
本插件走“人脸实名认证 App 方案”的 Android SDK 流程,应优先参考第一份百度文档。后两份百度 REST API 是服务端直接上传图片的通用接口,不能代替本插件所需的 verifyToken/generate、uploadMatchImage 和 Android SDK 调用链。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 616
赞赏 15
下载 12598102
赞赏 1949
赞赏
京公网安备:11010802035340号