JS调用安卓手机摄像头扫描二维码


Posted in Javascript onOctober 16, 2018

项目要求:

使用H5模仿微信扫一扫付款功能

经过一系列的查找最后发现可以使用 JS调用手机摄像头然后用画布把当前摄像头的数据转成Base64的png图片,经过QrCode直接再本地识别。

优点:

兼容大多数浏览器

本地识别不占用服务端资源

代码比较简单只有一个页面

<html lang="ZH-CN">
<head>
 <meta charset="utf-8">
 <title>Web QrCode Test</title>
<script type="text/javascript" src="jquery-1.8.3.min.js"></script>
 
<script type="text/javascript" src="jsqrcode/src/grid.js"></script>
<script type="text/javascript" src="jsqrcode/src/version.js"></script>
<script type="text/javascript" src="jsqrcode/src/detector.js"></script>
<script type="text/javascript" src="jsqrcode/src/formatinf.js"></script>
<script type="text/javascript" src="jsqrcode/src/errorlevel.js"></script>
<script type="text/javascript" src="jsqrcode/src/bitmat.js"></script>
<script type="text/javascript" src="jsqrcode/src/datablock.js"></script>
<script type="text/javascript" src="jsqrcode/src/bmparser.js"></script>
<script type="text/javascript" src="jsqrcode/src/datamask.js"></script>
<script type="text/javascript" src="jsqrcode/src/rsdecoder.js"></script>
<script type="text/javascript" src="jsqrcode/src/gf256poly.js"></script>
<script type="text/javascript" src="jsqrcode/src/gf256.js"></script>
<script type="text/javascript" src="jsqrcode/src/decoder.js"></script>
<script type="text/javascript" src="jsqrcode/src/qrcode.js"></script>
<script type="text/javascript" src="jsqrcode/src/findpat.js"></script>
<script type="text/javascript" src="jsqrcode/src/alignpat.js"></script>
<script type="text/javascript" src="jsqrcode/src/databr.js"></script>
</head>
<body>
 <div class="booth">
 <video id="video" width="400" height="400"></video>
 <canvas id='canvas' width='400' height='400'></canvas>
 <img id='img' src=''>
 </div>
 
 <div id="mmm"></div>
 
 <canvas id="qr-canvas" width="640" height="480"></canvas>
<script>
 
 
 //初始化媒体对象
 var c=0;
 var video = document.getElementById('video'),
  canvas = document.getElementById('canvas'),
  img = document.getElementById('img'),
  vendorUrl = window.URL || window.webkitURL;
  
 //媒体对象
 navigator.getMedia = navigator.getUserMedia ||
       navagator.webkitGetUserMedia ||
       navigator.mozGetUserMedia ||
       navigator.msGetUserMedia;
 navigator.getMedia({
  video: true, //使用摄像头对象
  audio: false //不适用音频
 }, function(strem){
  console.log(strem);
  video.src = vendorUrl.createObjectURL(strem);
  video.play();
 }, function(error) {
  //error.code
  console.log(error);
 });
 
 //启动定时器
 setTimeout("actionP(null)","1000");
 
 //定时器
 function actionP(data){
  if(data==null){
  Screenshot()
   
  }else{
  if(data!=null & data!="error decoding QR Code"){//识别出数据
   if(data.indexOf("http")!=-1){
   window.location.href=data;
   }else alert(data);
   
   }else{//没有数据循环十次
    c++;
    if(c<10){
     setTimeout("actionP(null)","1000");
    }
    
   }
  }
  
 }
 
 
 function Screenshot(){//截取图像
 canvas.getContext('2d').drawImage(video, 0, 0, 400, 400);
 var imgData = canvas.toDataURL("image/png");
 load(imgData);
 img.src=imgData;
  
 }
 ////////////////////////////////////////识别二维码////////////////////////////////////////////
 
 function dragenter(e) {
 e.stopPropagation();
 e.preventDefault();
 }
 
 function dragover(e) {
 e.stopPropagation();
 e.preventDefault();
 }
 function drop(e) {
 e.stopPropagation();
 e.preventDefault();
 
 var dt = e.dataTransfer;
 var files = dt.files;
 
 
 }
 
 
 function load(name)
 {
 initCanvas(640,480);
 //识别二维码并回调方法
 qrcode.callback = actionP;
 qrcode.decode(name);
 }
 
 function initCanvas(ww,hh)//创建画板
 {
 gCanvas = document.getElementById("qr-canvas");
 gCanvas.addEventListener("dragenter", dragenter, false); 
 gCanvas.addEventListener("dragover", dragover, false); 
 gCanvas.addEventListener("drop", drop, false);
 var w = ww;
 var h = hh;
 gCanvas.style.width = w + "px";
 gCanvas.style.height = h + "px";
 gCanvas.width = w;
 gCanvas.height = h;
 gCtx = gCanvas.getContext("2d");
 gCtx.clearRect(0, 0, w, h);
 imageData = gCtx.getImageData( 0,0,320,240);
 }
 
 
 </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery实现可拖动DIV自定义保存到数据的实例
Nov 20 Javascript
js实现网页抽奖实例
Aug 05 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
Nov 04 Javascript
浅谈JavaScript 中有关时间对象的方法
Aug 15 Javascript
利用React-router+Webpack快速构建react程序
Oct 27 Javascript
jquery获取下拉框中的循环值
Feb 08 Javascript
JavaScript数组迭代方法
Mar 03 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
Sep 01 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
Sep 03 jQuery
vue 自动化路由实现代码
Sep 03 Javascript
jQuery实现聊天对话框
Feb 08 jQuery
如何手写一个简易的 Vuex
Oct 10 Javascript
QRCode.js二维码生成并能长按识别
Oct 16 #Javascript
移动端图片上传旋转、压缩问题的方法
Oct 16 #Javascript
JavaScript实现表单注册、表单验证、运算符功能
Oct 15 #Javascript
从零开始搭建vue移动端项目到上线的步骤
Oct 15 #Javascript
jQuery轻量级表单模型验证插件
Oct 15 #jQuery
详解ESLint在Vue中的使用小结
Oct 15 #Javascript
手淘flexible.js框架使用和源代码讲解小结
Oct 15 #Javascript
You might like
单位速度在实战中的运用
2020/03/04 星际争霸
层叠菜单的动态生成
2006/10/09 PHP
三种php连接access数据库方法
2013/11/11 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
Track Image Loading效果代码分析
2007/08/13 Javascript
treepanel动态加载数据实现代码
2012/12/15 Javascript
js脚本分页代码分享(7种样式)
2015/08/19 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
JS一次前端面试经历记录
2020/03/19 Javascript
python 判断自定义对象类型
2009/03/21 Python
python中Genarator函数用法分析
2015/04/08 Python
python读取并写入mat文件的方法
2019/07/12 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
2019/11/05 Python
NumPy排序的实现
2020/01/21 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
有趣的广告词
2014/03/18 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
电话营销开场白
2015/05/29 职场文书
公司员工违法违章行为检讨书
2019/06/24 职场文书
导游词之西安骊山
2019/12/20 职场文书
SQL Server实现分页方法介绍
2022/03/16 SQL Server
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL