一、开发前的准备

实现二维码或条形码的扫描识别比较普遍的做法是去调用微信 JS-SDK 的扫一扫功能(详见 概述 | 微信开放文档),或者支付宝 H5 开放的API(详见?支付宝H5开放文档)。

但是这两者都会比较麻烦且有一定的局限性,微信的扫一扫只能在微信里用,而且还需要公众号认证等配置操作。支付宝在内置 App 内可以同时识别二维码和条形码,但外部调用的 API 无法一次性同时识别,只能分开识别。

我这里就提供一个直接使用的开源库:https://github.com/zxing-js/library,本人移动端前端开发的框架是 Vue,组件库用的是 Vant,本文方案只要开发时用的电脑具有摄像头就可以实现效果预览。

二、实现效果图

这里分享两个在线工具

1、免费在线条形码生成器-条码生成制作工具

2、草料二维码生成器

可以看到这样操作不用经过任何打包(有的需要打包成 app 才行)、部署(有的需要部署到 https 的服务器才行)、配置(前面说的诸如微信开发的配置等…)。

三、具体操作实现

1、安装。

npm install @zxing/library --save

2、假设场景:页面上有个按钮,点击触发扫码功能**@click=‘scanCode()’**,在 methods 写入该方法。

scanCode() {console.log('浏览器信息', navigator.userAgent);this.$router.push({path: '/scanCodePage'});
}

同时在 vue-router 写入对应页面的路由。

{ title: '扫码页面', name: 'scanCodePage', path: '/scanCodePage', component: () => import('@/views/scanCodePage.vue')
}

3、扫码页面代码,通过与 video 标签结合使用,把以下代码直接全部拷贝到新建的一个 scanCodePage.vue 文件里使用,读者在注释的地方自行根据需求,编写后续的业务代码即可。

<template><div class="page-scan"><!--返回--><van-nav-bar title="扫描二维码/条形码" fixed@click-left="clickIndexLeft()"class="scan-index-bar"><template #left><van-icon name="arrow-left" size="18" color="#fff"/><span style="color: #fff"> 取消 </span></template></van-nav-bar><!-- 扫码区域 --><video ref="video" id="video" class="scan-video" autoplay></video><!-- 提示语 --><div v-show="tipShow" class="scan-tip"> {{tipMsg}} </div></div>
</template><script>
import { BrowserMultiFormatReader } from '@zxing/library';
import { Dialog, Notify } from 'vant';export default {name: 'scanCodePage',data() {return {loadingShow: false,codeReader: null,scanText: '',vin: null,tipMsg: '正在尝试识别....',tipShow: false}},created() {this.codeReader = new BrowserMultiFormatReader();this.openScan();},destroyed(){this.codeReader.reset();},watch: {'$route'(to, from) {if(to.path == '/scanCodePage'){this.codeReader = new BrowserMultiFormatReader();this.openScanTwo();}}},methods: {async openScan() {this.codeReader.getVideoInputDevices().then((videoInputDevices) => {this.tipShow = true;this.tipMsg = '正在调用摄像头...';console.log('videoInputDevices', videoInputDevices);// 默认获取第一个摄像头设备idlet firstDeviceId = videoInputDevices[0].deviceId;// 获取第一个摄像头设备的名称const videoInputDeviceslablestr = JSON.stringify(videoInputDevices[0].label);if (videoInputDevices.length > 1) {// 判断是否后置摄像头if (videoInputDeviceslablestr.indexOf('back') > -1) {firstDeviceId = videoInputDevices[0].deviceId;} else {firstDeviceId = videoInputDevices[1].deviceId;}}this.decodeFromInputVideoFunc(firstDeviceId);}).catch(err => {this.tipShow = false;console.error(err);});},async openScanTwo() {this.codeReader = await new BrowserMultiFormatReader();this.codeReader.getVideoInputDevices().then((videoInputDevices) => {this.tipShow = true;this.tipMsg = '正在调用摄像头...';console.log('videoInputDevices', videoInputDevices);// 默认获取第一个摄像头设备idlet firstDeviceId = videoInputDevices[0].deviceId;// 获取第一个摄像头设备的名称const videoInputDeviceslablestr = JSON.stringify(videoInputDevices[0].label);if (videoInputDevices.length > 1) {// 判断是否后置摄像头if (videoInputDeviceslablestr.indexOf('back') > -1) {firstDeviceId = videoInputDevices[0].deviceId;} else {firstDeviceId = videoInputDevices[1].deviceId;}}this.decodeFromInputVideoFunc(firstDeviceId);}).catch(err => {this.tipShow = false;console.error(err);});},decodeFromInputVideoFunc(firstDeviceId) {this.codeReader.reset(); // 重置this.scanText = '';this.codeReader.decodeFromInputVideoDeviceContinuously(firstDeviceId, 'video', (result, err) => {this.tipMsg = '正在尝试识别...';this.scanText = '';if (result) {console.log('扫描结果', result);this.scanText = result.text;if (this.scanText) {this.tipShow = false;// 这部分接下去的代码根据需要,读者自行编写了// this.$store.commit('app/SET_SCANTEXT', result.text);// console.log('已扫描的小票列表', this.$store.getters.scanTextArr);}}if (err && !(err)) {this.tipMsg = '识别失败';setTimeout(() => {this.tipShow = false;}, 2000)console.error(err);}});},clickIndexLeft(){  // 返回上一页this.codeReader = null;this.$destroy();this.$router.back();}}}
</script><style lang="scss">
.scan-index-bar{background-image: linear-gradient( -45deg, #42a5ff ,#59cfff);
}
.van-nav-bar__title{color: #fff !important;
}
.scan-video{height: 80vh;
}
.scan-tip{width: 100vw;text-align: center;margin-bottom: 10vh;color: white;font-size: 5vw;
}
.page-scan{overflow-y: hidden;background-color: #363636;
}
</style>

这是我本人在工作学习中做的一些总结,同时也分享出来给需要的小伙伴哈 ~ 供参考学习,有什么建议也欢迎评论留言,转载请注明出处哈,感谢支持!

Vue 移动端实现调用相机扫描二维码或条形码相关推荐

  1. Vue 实现调用相机扫描二维码或条形码

    扫条形码: 扫二维码: zxing 下载: npm install @zxing/library --save 扫码组件内容: <template><div><video ...

  2. PC端调用摄像头扫描二维码,拿到二维码信息

    PC端调用摄像头扫描二维码,拿到二维码信息 <template><el-dialogtitle="扫描设备二维码":visible.sync="dial ...

  3. 基于ZXing Android实现生成二维码图片和相机扫描二维码图片即时解码的功能

    NextQRCode ZXing开源库的精简版 **基于ZXing Android实现生成二维码图片和相机扫描二维码图片即时解码的功能 原文博客 附源码下载地址** 与原ZXingMini项目对比 N ...

  4. C#生成二维码、调用摄像头扫描二维码

    二维码的生成和解码,有两个开源项目可以参考: 一个是google的zxing,另外一个是ThroughWork. zxing做的很全面,支持各种语言和平台,具体不多讲,自己查去.ThroughWork ...

  5. 使用c#捕获usb扫描枪扫描二维码、条形码结果

    关于扫描枪对包含中文的二维码扫描的处理,请参考使用c#捕获usb扫描枪扫描二维码.条形码结果(支持中文版),本文之后的评论不再回复关于中文扫码的问题 另外,请仔细阅读本文,因为中文支持博文仅修改了本文 ...

  6. 使用c#捕获usb扫描枪扫描二维码、条形码结果(支持中文版)

    之前在18年写过一个使用c#捕获usb扫描枪扫描二维码.条形码结果,当时我是没有遇到需要使用中文的情况,因为二维码都是我自己控制生成的,如果遇到中文,我会提前进行编码编程unicode编码,所以,没有 ...

  7. vue实现调用摄像头扫描二维码

    安装依赖:vue-qrcode-reader npm install vue-qrcode-reader -s 直接上代码 <template><div><div cla ...

  8. 关于Unity调用摄像头扫描二维码与生成二维码的实现方法

    1.常用的生成二维码网址 https://cli.im/ 2.上官网下载二维码插件 http://zxingnet.codeplex.com/ 3.将下载的插件中zxing.unity.dll文件放入 ...

  9. h5端呼起摄像头扫描二维码并解析

    2016年6月29日补充: 最近做了一些与表单相关的项目,使用了h5的input控件,在使用过程中遇到了很多的坑.也包括与这篇文章相关的. 首先我们应该知道使用h5新提供的属性getUserMedia ...

最新文章

  1. 你想过 Controller 这些方法里的参数是如何工作的吗?
  2. Win10启动盘制作工具
  3. 时光机穿梭---撤销修改
  4. 质数和分解(动态规划)
  5. 串口通信的基本原理----STM32
  6. C语言 字符串转结构体,字符串指针转化为结构体指针!
  7. win10系统更新在哪_五步教你win10永久关闭系统自动更新
  8. Android Studio 3.4升级后的运行问题解决办法
  9. 小米Android系统限制联网,Android 7 以上版本,绕过CA限制,抓取https
  10. CCF NOI1047 寻找鞍点
  11. 【Codeforces 467C】George and Job
  12. iOS关于通知传值Bool类型的注意点
  13. TC Games无需安卓模拟器电脑玩绝地求生手游,按键设置详细教程
  14. Gaussian 安装
  15. 两矩阵相乘的秩的性质_矩阵分析与应用(一,矩阵基础知识)
  16. unity游戏框架学习-资源管理
  17. Hibernate的配置文件配置
  18. Android 混淆规则
  19. matlab数据处理的优缺点,数字滤波的优缺点分析
  20. olivettifaces人脸识别之思考

热门文章

  1. 关系型数据库设计原则
  2. android https握手失败,Android SSL错误握手失败
  3. A股-入门-新手该如何成功选股
  4. 最常被遗忘的 Web 性能优化:浏览器缓存
  5. Initialization of variable was never used; consider replacing with assignment to ‘_’ or removing it
  6. 初学者制作自己的网站详细流程(可以上传自己做的网页)
  7. 华为有线无线组网案例
  8. Prometheus集成telegram报警
  9. WebSocket实现在线人数统计
  10. cad延伸快捷键_史上最全CAD快捷键大全,熟练掌握画图快得飞起来(强烈建议收藏)...