上篇文章,我们重点介绍了一下二维码登录的流程,以及每个“角色”要做的事情,下面我们重点分析TV角色所做的工作。

TV主要完成二维码图片显示,以及websocket请求。下面重点说一下这两点。

1. Base64转码Bitmap

服务端返回二维码图片的二进制数据,我们需要将其转成图片。这个问题不大,

android系统原生支持Base64转码的,并且提供了丰富的API。使用方式如下:

 byte[]  = null;
// 将得到的String字符串通过Base64转为字节数组
c = Base64.decode(qrCode.img_base64, Base64.DEFAULT);
// 根据byte数组创建Bitmap
Bitmap bitmap = BitmapFactory.decodeByteArray(c, 0,
c.length);
ivCodeImage.setImageBitmap(bitmap);

2. websocket支持

Wedsocket是HTML 5一种新的 协议,它是实现了浏览器和服务器全双工通信,可以
自行百度。

由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。

这种传统的HTTP request 的模式带来很明显的缺点:  浏览器需要不断的向服务器发出请求(request),

然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽。

在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。

两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即时服务带来了两大好处:

1. Header

互相沟通的Header是很小的-大概只有 2 Bytes

2. Server Push

服务器可以主动传送数据给客户端

在android上,实现Websocket是开源项目非常多,autobahn, JWebsocket等,这里我使用的是精简过的autobahn类库,

因为autobahn除了实现Websocket协议外,还实现了Websocket Application Messageing 协议(Websocket子协议)。

这里我们只要用Websocket实现就可以了。

使用代码如下:

private void excuteWebcoketTask() {
System.out.println("开始连接websocket///"); final WebSocketConnection wsc = new WebSocketConnection();
try { // 测试拍照登录的地址
wsc.connect(
"ws://test.api.3g.youku.com/thirdpart/session/pull?pid=e80933b38c5c019d&ver=1.7.0",
new WebSocketConnectionHandler() { @Override
public void onBinaryMessage(byte[] payload) {
Logger.e(TAG, "onBinaryMessage size="
+ payload.length);
} @Override
public void onClose(int code, String reason) {
Logger.e(TAG, "onClose reason=" + reason);
} @Override
public void onOpen() {
Logger.e(TAG, "onOpen");
// wsc.sendTextMessage("Hello!");
wsc.sendTextMessage("9c553730ef5b6c8c542bfd31b5e25b69");
// wsc.disconnect();
} @Override
public void onRawTextMessage(byte[] payload) {
Logger.e(TAG, "onRawTextMessage size="
+ payload.length);
} @Override
public void onTextMessage(String payload) {
Logger.e(TAG, "onTextMessage" + payload);
Toast.makeText(QRCodeLoginActivity.this, payload, Toast.LENGTH_SHORT).show();
}
}); } catch (WebSocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

Websocket实现参见demo:点我下载

最终效果(demo无卖相,勿喷)

原文链接:http://www.67tgb.com/?p=622

转载注明:望月听涛

二维码闪电登录流程详解,附demo(2/2)的更多相关文章

  1. 二维码闪电登录流程详解,附demo(1/2)

    二维码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设 ...

  2. PHP生成页面二维码解决办法?详解

    随着科技的进步,二维码应用领域越来越广泛,今天我给大家分享下如何使用PHP生成二维码,以及如何生成中间带LOGO图像的二维码. 具体工具: phpqrcode.php内库:这个文件可以到网上下载,如果 ...

  3. 基于SignalR的消息推送与二维码描登录实现

    1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于Singl ...

  4. 实现手机扫描二维码页面登录,类似web微信-第四篇,服务器端

    转自:http://blog.csdn.net/otangba/article/details/8273952 终于到了服务器端,第三篇的手机客户端如果已经下载了的话,没有服务器是不能正常运行的. 服 ...

  5. 实现手机扫描二维码页面登录,类似web微信-第一篇,业务分析

    转自:http://www.cnblogs.com/fengyun99/p/3541249.html 关于XMPP组件的文章,先休息两天,好歹已经完整的写了一份. 这两天,先实现一套关于web微信扫描 ...

  6. php 实现 二维码 扫描登录

    本人简单实现的示例,使用任意二维码工具打开二维码对应链接 http://www.54php.cn/demo1/scan 原理介绍: 第一步:访问登录页面,生成唯一key,例如MkhjDFL=,并且将此 ...

  7. Android实现二维码扫描登录网页

        之前写过一个二维码扫描demo,用的Zxing的框架,点击下载.兴许扫描二维码中出现一些问题,比方解决压缩图片.调整扫描窗体大小等等. 兴许单位要求做扫描登录实现,发现难点就是怎么知道你扫描的 ...

  8. 实现手机扫描二维码页面登录,类似web微信-第三篇,手机客户端

    转自:http://www.cnblogs.com/fengyun99/p/3541254.html 上一篇,介绍了二维码生成的机制,紧接着,我们就要开发手机客户端来识别这个二维码. 二维码,实际上是 ...

  9. Android扫描二维码 实现 登录网页

    工程代码:ScanQRcode.zip ------------------------------------------------------------------ 1. 扫描二维码登录的实现 ...

随机推荐

  1. 关于R.styleable的问题

    原来想直接想调用程序的东西,但是使用R.styleable的时候 eclipse不能解析了,后来发现原来被删除了此方法 public ImageAdapter(Context c) { mContex ...

  2. spring 事务 笔记3.1

    Spring事务 以前的事务都是编程式事务,需要开启和关闭,然后程序写在这里面 spring,声明式事务 Spring事务隔离级别 DEFAULT 使用数据库默认隔离级别 READ_UNCOMMITT ...

  3. 安卓开发37:自定义的HorizontalScrollView类,使其pageScroll的时候焦点不选中

    自定义一个HorizontalScrollView类,主要为了让这个HorizontalScrollView不能鼠标点击,不能左右按键,并且没有焦点. public class ImageMoveHo ...

  4. Windows 8.1 RTM初体验

    Windows 8.1正式发布在10月17日,现在可以在MSDN/TechNet进行订阅下载. 操作系统版本号和Windows Server 2012 R2保持一致. 开始屏幕动态磁贴现在有4种尺寸可 ...

  5. Asp.Netserver控件开发的Grid实现(三)列编辑器

    以下是GridColumnsEditor的实现代码: GridColumnsEditor.cs using System; using System.Collections.Generic; usin ...

  6. c++隐藏实例

    隐藏:是指派生类的函数屏蔽了与其同名的基类函数,规则如下:(1)如果派生类的函数与基类的函数同名,但是参数不同.此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆). 很简单略去 ...

  7. BZOJ 3040: 最短路(road) ( 最短路 )

    本来想学一下配对堆的...结果学着学着就偏了... 之前 kpm 写过这道题 , 前面的边不理它都能 AC .. 我也懒得去写前面的加边了... 用 C++ pb_ds 库里的 pairing_hea ...

  8. javascript面向对象创建高级 Web 应用程序

       目录 JavaScript 对象是词典 JavaScript 函数是最棒的 构造函数而不是类 原型 静态属性和方法 闭包 模拟私有属性 从类继承 模拟命名空间 应当这样编写 JavaScript ...

  9. CodeForces 260A Adding Digits

    这道题目的意思是给你提供a, b, n 三个数 a为 输入的数字 ,你需要在a后面加n次 ,每次可以加0-9 但要保证每次加上去的那个数字能被b整除 不过数据规模有点大,用搜索会MLE(即使开了个开栈 ...

  10. 2013年最好的Python开源项目汇总

    2013年Python社区诞生了很多实用的开发工具,这些工具 在一定程度上 可以帮助你节省更多的时间.本文为你汇总了这些工具,它们大部分都是开源的,你还可以通过源码来学习更多的Python开发知识. ...