前三个部分的地址是:ZXING源码分析(一)CAMERA部分 、 zxing源码分析(二)decode部分、zxing源码分析(三)result、history部分
前面三篇文章基本上已经把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进行处理,画个图大家可以参考