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 相关文章推荐
js里的prototype使用示例
Nov 19 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
Mar 14 Javascript
javascript中的onkeyup和onkeydown区别介绍
Apr 28 Javascript
javascript数据类型示例分享
Jan 19 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
使用控制台破解百小度一个月只准改一次名字
Aug 13 Javascript
实现非常简单的js双向数据绑定
Nov 06 Javascript
angularjs创建弹出框实现拖动效果
Aug 25 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
Mar 05 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
Sep 01 jQuery
node.js微信小程序配置消息推送的实现
Feb 13 Javascript
vue backtop组件的实现完整代码
Apr 07 Vue.js
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程序员面试 切忌急功近利(更需要注重以后的发展)
2010/09/01 PHP
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
js 提交和设置表单的值
2008/12/19 Javascript
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
python自然语言编码转换模块codecs介绍
2015/04/08 Python
python读取文件名并改名字的实例
2019/01/07 Python
深入解析神经网络从原理到实现
2019/07/26 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
学习Python爬虫的几点建议
2020/08/05 Python
运行python提示no module named sklearn的解决方法
2020/11/29 Python
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
remote接口和home接口主要作用
2013/05/15 面试题
国旗下的讲话演讲稿
2014/05/08 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
《窃读记》教学反思
2016/02/18 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python
深入理解 Golang 的字符串
2022/05/04 Golang