Android掌控WiFi不完全指南( 二 )

在运行之前调用该函数进行申请即可
牛刀小试WiFi状态分类

  • 网卡正在关闭 WIFI_STATE_DISABLING WIFI ( 状态码:0 )
  • 网卡不可用 WIFI_STATE_DISABLED WIFI ( 状态码:1 )
  • 网卡正在打开 WIFI_STATE_ENABLING WIFI ( 状态码:2 )
  • 网卡可用 WIFI_STATE_ENABLED WIFI ( 状态码:3 )
  • 网卡状态不可知 WIFI_STATE_UNKNOWN WIFI ( 状态码:4 )
代码中获取WIFI的状态
// 获取 WIFI 的状态.public static int getWifiState(WifiManager manager) {return manager == null ? WifiManager.WIFI_STATE_UNKNOWN : manager.getWifiState();}获取WiFiManager实例// 获取 WifiManager 实例.public static WifiManager getWifiManager(Context context) {return context == null ? null : (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);}开启、关闭WIFI// 开启/关闭 WIFI.public static boolean setWifiEnabled(WifiManager manager, boolean enabled) {return manager != null && manager.setWifiEnabled(enabled);}扫描周围的WiFi// 开始扫描 WIFI.public static void startScanWifi(WifiManager manager) {if (manager != null) {manager.startScan();}}获取扫描结果// 获取扫描 WIFI 的热点:public static List<ScanResult> getScanResult(WifiManager manager) {return manager == null ? null : manager.getScanResult();}获取历史WiFi配置信息// 获取已经保存过的/配置好的 WIFI 热点.public static List<WifiConfiguration> getConfiguredNetworks(WifiManager manager) {return manager == null ? null : manager.WifiConfiguration();}获取对应scanResult的配置信息List<WifiConfiguration> configs = wifiManager.getMatchingWifiConfig(scanResult);// 可以打印一下看具体的情况:if (configs == null || configs.isEmpty()) return;for (WifiConfiguration config : configs) {Log.v(TAG, "config = " + config);}获取WIFI MAC地址public String getWifiBSSID() {return mWifiInfo.getBSSID();}获取本机MAC地址Android M版本之后 , 通过wifiInfo.getMacAddress()获取的MAC地址是一个固定的假地址 , 值为02:00:00:00:00:00 , 在这里通过getMacAddress函数获取真实MAC
【Android掌控WiFi不完全指南】// 获取本机MAC地址// Android M版本之后 , 通过wifiInfo.getMacAddress()获取的MAC地址是一个固定的假地址 , 值为02:00:00:00:00:00public String getSelfMac(){String mac=mWifiInfo==null?"null":mWifiInfo.getMacAddress();if(TextUtils.equals(mac, "02:00:00:00:00:00")) {String temp = getMacAddress();if (!TextUtils.isEmpty(temp)) {mac = temp;}}return mac;}private static String getMacAddress(){String macAddress = "";try {Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();while (interfaces.hasMoreElements()) {NetworkInterface iF = interfaces.nextElement();byte[] addr = iF.getHardwareAddress();if (addr == null || addr.length == 0) {continue;}StringBuilder buf = new StringBuilder();for (byte b : addr) {buf.append(String.format("%02X:", b));}if (buf.length() > 0) {buf.deleteCharAt(buf.length() - 1);}String mac = buf.toString();//WifiMonitorLogger.i("mac", "interfaceName="+iF.getName()+", mac="+mac);if(TextUtils.equals(iF.getName(), "wlan0")){return mac;}}} catch (SocketException e) {e.printStackTrace();return macAddress;}return macAddress;}获取WIFI的网络速度和速度单位// 获取当前连接wifi的速度public int getConnWifiSpeed(){return mWifiInfo.getLinkSpeed();}// 获取当前连接wifi的速度单位public String getConnWifiSpeedUnit(){return WifiInfo.LINK_SPEED_UNITS;}获取当前连接WIFI的信号强度// 获取当前连接wifi的信号强度public int getConnWifiLevel(){return mWifiManager.calculateSignalLevel(mWifiInfo.getRssi(),5);}获取当前连接的WIFI的加密方式本来我以为wifiinfo里面应该会有解决方案 , 但是搜索了一下之后发现 如何在不扫描所有wifi网络的情况下获取当前wifi连接的加密类型?看来还是需要遍历scanresults , 但是很显然SSID容易重复 , 所以用WIFI BSSID来唯一确定

经验总结扩展阅读