@zxing/library插件在H5页面上调用摄像头进行扫码识别解决方法,以及对华为手机的兼容

您所在的位置:网站首页 如何禁用手机摄像头但是保留扫码功能 @zxing/library插件在H5页面上调用摄像头进行扫码识别解决方法,以及对华为手机的兼容

@zxing/library插件在H5页面上调用摄像头进行扫码识别解决方法,以及对华为手机的兼容

2024-07-11 01:20:22| 来源: 网络整理| 查看: 265

@zxing/library调用摄像头

这是第一次写博客,不太熟悉,如果我的方法有些问题,请多指正,谢谢!!

关于@zxing/library 导入@zxing/library npm i @zxing/library --save or yarn add @zxing/library

@zxing/library是一个开源的多格式1D/2D条形码图像处理库,用Java实现,带有其他语言的端口。可以用来对二维码和一维码进行扫描识别(我只做了二维码,没有尝试一维码的,大家可以多试一试)

这个库具有一定的局限性,在装有 iOS < 14.3 相机访问仅适用于本机 Safari,而不适用于其他浏览器 (Chrome,…) 或使用 UIWebView 或 WKWebView 的应用。这不是这个库的限制,而是苹果有限的WebRTC支持的限制,但是iOS 14.3(2020年12月发布)现在也支持第三方浏览器中的WebRTC。

浏览器层使用的是MediaDevices Web API,这是旧版浏览器不支持的。 您可以使用WebRTC适配器等外部polyfill来增加浏览器兼容性。

另外,请注意,该库使用的是TypedArray等,这在较旧的浏览器(例如Android 4默认浏览器)中不可用。Int32ArrayUint8ClampedArray 您可以使用 core-js 添加对这些浏览器的支持。

这是开发者说的,对于兼容方面我也不是很懂,如果有大佬会的可以指出来。

代码部分

注意,本代码只能在https环境下测试,请不要在本地环境测试,因此会重复性的打包上线,模拟的https环境我没试过,如果有人尝试可以的话,可以进行补充

template部分

css部分

.video { width: 100vw; height: 100vh; z-index: 1; } .video-show { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 70vw; height: 70vw; z-index: 2; background: linear-gradient(to left, #fff, #fff) left top no-repeat, linear-gradient(to bottom, #fff, #fff) left top no-repeat, linear-gradient(to left, #fff, #fff) right top no-repeat, linear-gradient(to bottom, #fff, #fff) right top no-repeat, linear-gradient(to left, #fff, #fff) left bottom no-repeat, linear-gradient(to bottom, #fff, #fff) left bottom no-repeat, linear-gradient(to left, #fff, #fff) right bottom no-repeat, linear-gradient(to left, #fff, #fff) right bottom no-repeat; background-size: 2px 20px, 20px 2px, 2px 20px, 20px 2px; } .tip { width: 10vw; height: 10vw; background-color: rgb(45, 236, 45); border: 1px solid #ffffff; border-radius: 50%; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 10; } .bgc-f4f4f4 { background-color: #363636; } .page { position: relative; overflow-y: auto; position: relative; height: 100vh; } .change { z-index: 100; position: fixed; bottom: 40px; left: 50%; transform: translateX(-50%); color: #fff; text-align: center; background-color: #fff; width: 50px; height: 50px; border-radius: 50%; line-height: 60px; /* align-content: center; */ } .el-icon-refresh { color: #000; font-size: 25px; }

出来的样式效果长这样 就长这样 将就着看吧,别嫌弃样式丑,自个调整一下

接下来就是最重要的js部分了 // 看到这个没,这个是一个小插件,能在手机上打开控制台,你打印的控制台信息和报错都能在这显示,具体方法自己百度 // import Vconsole from "vconsole"; import { BrowserMultiFormatReader } from "@zxing/library"; export default { name: "QrCodeSearch", components: {}, data() { return { loadingShow: false, // 这个就是从@zxing/library导出来的方法,new一个实例 codeReader: new BrowserMultiFormatReader(), // 这个,用来储存扫码得到的结果 textContent: null, // 这个,就是当前调用的摄像头的索引,为什么是6,我会在后面说的 num: 6, // 这个就是扫描到的摄像头的数量 videoLength: "" }; }, created() { // const vconsole = new Vconsole(); // vconsole; // 让我们调用这个方法尝试打开摄像头 this.openScan(); }, methods: { // 开打开打 async openScan() { const that = this; // 这个就是data里的哪个new出来的玩意,调用里面的方法 that.codeReader .getVideoInputDevices() .then(videoInputDevices => { // 记录一下扫描到的摄像头数量,这个videoInputDevices是个数组,里面有扫描到的摄像头数据 this.videoLength = videoInputDevices.length; // 这步我们来决定一下调用第几个摄像头,看到这个num没,这就是data里的 const firstDeviceId = videoInputDevices[that.num].deviceId; // 这调用另一个方法 that.decodeFromInputVideoFunc( firstDeviceId, videoInputDevices.length ); }) // 失败回调,为什么这里的失败回调这么写,后面会说的 .catch(err => { this.num = 1; that.openScan(); console.error(err); }); }, //这就是在openScan里调的另一个方法,传入想调用的摄像头id和摄像头数量 decodeFromInputVideoFunc(firstDeviceId, length) { const that = this; that.codeReader.reset(); // 重置 that.textContent = null; // 重置 // 看不懂不重要,打印出来自己琢磨琢磨 that.codeReader.decodeFromInputVideoDeviceContinuously( firstDeviceId, "video", (result, err) => { that.textContent = null; // 扫描成功 这个result就是扫描结果,长啥样自己打印出来看看 if (result) { that.textContent = result; // 这里写你要对扫描结果做什么,我这里扫描出来的是个网址,写的页面跳转 if (that.textContent) { setTimeout(() => { window.location.href = that.textContent; // 记得重置,不然在微信里用会有问题 that.textContent = null; that.codeReader && that.codeReader.reset(); }, 100); } } // 扫描失败,我这里是直接找下一个摄像头,其实可以不写 if (err && !err) { this.num++; setTimeout(() => { that.tipShow = false; }, 2000); if (this.num const that = this; if (this.videoLength > 2) { if (this.num this.num = 1; } that.textContent = null; that.codeReader && that.codeReader.reset(); that.openScan(); } else { if (that.num === 0) { that.num = 1; } else { that.num = 0; } that.textContent = null; that.codeReader && that.codeReader.reset(); that.openScan(); } } } }; 对华为手机的兼容

我头一次见对华为手机兼容的,不愧是你,华为

为什么会有这个问题,其实把摄像头列表打印出来看看就知道了,别的安卓手机都只能扫描出来两个摄像头,索引为0的是前置摄像头,索引为1的是后置摄像头,只需要调整这个索引,也就是调整上面js代码里的num就可以达到前后摄像头切换的功能

但是!!!!

华为手机,或者说鸿蒙系统,能扫描出来TMD八个摄像头,前三个都是前置摄像头,后面的是后置摄像头

那么!!为什么我选择第六个摄像头呢,因为第六个摄像头最清楚,毕竟我这就只有一个测试机,不知道别的手机啥样,多试试吧。

好了,其他的就没啥的,反正这个页面我在微信里和浏览器里都能使用,上面的代码直接抄下来就能用,有什么别的我遗漏的,欢迎补充,如果觉得有帮助,请点个赞,十分感谢。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭