zoukankan      html  css  js  c++  java
  • 二维码闪电登录流程详解,附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

       转载注明:望月听涛

  • 相关阅读:
    您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同的测试类型的区别与联系(如功能测试、性能测试……)
    你对测试最大的兴趣在哪里?为什么?
    LoadRunner分为哪三个模块?请简述各模块的主要功能。
    Django学习之视图层
    Django学习之路由层
    Django学习
    Django简介
    jQuery
    JavaScript--DOM,BOM
    前端基础之JavaScript
  • 原文地址:https://www.cnblogs.com/pangblog/p/3289954.html
Copyright © 2011-2022 走看看