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

   上篇文章,我们重点介绍了一下二维码登录的流程,以及每个“角色”要做的事情,下面我们重点分析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

   转载注明:望月听涛

原文地址:https://www.cnblogs.com/pangblog/p/3289954.html