Appearance
使用方法
安卓百度离线人脸识别UTS原生组件,支持在线激活,离线激活,批量激活,单个人脸注册,批量注册,相机人脸注册等,插件使用灵活识别速度快,插件支持自定义数据存储目录。插件支持uniapp和uniappx
注意事项
- 当前插件为
1.x版本的升级版,同时支持uniapp和uniappx - 当前
2.*版本更新内容较多,使用方法有重大更新,如果您当时使用的是1.*版本请移步至1.*版本文档 1.*版本不再更新,后期将直接更新2.*版本- 如果您在使用插件的过程中有任何问题,可以联系作者,作者将全力协助您使用插件
- 本文档同时提供了uniapp的用法示例和uniappx的用法示例,插件市场导入的示例项目仅为uniapp的用法示例,如果您需要uniappx的示例项目可以通过下方的链接下载示例
- 组件只能在nvue/uvue页面中使用,不支持vue页面
使用流程
- 在线激活
- 初始化SDK
- 注册人脸
- 识别人脸
SDK版本
V8.6.0.2026.04.15
联系作者

关注微信公众号可联系作者
官方文档
https://ai.baidu.com/ai-doc/FACE/pk37c1mqu
插件地址
https://ext.dcloud.net.cn/plugin?id=20343
演示程序

进群下载演示程序
权限
- android.permission.CAMERA
- android.permission.WRITE_EXTERNAL_STORAGE
- android.permission.READ_EXTERNAL_STORAGE
API用法
用法
在需要使用插件的页面加载以下代码
js
import * as module from "@/uni_modules/leven-uts-baiduFace"js
import * as module from "@/uni_modules/leven-uts-baiduFace"示例
vue
<template>
<view>
<template v-if="!isCheckActive">
<uni-segmented-control :current="current" :values="items" @clickItem="onClickItem"></uni-segmented-control>
<active-online v-if="current == 0" @onMessage="showMessage" @onSuccess="setCustomSaveDir"></active-online>
<active-offline v-if="current == 1" @onMessage="showMessage" @onSuccess="setCustomSaveDir"></active-offline>
<active-batch v-if="current == 2" @onMessage="showMessage" @onSuccess="setCustomSaveDir"></active-batch>
<view style="text-align: center; margin-bottom: 32px;" @click="toHelp">激活遇到问题?</view>
</template>
<template v-else>
<view style="padding: 32px;">
<view style="text-align: center;">正在加载,请稍后....</view>
</view>
</template>
</view>
</template>
<script>
import ActiveOnline from "./components/activeOnline.vue"
import ActiveOffline from "./components/activeOffline.vue"
import ActiveBatch from "./components/activeBatch.vue"
import * as module from "@/uni_modules/leven-uts-baiduFace"
export default {
components: {
ActiveOnline,
ActiveOffline,
ActiveBatch
},
data() {
return {
isCheckActive: true,
current: 0,
items: ['在线激活', '离线激活', '批量激活']
}
},
mounted() {
this.$nextTick(() => {
this.requestPermissions();
})
},
methods: {
onClickItem(e) {
if (this.current != e.currentIndex) {
this.current = e.currentIndex;
}
},
toHelp() {
uni.navigateTo({
url: "/pages/index/help"
})
},
toHome() {
uni.redirectTo({
url: "/pages/index/home"
})
},
//显示消息
showMessage(message) {
uni.showToast({
title: message,
icon: "none"
})
},
//设置自定义文件保存目录
setCustomSaveDir() {
module.setCustomSaveDir({
params: {
dir: "/storage/emulated/0/levenBaiduFace/"
},
complete: (res) => {
this.toHome()
}
})
},
//判断设备是否激活
isActive() {
module.isActive({
complete: (res) => {
if (res.code == 0) {
let data = res.data || {};
let result = data.result;
if (result) {
this.setCustomSaveDir()
} else {
this.isCheckActive = false;
}
} else {
this.isCheckActive = false;
}
}
})
},
toAllFilesPermissionPage() {
module.toAllFilesPermissionPage({
complete: (res) => {
if (res.code == 0) {
let data = res.data;
if (!data.status) {
this.showMessage("所有文件访问权限未打开")
} else {
this.showMessage("权限申请完成,可以使用插件")
this.isActive();
}
} else {
this.showMessage(res.message)
}
}
})
},
checkAllFilesPermission() {
module.checkAllFilesPermission({
complete: (res) => {
if (res.code == 0) {
let data = res.data;
if (!data.status) {
this.toAllFilesPermissionPage();
} else {
this.showMessage("权限申请完成,可以使用插件")
this.isActive();
}
} else {
this.showMessage(res.message)
}
}
})
},
//申请插件所需权限
requestPermissions() {
module.requestPermissions({
params: {
permissions: [
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.CAMERA"
]
},
complete: (res) => {
if (res.code == 0) {
//判断是否有所有文件访问权限
this.checkAllFilesPermission();
} else {
this.showMessage(res.message)
}
}
})
},
}
}
</script>
<style>
</style>vue
<template>
<!-- #ifdef APP -->
<scroll-view style="flex:1">
<!-- #endif -->
<rice-subsection v-model="current" :list="items"></rice-subsection>
<active-online v-if="current == 0" @onMessage="showMessage" @onSuccess="setCustomSaveDir"></active-online>
<active-offline v-if="current == 1" @onMessage="showMessage" @onSuccess="setCustomSaveDir"></active-offline>
<active-batch v-if="current == 2" @onMessage="showMessage" @onSuccess="setCustomSaveDir"></active-batch>
<view style="justify-content: center; align-items: center; margin-bottom: 32px;" @click="toHelp">激活遇到问题?</view>
<!-- #ifdef APP -->
</scroll-view>
<!-- #endif -->
</template>
<script setup>
import ActiveOnline from "./components/activeOnline.uvue"
import ActiveOffline from "./components/activeOffline.uvue"
import ActiveBatch from "./components/activeBatch.uvue"
import * as module from "@/uni_modules/leven-uts-baiduFace"
import { LevenResult, LevenOptions } from "@/uni_modules/leven-uts-baiduFace"
const isCheckActive = ref(false)
const current = ref(0)
const items = ref<string[]>(['在线激活', '离线激活', '批量激活'])
function showMessage(message : string) {
uni.showToast({
title: message,
icon: "none"
})
}
function toHelp() {
uni.navigateTo({
url: "/pages/baiduFace/help"
})
}
function toHome() {
uni.redirectTo({
url: "/pages/baiduFace/home"
})
}
//设置自定义文件保存目录
function setCustomSaveDir() {
module.setCustomSaveDir({
params: {
dir: "/storage/emulated/0/levenBaiduFace/"
},
complete: (_res : LevenResult) => {
toHome()
}
})
}
//判断设备是否激活
function isActive() {
module.isActive({
complete: (res : LevenResult) => {
if (res.code == 0) {
let data = res.data;
let result = data.getBoolean("result")!;
if (result) {
setCustomSaveDir()
} else {
isCheckActive.value = false;
}
} else {
isCheckActive.value = false;
}
}
})
}
function toAllFilesPermissionPage() {
module.toAllFilesPermissionPage({
complete: (res : LevenResult) => {
if (res.code == 0) {
let data = res.data;
let status : boolean = data.getBoolean("status")!
if (!status) {
showMessage("所有文件访问权限未打开")
} else {
showMessage("权限申请完成,可以使用插件")
isActive();
}
} else {
showMessage(res.message)
}
}
})
}
function checkAllFilesPermission() {
module.checkAllFilesPermission({
complete: (res : LevenResult) => {
if (res.code == 0) {
let data = res.data;
let status : boolean = data.getBoolean("status")!
if (!status) {
toAllFilesPermissionPage();
} else {
showMessage("权限申请完成,可以使用插件")
isActive();
}
} else {
showMessage(res.message)
}
}
})
}
//申请插件所需权限
function requestPermissions() {
module.requestPermissions({
params: {
permissions: [
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.CAMERA"
]
},
complete: (res : LevenResult) => {
if (res.code == 0) {
//判断是否有所有文件访问权限
checkAllFilesPermission();
} else {
showMessage(res.message)
}
}
} as LevenOptions)
}
onMounted(() => {
requestPermissions();
})
</script>
<style>
</style>人脸注册组件
在使用插件的地方引入以下代码:
vue
<leven-uts-baiduFace-CameraRegister ref="refLevenRegister"
style=" position: fixed; left: 0; right: 0; bottom: 0; top: 0;" :config="config" @onEvent="onEvent"
@onError="onError" @onEventMethod="onEventMethod"></leven-uts-baiduFace-CameraRegister>vue
<leven-uts-baiduFace-CameraRegister ref="refLevenRegister" style="flex:1;" :configX="config" @onEvent="onEvent"
@onError="onError" @onEventMethod="onEventMethod"></leven-uts-baiduFace-CameraRegister>
//组件的引用
const refLevenRegister = ref<LevenUtsBaiduFaceCameraRegisterElement | null>(null)页面示例
vue
<template>
<view>
<leven-uts-baiduFace-CameraRegister ref="refLevenRegister"
style=" position: fixed; left: 0; right: 0; bottom: 0; top: 0;" :config="config" @onEvent="onEvent"
@onError="onError" @onEventMethod="onEventMethod"></leven-uts-baiduFace-CameraRegister>
<cover-view style="position: fixed; right: 16px; bottom: 16px;">
<button type="primary" size="mini" @click="openRegister">开始注册</button>
</cover-view>
<uni-popup ref="refPop">
<view style="width: 600rpx; height: 250px; background-color: #FFFFFF; border-radius: 8px;">
<view
style="height: 50px; border-bottom: 1px solid #f2f2f2; flex-direction: row; justify-content: center; align-items: center;">
<text>注册人脸</text>
</view>
<view style=" padding: 16px;">
<view style="margin-bottom: 16px;">
<uni-easyinput v-model="params.id" placeholder="请输入用户id"></uni-easyinput>
</view>
<view style="margin-bottom: 16px;">
<uni-easyinput v-model="params.name" placeholder="请输入用户名"></uni-easyinput>
</view>
<button type="primary" @click="register">确定</button>
</view>
</view>
</uni-popup>
</view>
</template>
<script>
export default {
data() {
return {
config: {
//rgb摄像头旋转角度,可传入0、90、180、270四个选项
rgbVideoDirection: 90,
//rbg人脸检测角度 默认为0。可传入0、90、180、270四个选项。
rgbDetectDirection: 270,
// rbg人脸检测 0:RGB无镜像,1:有镜像
mirrorDetectRGB: 0,
//是否显示圆形识别区
// isFaceRoundView: false,
//自定义识别区域外颜色
// outAreaBgColor: "#f2f2f2"
},
params: {
id: "1234",
name: "leven"
}
}
},
methods: {
//显示消息
showMessage(message) {
uni.showToast({
title: message,
icon: "none"
})
},
register() {
this.$refs.refPop.close()
this.$refs.refLevenRegister.register(this.params);
},
openRegister() {
this.$refs.refPop.open()
},
onEvent(e) {
console.log("onEvent:" + JSON.stringify(e.detail))
},
onError(e) {
console.log("onError:" + JSON.stringify(e.detail))
},
onEventMethod(e) {
console.log("onEventMethod:" + JSON.stringify(e.detail))
let detail = e.detail;
let type = detail.type;
if (type == "register") {
//注册
let data = detail.data;
if (data.code != 0) {
this.showMessage(data.message)
} else {
let resultData = data.data;
if (resultData.type == "success") {
this.showMessage("注册成功")
}
}
}
}
}
}
</script>
<style>
</style>vue
<template>
<view style="flex: 1;">
<leven-uts-baiduFace-CameraRegister ref="refLevenRegister" style="flex:1;" :configX="config" @onEvent="onEvent"
@onError="onError" @onEventMethod="onEventMethod"></leven-uts-baiduFace-CameraRegister>
</view>
<view style="position: fixed; right: 16px; bottom: 16px;">
<button type="primary" size="mini" @click="openRegister">开始注册</button>
</view>
<!-- 注册弹窗 -->
<rice-popup v-model:show="popShow" position="center" radius="8px" :closeable="false">
<view style="width: 600rpx; height: 250px;">
<view
style="height: 50px; border-bottom: 1px solid #f2f2f2; flex-direction: row; justify-content: center; align-items: center;">
<text>注册人脸</text>
</view>
<view style=" padding: 16px;">
<view style="margin-bottom: 16px;">
<rice-input v-model="params.id" placeholder="请输入用户id"></rice-input>
</view>
<view style="margin-bottom: 16px;">
<rice-input v-model="params.name" placeholder="请输入用户名"></rice-input>
</view>
<button type="primary" @click="register">确定</button>
</view>
</view>
</rice-popup>
</template>
<script lang="uts" setup>
import JSONObject from 'com.alibaba.fastjson.JSONObject'
//组件引用
const refLevenRegister = ref<LevenUtsBaiduFaceCameraRegisterElement | null>(null)
//弹窗显示状态
const popShow = ref(false)
//初始化配置
const config = ref({
//rgb摄像头旋转角度,可传入0、90、180、270四个选项
rgbVideoDirection: 90,
//rbg人脸检测角度 默认为0。可传入0、90、180、270四个选项。
rgbDetectDirection: 270,
// rbg人脸检测 0:RGB无镜像,1:有镜像
mirrorDetectRGB: 0,
//是否显示圆形识别区
// isFaceRoundView: false,
//自定义识别区域外颜色
// outAreaBgColor: "#f2f2f2"
})
//注册参数
type RegisterParams = {
id : string,
name : string
}
const params = ref<RegisterParams>({
id: "1234",
name: "leven"
})
//显示消息
function showMessage(message : string) {
uni.showToast({
title: message,
icon: "none"
})
}
function openRegister() {
popShow.value = true
}
function register() {
popShow.value = false
let registerParams : JSONObject = JSONObject.parse(JSON.stringify(params.value)) as JSONObject
refLevenRegister.value?.register(registerParams)
}
function onEventMethod(e : JSONObject) {
console.log("onEventMethod:" + JSON.stringify(e))
let type : string = e.getString("type");
let data : JSONObject = e.getJSONObject("data");
if (type == "register") {
let code = data.getInteger("code");
let message : string = data.getString("message");
if (code != 0) {
showMessage(message)
} else {
let resultData : JSONObject = data.getJSONObject("data");
let resultType = resultData.getString("type");
if (resultType == "success") {
showMessage("注册成功")
}
}
}
}
function onError(e : JSONObject) {
console.log("onError:" + JSON.stringify(e))
}
function onEvent(e : JSONObject) {
console.log("onEvent:" + JSON.stringify(e))
}
</script>
<style>
</style>识别组件
在使用插件的地方引入以下代码:
vue
<leven-uts-baiduFace-Recognition style="position: fixed; left: 0; right: 0; bottom: 0; top: 0;"
ref="refLevenRegister" :config="config" @onEvent="onEvent" @onError="onError"
@onEventMethod="onEventMethod"></leven-uts-baiduFace-Recognition>vue
<leven-uts-baiduFace-Recognition style="position: fixed; left: 0; right: 0; bottom: 0; top: 0;"
ref="refLevenRegister" :configX="config" @onEvent="onEvent" @onError="onError"
@onEventMethod="onEventMethod"></leven-uts-baiduFace-Recognition>
//组件的引用
const refLevenRegister = ref<LevenUtsBaiduFaceRecognitionElement | null>(null)页面示例
vue
<template>
<view>
<leven-uts-baiduFace-Recognition style="position: fixed; left: 0; right: 0; bottom: 0; top: 0;"
ref="refLevenRegister" :config="config" @onEvent="onEvent" @onError="onError"
@onEventMethod="onEventMethod"></leven-uts-baiduFace-Recognition>
</view>
</template>
<script>
export default {
data() {
return {
config: {
//rgb摄像头旋转角度,可传入0、90、180、270四个选项
rgbVideoDirection: 90,
//rbg人脸检测角度 默认为0。可传入0、90、180、270四个选项。
rgbDetectDirection: 270,
//是否显示圆形识别区
isFaceRoundView: false,
// rbg人脸检测镜像 0:RGB无镜像,1:有镜像
mirrorDetectRGB: 1
}
}
},
methods: {
//显示消息
showMessage(message) {
uni.showToast({
title: message,
icon: "none"
})
},
onEvent(e) {
// console.log("onEvent:" + JSON.stringify(e.detail))
let detail = e.detail || {};
let type = detail.type || "";
let data = detail.data || {};
if (type == "onRecognitionProcess") {
//识别过程
let resultData = data.data || {};
let resuleMessage = resultData.message;
let resuleCode = resultData.code;
if (resuleCode != 0) {
this.showMessage(resuleMessage)
}
} else if (type == "onFaceResult") {
//识别结果
let resultData = data.data || {};
let resuleType = resultData.type;
// let resuleMessage = resultData.message;
// let resuleCode = resultData.code;
if (resuleType == "onResultSuccess") {
//识别成功
let successData = resultData.data || {};
let userName = successData.userName;
this.showMessage("欢迎您:" + userName)
} else {
//识别失败
this.showMessage("识别失败")
}
}
},
onError(e) {
console.log("onError:" + JSON.stringify(e.detail))
},
onEventMethod(e) {
console.log("onEventMethod:" + JSON.stringify(e.detail))
}
}
}
</script>
<style>
</style>vue
<template>
<!-- #ifdef APP -->
<scroll-view style="flex:1">
<!-- #endif -->
<leven-uts-baiduFace-Recognition style="position: fixed; left: 0; right: 0; bottom: 0; top: 0;"
ref="refLevenRegister" :configX="config" @onEvent="onEvent" @onError="onError"
@onEventMethod="onEventMethod"></leven-uts-baiduFace-Recognition>
<!-- #ifdef APP -->
</scroll-view>
<!-- #endif -->
</template>
<script lang="uts" setup>
import JSONObject from 'com.alibaba.fastjson.JSONObject'
//初始化配置
const config = ref({
//rgb摄像头旋转角度,可传入0、90、180、270四个选项
rgbVideoDirection: 90,
//rbg人脸检测角度 默认为0。可传入0、90、180、270四个选项。
rgbDetectDirection: 270,
// rbg人脸检测 0:RGB无镜像,1:有镜像
mirrorDetectRGB: 1,
//是否显示圆形识别区
isFaceRoundView: false
})
//显示消息
function showMessage(message : string) {
uni.showToast({
title: message,
icon: "none"
})
}
function onEventMethod(e : JSONObject) {
console.log("onEventMethod:" + JSON.stringify(e))
}
function onError(e : JSONObject) {
console.log("onError:" + JSON.stringify(e))
}
function onEvent(e : JSONObject) {
// console.log("onEvent:" + JSON.stringify(e))
let type : string = e.getString("type");
let data : JSONObject = e.getJSONObject("data");
if (type == "onRecognitionProcess") {
//识别过程
let resultData = data.getJSONObject("data")!;
let resuleMessage = resultData.getString("message")!;
let resuleCode = resultData.getInteger("code")!;
if (resuleCode != 0) {
showMessage(resuleMessage)
}
} else if (type == "onFaceResult") {
//识别结果
let resultData = data.getJSONObject("data")!;
let resuleType = resultData.getString("type")!;
if (resuleType == "onResultSuccess") {
//识别成功
let successData = resultData.getJSONObject("data")!;
let userName = successData.getString("userName");
showMessage("欢迎您:" + userName)
} else {
//识别失败
showMessage("识别失败")
}
}
}
</script>
<style>
</style>演示界面

在线激活

离线激活

批量激活

演示程序首页

相机人脸注册

人脸管理

批量注册

单个注册

全屏识别

圆形识别

自定义圆角

人证核检

人脸属性

批量注册进度

删除人脸
