zoukankan      html  css  js  c++  java
  • 二维码zxing源码分析(四)wifi部分

    前面三篇文章基本上已经把zxing的核心源码看的差不多了,现在我们在分析它所包含的功能的部分,其实history也是属于这一部分的,但是放在第三篇说了
    核心类:
            com.google.zxing.client.android.wifi.WifiConfigManager wifi管理类,通过它用解析后的结果进行管理
            com.google.zxing.client.android.wifi.NetworkType 网络类型分类 
            com.google.zxing.client.result.WifiResultParser core中的方法,对扫描结果是wifi进行的解析
            com.google.zxing.client.result.WifiParsedResult  core中的方法,用来存储解析后的结果
     
    WifiConfigManager 包含了以下几个方法
    changeNetworkCommon 用来处理没有密码的 wifi连接
    changeNetworkWEP  用来处理WEP的 wifi连接
    changeNetworkWPA 用来处理WPA的 wifi连接
    本身它继承了AsyncTask方法,doInBackground()处理了连接那一个类型了wifi,会根据解析的结果得到wifi的类型,然后去连接,代码如下:
     String networkTypeString = theWifiResult.getNetworkEncryption();
        NetworkType networkType;
        try {
          networkType = NetworkType.forIntentValue(networkTypeString);
        } catch (IllegalArgumentException ignored) {
          Log.w(TAG, "Bad network type; see NetworkType values: " + networkTypeString);
          return null;
        }
        if (networkType == NetworkType.NO_PASSWORD) {
          changeNetworkUnEncrypted(wifiManager, theWifiResult);
        } else {
          String password = theWifiResult.getPassword();
          if (password != null && !password.isEmpty()) {
            if (networkType == NetworkType.WEP) {
              changeNetworkWEP(wifiManager, theWifiResult);
            } else if (networkType == NetworkType.WPA) {
              changeNetworkWPA(wifiManager, theWifiResult);
            }
          }
        }

    theWifiResult.getNetworkEncryption(); 就是得到wifi的类型的,这个方法的获取是通过核心包Core中WifiResultParser的parser解析后返回WifiParsedResult类中包含的

     public WifiParsedResult parse(Result result) {
        String rawText = getMassagedText(result);
        if (!rawText.startsWith("WIFI:")) {
          return null;
        }
        String ssid = matchSinglePrefixedField("S:", rawText, ';', false);
        if (ssid == null || ssid.isEmpty()) {
          return null;
        }
        String pass = matchSinglePrefixedField("P:", rawText, ';', false);
        String type = matchSinglePrefixedField("T:", rawText, ';', false);
        if (type == null) {
          type = "nopass";
        }
        boolean hidden = Boolean.parseBoolean(matchSinglePrefixedField("H:", rawText, ';', false));
        return new WifiParsedResult(type, ssid, pass, hidden);
      }
    到此,便完成了wifi的解析
    上面所说是内部解析wifi的数据,那页面上是怎么展示的呢,这还要回到CaptureActivity的handleDecode方法,因为这个就是对所有类型的数据的结果进行展示的
    handleDecode会调用handleDecodeInternally进行处理,画个图大家可以参考
  • 相关阅读:
    PHP中获取当前页面的URL信息
    $_POST和$GLOBALS['HTTP_RAW_POST_DATA'] 的区别
    curl模拟ip和来源进行网站采集的实现方法
    mysql修改root密码的几种方法
    微信小程序实现支付功能
    git获取远程服务器的指定分支
    mysql函数技巧整理
    sql 查询目标数据库中所有的表以其关键信息
    SET NOCOUNT ON
    C# CultureInfo中常用的InvariantCulture
  • 原文地址:https://www.cnblogs.com/zhangjin055/p/4699682.html
Copyright © 2011-2022 走看看