访问Android硬件资源の管理网络和Wifi连接(2)

6)ConnectivityManager.EXTRA_EXTRA_INFO:包含可选的网络连接的额外信息。


(2)WifiManager

WifiManager代表Android中的Wi-Fi连接服务,它被用于配置Wi-Fi网络连接,管理当前Wi-Fi连接,扫描Wi-Fi接入点和监控Wi-Fi连接的状态改变。获取WifiManager的方法和Connectivity Manager类似,通过函数getSystemService,并提供参数Context.WIFI_SERVICE,代码片段如下:

[java]

String wserviceName = Context.WIFI_SERVICE;   WifiManager wm = (WifiManager) getSystemService(wserviceName);  

同样的,需要在AndroidManifest.xml文件中指定访问许可:

[html]

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>   <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>  

我们可以使用setWifiEnabled函数来设置使能和去使能Wi-Fi硬件,使用getWifiState和isWifiEnabled函数来查看当前Wi-Fi状态,代码片段如下:

[java]

if (!wm.isWifiEnabled()) {       if (WifiManager.WIFI_STATE_ENABLING != wm.getWifiState()) {           wm.setWifiEnabled(true);       }   }  

2.1)监控Wi-Fi连接

在Wi-Fi网络连接状态改变时,Wi-Fi Manager将广播相应的intent,有如下几种:

1)WifiManager.WIFI_STATE_CHANGED_ACTION:标识Wi-Fi硬件状态改变,可能在enabling、enabled、disabling、disabled和unknown之间改变。它包含了两个额外的键值EXTRA_WIFI_STATE和EXTRA_PREVIOUS_STATE,分别表示新的和前一个Wi-Fi状态。

2)WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION:Wi-Fi硬件和当前接入点之间的连接状态改变时,这个intent将被广播。额外的键值EXTRA_NEW_STATE用来表示是新的连接建立事件还是已存在的连接中断事件,为true表示新的连接建立。

3)WifiManager.NETWORK_STATE_CHANGED_ACTION:Wi-Fi连接状态改变时广播这个intent,包含两个额外的键值:一是EXTRA_NETWORK_INFO,它包含表示当前网络状态的NetworkInfo对象;一是EXTRA_BSSID,包含连接到的接入点的BSSID值。

4)WifiManager.RSSI_CHANGED_ACTION:监听这个intent可以使应用程序监控当前Wi-Fi连接的信号强度。包含一个额外键值EXTRA_NEW_RSSI,包含了当前信号强度。使用这个信号强度,需要使用静态函数calculateSignalLevel将这个值按指定的缩放转换为整型值。


2.2)创建和管理Wi-Fi连接和配置

使用WiFi Manager可以进行网络配置,控制连接到哪个网络。当连接建立后,可以进一步获取活动网络连接的额外配置信息。使用函数getConfiguredNetworks可获得当前网络配置信息的列表,返回值是WifiConfiguration对象,包含了网络ID、SSID和其他配置信息。

要使用某一网络连接,可使用enableNetwork函数,传入网络ID并设置disableAllOthers参数为true即可,代码片段如下:

[java]

// Get a list of available configurations    List<WifiConfiguration> configurations = wm.getConfiguredNetworks();   // Get the network ID for the first one    if (configurations.size() > 0) {       int netID = configurations.get(0).networkId;       // Enable the network        boolean disableAllOthers = true;       wm.enableNetwork(netID, disableAllOthers);   }  

一旦连接建立,就可以使用getConnectionInfo函数来返回连接的状态,返回的是WifiInfo对象,包含了当前接入点的BSSID、Mac地址、IP地址,以及当前链路速度和信号强度。

下面的代码片段用于查询当前活动Wi-Fi连接并显示获取的相关信息:

[java]

WifiInfo info = wm.getConnectionInfo();   if (null != info.getBSSID()) {       int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);       int speed = info.getLinkSpeed();       String units = WifiInfo.LINK_SPEED_UNITS;       String ssid = info.getSSID();                      String toastText = String.format("Connected to {0} at {1}{2}. Strength {3}/5", ssid, speed, units, strength);       Toast.makeText(this.getApplicationContext(), toastText, Toast.LENGTH_LONG);   }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyzxzd.html