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 学习笔记 选择器之三
Jul 23 Javascript
去掉gridPanel表头全选框的小例子
Jul 18 Javascript
js控制页面控件隐藏显示的两种方法介绍
Oct 09 Javascript
浅析js预加载/延迟加载
Sep 25 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
Mar 13 Javascript
JavaScript观察者模式(经典)
Dec 09 Javascript
jQuery给元素添加样式的方法详解
Dec 30 Javascript
JS一个简单的注册页面实例
Sep 05 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 jQuery
详解React 在服务端渲染的实现
Nov 16 Javascript
JavaScript变量提升和严格模式实例分析
Jan 27 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
Mar 25 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
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
浅谈javascript中关于日期和时间的基础知识
2016/07/13 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
2020/10/18 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
Python模拟登录验证码(代码简单)
2016/02/06 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
python中的时区问题
2021/01/14 Python
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
韩国美国时尚服装和美容在线全球市场:KOODING
2018/11/07 全球购物
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
资深财务管理人员自我评价
2013/09/22 职场文书
三年级科学教学反思
2014/01/29 职场文书
医学求职信
2014/05/28 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
2014年教研组工作总结
2014/11/26 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python