博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
h5端呼起摄像头扫描二维码并解析
阅读量:7211 次
发布时间:2019-06-29

本文共 4182 字,大约阅读时间需要 13 分钟。

2016年6月29日补充:

最近做了一些与表单相关的项目,使用了h5的input控件,在使用过程中遇到了很多的坑。也包括与这篇文章相关的。

首先我们应该知道使用h5新提供的属性getUserMedia这个属性,是可以调取系统的摄像头进行拍照或者是摄像的,但是兼容性支持的不好,所以当我们需要获取系统的多媒体权限时我们都不会采用这个属性。

使用<input type="file">标签我们可以间接的呼起系统选择文件的窗口,来读取系统文件。但是在WebView中,因为安卓权限的问题,我们是没办法直接获取读取文件这个操作的。而在原生的浏览器中是不存在这个问题的。所以选择使用这个input的时候一定要注意自己的页面是主要运行在webview中还是浏览器中。如果注意运行在客户端的webvie中,是需要客户端的同学支持的。

在IOS的某些系统版本中也会出现这个问题。具体的可以参考下面的参考文章。

参考文章:

引子:

最近公司项目有个需求,微博客户端中, h5 的页面上的某个按钮能够与native 交互呼起摄像头,扫描二维码并且解析。在非微博客户端中(微信或者是原生浏览器,如:safari)呼起系统的拍照或者上传图片按钮,通过拍照或者上传图片解析二维码。

第二种方案需要在前端 js 解析二维码。这样依赖一个第三方的解析库jsqrcode。这个库已经支持在浏览器端呼起摄像头的操作了,但是依赖一个叫getUserMedia的属性。该属性移动端的浏览器支持的都不是很好,所以只能间接的上传图片的方式解析二维码。

getUserMedia属性兼容浏览器列表:

这里写图片描述

首先感谢 jsqrcode 的开发者,提供这么优秀的解析二维码的代码,为我减少了很大的工作量。jsqrcode 地址:

我的代码库地址:

1.解决的问题:

1.能够在微博客户端呼起摄像头扫描二维码并且解析;

2.能够在原生浏览器和微信客户端中扫描二维码并且解析;

2.优点:

web端或者是 h5端可以直接完成扫码的工作;

3.缺点:

图片不清晰很容易解析失败(拍照扫描图片需要镜头离二维码的距离很近),相对于 native 呼起的摄像头解析会有1-2秒的延时。

说明:

此插件需要配合zepto.js 或者 jQuery.js使用

使用方法:

1.在需要使用的页面按照下面顺序引入lib目录下的 js 文件

        

2.自定义按钮的 html 样式

为自定义的按钮添加自定义属性,属性名称为node-type
为 input 按钮添加自定义的属性, 属性名称为node-type

因为该插件需要使用<input type="file" /> ,该 html 结构在网页上面是有固定的显示样式,为了能够自定义按钮样式,我们可以按照下面的示例代码结构嵌套代码

扫描二维码1

然后设置 input 按钮的 css 隐藏按钮,比如我使用的是属性选择器

input[node-type=jsbridge]{    display:none;}

这里我们只需要按照自己的需要定义class="qr-btn"的样式即可。

3.在页面上初始化 Qrcode 对象

//初始化扫描二维码按钮,传入自定义的 node-type 属性     $(function() {        Qrcode.init($('[node-type=qr-btn]'));    });

主要代码解析

(function($) {    var Qrcode = function(tempBtn) {        var _this_ = this;        var isWeiboWebView = /__weibo__/.test(navigator.userAgent);        if (isWeiboWebView) {            if (window.WeiboJSBridge) {                _this_.bridgeReady(tempBtn);            } else {                document.addEventListener('WeiboJSBridgeReady', function() {                    _this_.bridgeReady(tempBtn);                });            }        } else {            _this_.nativeReady(tempBtn);        }    };    Qrcode.prototype = {        nativeReady: function(tempBtn) {            $('[node-type=jsbridge]',tempBtn).on('click',function(e){                e.stopPropagation();            });            $(tempBtn).bind('click',function(e){                $(this).find('input[node-type=jsbridge]').trigger('click');            });            $(tempBtn).bind('change', this.getImgFile);        },        bridgeReady: function(tempBtn) {            $(tempBtn).bind('click', this.weiBoBridge);        },        weiBoBridge: function() {            window.WeiboJSBridge.invoke('scanQRCode', null, function(params) {                //得到扫码的结果                $('.result-qrcode').append(params.result + '
'); }); }, getImgFile: function() { var _this_ = this; var inputDom = $(this).find('input[node-type=jsbridge]'); var imgFile = inputDom[0].files; var oFile = imgFile[0]; var oFReader = new FileReader(); var rFilter = /^(?:image\/bmp|image\/cis\-cod|image\/gif|image\/ief|image\/jpeg|image\/jpeg|image\/jpeg|image\/pipeg|image\/png|image\/svg\+xml|image\/tiff|image\/x\-cmu\-raster|image\/x\-cmx|image\/x\-icon|image\/x\-portable\-anymap|image\/x\-portable\-bitmap|image\/x\-portable\-graymap|image\/x\-portable\-pixmap|image\/x\-rgb|image\/x\-xbitmap|image\/x\-xpixmap|image\/x\-xwindowdump)$/i; if (imgFile.length === 0) { return; } if (!rFilter.test(oFile.type)) { alert("选择正确的图片格式!"); return; } oFReader.onload = function(oFREvent) { qrcode.decode(oFREvent.target.result); qrcode.callback = function(data) { //得到扫码的结果 $('.result-qrcode').append(data + '
'); }; }; oFReader.readAsDataURL(oFile); }, destory: function() { $(tempBtn).off('click'); } }; Qrcode.init = function(tempBtn) { var _this_ = this; tempBtn.each(function() { new _this_($(this)); }); }; window.Qrcode = Qrcode;})(window.Zepto ? Zepto : jQuery);

样例展示

1.呼起前的页面

这里写图片描述

2.呼起后的页面

这里写图片描述

转载地址:http://bcgum.baihongyu.com/

你可能感兴趣的文章
Fabric.js高级点的教程1--添加辅助线的方法
查看>>
2011年 Linux 故事 Top 5
查看>>
ARouter 源码历险记 (五)
查看>>
优化Angular应用的性能
查看>>
php字符串函数
查看>>
[IOS] 自颁发证书不合法问题
查看>>
MYSQL常用命令
查看>>
Java中使用Jedis操作Redis
查看>>
play2.0实现新浪OAuth2.0
查看>>
QT:使用“状态模式”绘制界面 参考的一种面向对象的绘制图片的方法
查看>>
for 循环 里面 save 的问题
查看>>
常用 arm 汇编指令
查看>>
如何用_R_语言的_Shiny_库编写_web_程序
查看>>
mysql初步入门
查看>>
你对C++语言的理解到了哪一步呢
查看>>
JEECMS中FreeMarker的Macro
查看>>
高性能JavaScript(您值得一看)
查看>>
工作记录
查看>>
MySQL修改默认字符集
查看>>
HTTP Keep-Alive是什么?如何工作?
查看>>