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中 关于json空对象筛选替换
Apr 15 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
Jan 13 Javascript
用jquery写的菜单从左往右滑动出现
Apr 11 Javascript
JQuery点击行tr实现checkBox选中的简单实例
May 26 Javascript
jQuery通用的全局遍历方法$.each()用法实例
Jul 04 Javascript
AngularJS入门教程之ng-checked 指令详解
Aug 01 Javascript
Bootstrap popover用法详解
Dec 22 Javascript
javascript将json格式数组下载为excel表格的方法
Dec 22 Javascript
Angular实现模版驱动表单的自定义校验功能(密码确认为例)
May 17 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
Mar 09 Javascript
Javascript组合继承方法代码实例解析
Apr 02 Javascript
js简单实现自动生成表格功能示例
Jun 02 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实现模仿socket请求返回页面的方法
2014/11/04 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
2016/07/26 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
Python笔记(叁)继续学习
2012/10/24 Python
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
浅谈MySQL中的触发器
2015/05/05 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
Python调用飞书发送消息的示例
2020/11/10 Python
css3通过scale()、rotate()实现放大、旋转
2020/03/19 HTML / CSS
企业安全生产演讲稿
2014/05/09 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
机关作风建设心得体会
2014/10/22 职场文书
大学生创业事迹材料
2014/12/30 职场文书
养成教育工作总结
2015/08/13 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
辞职申请书范本
2019/05/20 职场文书
创业计划书之酒店
2019/08/30 职场文书
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript