uniapp安卓App自定义相机(身份证相机)

article/2025/6/25 19:20:30
效果图:

实现思路:

本人也是第一次做app的自定义相机功能,找了相关文章后,发现uniapp自带的相机组件是不能实现在app中自定义相机的功能,因为不支持。按照前辈们的思路,是使用uniapp中的live-pusher直播组件,使用uni.createLivePusherContext()这个api去实现自定义相机的功能。使用api的预览:startPreview() 方法,实现自定义相机的预览功能。使用api的快照功能:snapshot(),实现相机拍摄照片的功能。这样子基本功能就实现了,接下来就是实操阶段了,直接上代码:

<template><uv-navbar :title="title" @leftClick="leftClick" :titleStyle="{fontSize:'18px',fontWeight:'600'}" :placeholder="true"></uv-navbar><view class="live-camera" :style="{ width: windowWidth, height: windowHeight }"><view class="preview" :style="{ width: windowWidth, height: windowHeight -95 }"><live-pusherid="livePusher"ref="livePusher"class="livePusher"mode="FHD"beauty="0"whiteness="0":aspect="aspect"min-bitrate="1000"audio-quality="16KHz"device-position="back":auto-focus="true":muted="true":enable-camera="true":enable-mic="false":zoom="false"@statechange="statechange":style="{ width: '560rpx', height: '890rpx' }"></live-pusher><!--提示语-->
<!-- 			<cover-view class="remind"><text class="remind-text" style="">{{ message }}</text></cover-view> --><!--辅助线--><cover-view class="outline-box" :style="{ width: windowWidth, height: windowHeight - 118}"><cover-imageclass="outline-img":src="coverImage"style=""></cover-image></cover-view><!-- <cover-view class="outline-box" :style="{ width: windowWidth, height: windowHeight - 80 }"><cover-imageclass="bg-img"src="/static/xiangji.png"style=""></cover-image></cover-view> --></view><view class="menu"><!--底部菜单区域背景--><cover-image class="menu-mask" src=""></cover-image><!--返回键--><text class="menu-back" @tap="back" v-if="quxiao">取消</text><!--快门键--><cover-image class="menu-snapshot" @tap="snapshot" :src="xjkm"></cover-image><!--反转键--><!-- <cover-image class="menu-flip" @tap="flip" src="/static/live-camera/flip.png"></cover-image> --></view></view>
</template><script>
let _this = null;
export default {data() {return {poenCarmeInterval: null, //打开相机的轮询dotype: 'face', //操作类型aspect: '2:3', //比例cameraWidth: '', //相机画面宽度cameraHeight: '', //相机画面宽度windowWidth: '', //屏幕可用宽度windowHeight: '', //屏幕可用高度camerastate: false, //相机准备好了livePusher: null, //流视频对象snapshotsrc: null, //快照xjkm:'/static/xjkm.png',quxiao:false,isPreview: false, // 添加这个状态来控制是预览还是保存savedImagePath: '',title:'',navHight:0,detail:'',coverImage:'',};},onLoad(e) {_this = this;// this.dotype = e.dotype;this.initCamera();this.detail = e.pagesNumber;if(this.detail == '1'){this.title = '身份证人像面'this.coverImage = '/static/xiangji.png'}else if(this.detail == '2'){this.title = '身份证国徽面'this.coverImage = '/static/xjgh.png'}else if(this.detail == '3'){this.title = '驾驶证主页'this.coverImage = '/static/rzmc.png'}else if(this.detail == '4'){this.title = '驾驶证副页'this.coverImage = '/static/rzmc.png'}else if(this.detail == '5'){this.title = '护照'this.coverImage = '/static/rzmc.png'}},onReady() {this.livePusher = uni.createLivePusherContext('livePusher', this);this.startPreview(); // 开启预览并设置摄像头this.poenCarme();},methods: {leftClick(){uni.navigateBack({});},//轮询打开poenCarme() {//#ifdef APP-PLUSif (plus.os.name == 'Android') {this.poenCarmeInterval = setInterval(function() {// console.log(_this.camerastate);if (!_this.camerastate) _this.startPreview();}, 2500);}//#endif},//初始化相机initCamera() {let arr = uni.getSystemInfoSync().safeAreaInsets;_this.navHight = arr.top + 44//处理安卓手机异步授权问题uni.getSystemInfo({success: function(res) {_this.windowWidth = res.windowWidth;_this.windowHeight = res.windowHeight - _this.navHight;_this.cameraWidth = res.windowWidth;_this.cameraHeight = (res.windowWidth - _this.navHight) * 1.5;}});},//开始预览startPreview() {this.livePusher.startPreview({success: a => {console.log(a);},});},//停止预览stopPreview() {this.livePusher.stopPreview({success: a => {_this.camerastate = false; //标记相机未启动}});},//状态statechange(e) {//状态改变console.log(e);if (e.detail.code == 1007) {_this.camerastate = true;} else if (e.detail.code == -1301) {_this.camerastate = false;}},//返回back() {if (this.isPreview) {this.isPreview = false;this.startPreview();this.xjkm = '/static/xjkm.png';this.quxiao = false;return;}uni.navigateBack();},//抓拍snapshot () {if (!this.isPreview) {// 第一次点击:拍照this.xjkm = '/static/xjbc.png'this.quxiao = truethis.livePusher.snapshot({success: e => {this.snapshotsrc = e.message.tempImagePath;this.livePusher.stopPreview();this.isPreview = true;}});} else {// 第二次点击 保存到手机相册uni.saveImageToPhotosAlbum({filePath: `file:/${this.snapshotsrc}`,success: (res) => {uni.showToast({title: '保存成功',icon: 'success'});setTimeout(()=>{this.submit()},1500)},fail: (err) => {console.error('保存失败:', err);}});}},//反转flip() {this.livePusher.switchCamera();},submit(){uni.$emit('getSrc',{url:`file://${this.snapshotsrc}`,index:this.detail})uni.navigateBack({delta: 1 // 返回的页面数})},}
};
</script><style lang="scss">.bg-img {width: 100vw;height: 100vh;}
.live-camera {.preview {justify-content: center;align-items: center;.outline-box {position: absolute;top: 0;left: 0;bottom: 0;z-index: 99;align-items: center;justify-content: center;.outline-img {width: 750rpx;height: 1200rpx;// background-color: #626262;}}.remind {position: absolute;top: 880rpx;width: 750rpx;z-index: 100;align-items: center;justify-content: center;.remind-text {color: #dddddd;font-weight: bold;}}}.menu {position: absolute;left: 0;bottom: 0;width: 750rpx;height: 254rpx;z-index: 98;align-items: center;justify-content: center;background-color: #141414;.menu-mask {position: absolute;left: 0;bottom: 0;width: 750rpx;height: 180rpx;z-index: 98;background-color: #141414;}.menu-back {position: absolute;left: 60rpx;top: 100rpx;z-index: 999;color: #ffffff;font-size: 16px;lines: 1;text-align: center;padding: 10rpx;}.menu-snapshot {width: 130rpx;height: 130rpx;z-index: 99;}.menu-flip {position: absolute;right: 30rpx;bottom: 50rpx;width: 80rpx;height: 80rpx;z-index: 99;align-items: center;justify-content: center;}}}
</style>
代码逻辑:

        这个页面我实现了自定义相机拍摄身份证、驾驶证和护照的功能。所以自定义了页面导航栏和自定义相机的蒙层图片。
        live-pusher组件配置说明:

  • mode="FHD" 表示全高清模式。
  • beauty="0", whiteness="0" 禁用美颜和美白。
  • aspect="aspect" 设置视频比例(动态绑定)。
  • device-position="back" 使用后置摄像头。
  • auto-focus="true" 启用自动对焦。
  • muted="true" 禁用麦克风。
  • 绑定了事件 @statechange="statechange" 监听摄像头状态变化
  • :style="{ width: '560rpx', height: '890rpx' }"设置了组件的大小,这样子就不用拍摄照片后再去截取所需要的图片再保存到手机这么麻烦。

这段代码,就是设置自定义相机的蒙层,也就是你需要让UI给你找身份证拍摄相关的图片,然后保持图片中间的框内是透明的,旁边的是不透明的就可以了,再把live-pusher组件的大小设置和中间框的大小一致就行,还有就是要开启app权限



按照上面的步骤,已经基本完成了自定义相机的功能。然后我们保存照片到手机相册后,要到对应的页面去显示这个图片,所以我使用了uniapp的$on和$emit方法,将图片地址发送过去。

在上一级页面接收到这个url地址后进行渲染。但渲染有一个问题,因为我们拍摄的图片是横屏拍摄的,所以按照之前的页面布局显示图片会变得很小,如图:


这并不是我们需要的效果,我们需要的效果应该是和下面的一样,铺满整个image标签才行,所以在回显的页面中我们要设置一下image的css:

添加这些样式后,就可以实现正常的回显效果了:

结尾:

        以上就是实现整个自定义身份证相机的功能,希望能帮助到大家!!


http://www.hkcw.cn/article/osaurejsqL.shtml

相关文章

【软件安装】非华为手机安装华为电脑管家(14.0.5.8 C233)(附带安装包下载地址)

前言 华为电脑管家是一款专为华为电脑用户设计的综合管理软件&#xff0c;提供了多种实用功能&#xff0c;旨在优化电脑性能并提升用户体验。其拥有以下特色功能&#xff1a; 互传功能&#xff1a; 快速传输&#xff1a;华为电脑管家支持与华为手机之间的快速文件传输。用户可…

明基RD280U编程显示器深度测评:码农的「第二块键盘」竟然会发光?

文章目录 前言一、开箱篇&#xff1a;当理工男遇到「俄罗斯套娃式包装」二、外观篇&#xff1a;深空灰的「代码容器」1. 桌面变形记2. 保护肩颈的人体工学设计 三、显示篇&#xff1a;给代码做「光子嫩肤」1. 28寸超大大屏 3:2屏比 4K超清2.专业编程模式&#xff0c;让代码一…

一次电脑感染Synaptics Pointing Device Driver病毒的经历,分享下经验

没想到作为使用电脑多年的老司机也会电脑中病毒&#xff0c;周末玩电脑的时候突然电脑很卡&#xff0c;然后自动重启&#xff0c;奇怪&#xff0c;之前没出现这个情况。 重启后电脑开机等了几十秒&#xff0c;打开任务管理器查看开机进程&#xff0c;果然发现有个Synaptics Po…

给出一个基于 ESP32(Espressif ESP-IDF)来连接并向蓝牙耳机发送音频的方案示例。该方案的核心思路是让 ESP32 充当「A2DP Source」(与手机类似)

下面给出一个基于 ESP32&#xff08;Espressif ESP-IDF&#xff09;来连接并向蓝牙耳机发送音频的方案示例。该方案的核心思路是让 ESP32 充当「A2DP Source」&#xff08;与手机类似&#xff09;&#xff0c;而蓝牙耳机则是「A2DP Sink」。这样&#xff0c;ESP32 能够像手机一…

2025真正可行的手机安装Kali Linux方法!

很久前&#xff0c;我出了一期termux安装kali linux视频&#xff0c;有很多问题&#xff0c;这次加以记录和整理&#xff0c;总体来说&#xff0c;大多是国际网络问题和linux命令错误&#xff0c;就算实现了国际网络&#xff0c;但你的安装程序不一定通过国际网络进行&#xff…

程序员编程利器一明基RD280U显示器

目录 ​编辑 一、引言 二、开箱验货 三、丝滑极致深度体验 独特屏比&#xff0c;让代码阅读如鱼得水 超大巨幕&#xff0c;释放监控细节 专业编程模式&#xff0c;打造舒适视觉环境 强大护眼功能&#xff0c;呵护眼睛健康 丰富扩展功能&#xff0c;提升工作便捷性 智…

程序员六一八干什么?种草很久的专业编程显示器终于能入了

文章目录 引言一、 显示器热门活动1.1 明基RD系列编程显示器&#xff1a;程序员的护眼利器1.2 限时优惠来袭&#xff0c;程序员换机好时机 二、极致编程体验2.1 3:2屏幕比和超4K分辨率2.2 专业编程色彩模式2.3 护眼技术和功能2.3.1 硬件滤蓝光2.3.2 抗反射面板2.3.3 MoonHalo舒…

C盘爆满?一键清理恢复极速体验!“小番茄C盘清理”彻底解放你的电脑

目录 前言 C盘变红&#xff1f;&#xff01;那么你的电脑将会出现下面糟糕的情况&#xff1a; 一、小番茄C盘清理介绍——拯救你的C盘爆红&#xff01; 二、安装登录小番茄C盘清理 2.1 安装小番茄C盘清理 2.2 登录—拥有专属自己电脑的小番茄C盘清理 三、手把手教你深度…

联想电脑麦克风阵列问题及解决办法!!!

前两天即将面试时候进入到腾讯会议出现了这样问题&#xff1a;检测到麦克风阵列异常。如果你也遇到麦克风问题&#xff0c;可以参考我的总结&#xff1a; 时间紧急&#xff0c;我首先是怀疑自己之前跟着网上买的工具做电脑清灰打开后盖碰到了麦克风模块什么的影响到了系统检查不…

oracle goldengate实现远程抽取postgresql 到 postgresql的实时同步【绝对无坑版,亲测流程验证】

oracle goldengate实现postgresql 到 postgresql的实时同步 源端&#xff1a;postgresql1 -> postgresql2 流复制主备同步 目标端&#xff1a;postgresql 数据库版本&#xff1a;postgresql 12.14 ogg版本&#xff1a;21.3 架构图&#xff1a; 数据库安装以及流复制主备…

服务器带宽基础知识

服务器带宽基础知识详解 一、带宽的定义与基本概念 服务器带宽&#xff08;Bandwidth&#xff09;是指服务器与互联网之间在单位时间内传输数据的能力&#xff0c;通常以 Mbps&#xff08;兆比特每秒&#xff09; 或 Gbps&#xff08;吉比特每秒&#xff09; 为单位衡量。它决…

如何在本地部署小智服务器:从源码到全模块运行的详细步骤

小智聊天机器人本地后台服务器源码全模块部署 作者&#xff1a;林甲酸 -不是小女子也不是女汉子 是大女子 更新日期&#xff1a;2025年4月29日 &#x1f3af; 前言&#xff1a;为什么要写这篇教程&#xff1f; 上周按照虾哥小智服务器的教程去部署本地后台&#xff0c;我用的是…

【Linux实践系列】:进程间通信:万字详解命名管道实现通信

&#x1f525; 本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 与其等待完美的风&#xff0c;不如学会在逆风中调整帆的角度——所有伟大航程都始于此刻出发的勇气 ★★★ 本文前置知…

nginx配置反向代理服务器,实现在https网站中请求http资源

文章目录 一、前言二、Nginx反向代理的工作原理三、Nginx反向代理的主要功能‌四、Nginx反向代理的配置和使用场景五、实战配置5.1 首先&#xff0c;修改宝塔面板配置5.2 接着配置代理服务器5.3 完成上面所有配置后5.4最后还要在原来的index.html文件里添加5.5 或者可以操作服务…

鲲鹏服务器+昇腾卡(Atlas 300I pro)搭建DeepSeek-R1-Distill-Qwen-7B(自己存档详细版)

参考文章&#xff1a;https://modelers.cn/models?namedeepseek&page1&size16 https://www.hiascend.com/software/modelzoo/models/detail/11aa2a48479d4d229a9830b8e41fc011 当前服务器配置为&#xff1a;2 * 鲲鹏920 2 * Atlas 300I pro 系统&#xff1a;open Eul…

Tongweb7049M4有关SSL/TLS 服务器瞬时 Diffie-Hellman 公共密钥过弱的处理方案(by lqw)

前提条件&#xff1a;Tongweb7049M4已在http通道里配置了https&#xff08;如何配置https可以参考这个帖子&#xff1a;东方通TongWEB添加Https证书&#xff0c;开启SSL&#xff09; 遇到客户在配置了https后&#xff0c;扫描漏洞提示&#xff1a; 有关SSL/TLS 服务器瞬时 Dif…

[原因和较为完美的解决方法]远程主机可能不符合 glibc 和 libstdc++ Vs code 服务器的先决条件

省流&#xff1a;把vscode降低到1.98版本并关闭自动更新 今天打开vscode&#xff0c;突然发现连接不了本地的虚拟主机ubuntu了&#xff0c;并且报了本文标题所示的错误。 vscode的具体报错如下&#xff1a; 原因是&#xff1a;&#xff08;从别人的文章摘过来的&#xff09; 通…

金蝶K3服务器安装与配置方法详细图解手册

金蝶K3服务器安装与配置方法详细图解手册 【下载地址】金蝶K3服务器安装与配置方法详细图解手册 本开源项目提供了一份详尽的《金蝶K3服务器安装与配置方法》图文教程&#xff0c;帮助用户轻松掌握金蝶K3系统的安装与配置。教程涵盖了服务器硬件配置、K3中间件、客户端以及数据…

物理服务器紧急救援:CentOS系统密码重置全流程实战指南

前言 在企业IT运维实践中&#xff0c;物理服务器密码丢失是典型的"低概率高风险"事件。某金融科技公司曾因核心服务器密码遗失导致业务中断36小时&#xff0c;直接损失超过800万元。这起真实案例揭示了系统密码管理的关键性——当承载重要业务的物理服务器遭遇密码丢…

arm内核架构服务器本地离线安装nginx服务

一、下载nginx安装包 nginx下载地址&#xff1a;https://nginx.org/en/download.html 二、解压并编译nginx应用 &#xff08;1&#xff09;解压安装包 首先将第一步下载的安装包上传到服务器上&#xff0c;然后执行以下指令&#xff1a; sudo tar -zxvf nginx-1.26.3.tar.gz…