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 相关文章推荐
JavaScript Cookie的读取和写入函数
Dec 08 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
Jun 28 Javascript
IE下JS读取xml文件示例代码
Aug 05 Javascript
js 采用delete实现继承示例代码
May 20 Javascript
JavaScript变量声明详解
Nov 27 Javascript
JavaScript第一篇之实现按钮全选、功能
Aug 21 Javascript
Sequelize中用group by进行分组聚合查询
Dec 12 Javascript
laydate.js日期时间选择插件
Jan 04 Javascript
JS 实现分页打印功能
May 16 Javascript
新版小程序登录授权的方法
Dec 12 Javascript
浅析Vue中拆分视图层代码的5点建议
Aug 15 Javascript
vue3.0中使用postcss-pxtorem的具体方法
Nov 20 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
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
php实现购物车功能(上)
2020/07/23 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
js 创建书签小工具之理论
2011/02/25 Javascript
jQuery JSON的解析方式分享
2011/04/05 Javascript
JavaScript中判断整数的多种方法总结
2014/11/08 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
班级聚会策划书
2014/01/16 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
反邪教标语
2014/06/23 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
助学贷款贫困证明
2014/09/23 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
高温慰问简报
2015/07/21 职场文书
化工生产实习心得体会
2016/01/22 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis