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 相关文章推荐
新浪的图片新闻效果
Jan 13 Javascript
利用jquery包将字符串生成二维码图片
Sep 12 Javascript
javascript移出节点removeChild()使用介绍
Apr 03 Javascript
排序算法的javascript实现与讲解(99js手记)
Sep 28 Javascript
深入理解js中this的用法
May 28 Javascript
Bootstrap3 Grid system原理及应用详解
Sep 30 Javascript
深入理解选择框脚本[推荐]
Dec 13 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
Apr 16 Javascript
angular或者js怎么确定选中ul中的哪几个li
Aug 16 Javascript
如何理解Vue的.sync修饰符的使用
Aug 17 Javascript
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
React+Redux实现简单的待办事项列表ToDoList
Sep 29 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学习之PHP表达式
2006/10/09 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
PHP中常用的数组操作方法笔记整理
2016/05/16 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
javascript setTimeout和setInterval 的区别
2009/12/08 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
js验证框架之RealyEasy验证详解
2016/06/08 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
微信小程序开发之IOS和Android兼容的问题
2017/09/26 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
2019/09/02 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
用Python输出一个杨辉三角的例子
2014/06/13 Python
python多线程用法实例详解
2015/01/15 Python
Python中Continue语句的用法的举例详解
2015/05/14 Python
Python selenium文件上传方法汇总
2020/11/19 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
Python实战之制作天气查询软件
2019/05/14 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
Python求解正态分布置信区间教程
2019/11/20 Python
python 实现线程之间的通信示例
2020/02/14 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
linux系统都有哪些运行级别
2012/04/15 面试题
小饰品店的创业计划书范文
2013/12/28 职场文书
六年级学生期末评语
2014/12/26 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书