随着Wifi的普及,在开发App的时候对wifi的考虑越来越多了。例如程序的升级在wifi下可以省很多流量,在通信软件中的视频通话。可以实现高画质的传输等等,Android提供了WifiManager类来帮助开发者们管理Wifi。下面就简单来说一下WifiManager的简单用法把。
权限:
为了使用WfiManager 我们需要在Androidmanifest.xml 加入权限:
//本例中使用了前两个。具体请按照需要添加权限。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="adnroid.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="adnroid.permission.ACCESS_CHECKIN_PROPERTTES"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"></uses-permission>
获取当前连接WIFI信息
// 获取WifiManager final WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); btnStart = (Button) findViewById(R.id.button1); btnStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 获取当前连接WIFI的信息 WifiInfo info = wm.getConnectionInfo(); // 判断当前是否有连接的WIFI if (info.getBSSID() != null) { // 信号强度 int strength = WifiManager.calculateSignalLevel( info.getRssi(), 100); // 连接速度 int speed = info.getLinkSpeed(); // 获取BSSID地址。 String bssid = info.getBSSID(); // 获取SSID地址。 需要连接网络的ID String ssid = info.getSSID(); String text = String.format( "当前Wifi信号强度%s,网络速度%s,SSID:%s,BSSID:%s", strength, speed, ssid, bssid); Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT) .show(); } } });
WifiInfo类常用的方法
info.getBSSID(): 获取BSSID地址。
info.getSSID(): 获取SSID地址。 需要连接网络的ID
info.getIpAddress(): 获取IP地址。4字节Int, XXX.XXX.XXX.XXX 每个XXX为一个字节
info.getMacAddress(): 获取MAC地址。
info.getNetworkId(): 获取网络ID。
info.getLinkSpeed(): 获取连接速度,可以让用户获知这一信息(单位Mbps)。
info.getRssi(): 获取RSSI,RSSI就是接受信号强度指示。
PS:可以使用WifiManager的setWifiEnable 开启或者禁用WIFI硬件。或者使用getWifiState,或者isWifiEnable方法请求当前Wifi状态
监听Wifi连接
监听WIFI可以让我们的应用程序更健壮。如正在播放音乐时WIFI断开连接,提醒用户。
监听WIFI有两种方式:
(1)使用ConnectivityManager类来实现。其他随笔中写
(2)使用BroadcastReceiver监听,每当Wifi连接发生变化时,WifiManager会广播对应的Intent。告知当前WIFI的状态。
常用的Inten Action如下:
(1)WIFI_STATE_CHANGED_ACTION:当wifi硬件已经发生变化广播,常用的几种状态“enabling”,“enabled”,“disabling”,“disabled”,“unknown”等,他包含了两个Extra。
EXTRA_WIFI_STATE:新的wifi状态
EXTRA_PREVIOUS_STATE:前一次的Wifi状态。
(2)SUPPLICANT_CONNECTION_CHANGE_ACTION:请求的连接已经建立(现在可以使用),或连接请求已经丢失。他包含了一个EXTRA。
EXTRA_NEW_STATE:参数值是“true” 或 “false”
(3)NETWORK_STATE_CHANGED_ACTION:当WIFI连接状态发生变化时触发,他包含了两个Extran,
EXTRA_NETWORK_INFO: 包含了详细描述当前网络状态的networkInfo对象
EXTRAN_BSSID: 当前所连接接入点的BSSID
(4)RSSI_CHANGED_ACTION:可以用来监听当前连接WIFI的信号强度。为了获取当前WIFI信号强度需要使用WifiManager.calculateSignalLevel来设置信号强度范围,他会把当前的信号强 度,按照设置的范围返回一个整型数值。(如:WifiManager.calculateSignalLevel(wifimanager.getRssi(),100)当信号最强的时候可以返回99,因为他是从0开始计算的所以不会到 100)。他包含了一个Extra。
EXTRA_NEW_RSSI :保存了当前连接的信号强度。
代码:
public class WifiBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 监听当前连接的WIFI状态 int state = intent.getIntExtra("wifi_state", WifiManager.WIFI_STATE_DISABLED); switch (state) { case WifiManager.WIFI_STATE_DISABLING: // 正在停止 break; case WifiManager.WIFI_STATE_DISABLED: // 已停止 break; case WifiManager.WIFI_STATE_ENABLING: // 正在打开 break; case WifiManager.WIFI_STATE_ENABLED: // 已开启 break; case WifiManager.WIFI_STATE_UNKNOWN: // 未知 break; } } }
在AndroidManifest.xml 注册BroadcasetReceiver
<receiver android:name=".WifiBroadcastReceiver" >
<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
PS:此处还可以监听更多的关于WifiManageer广播的Intent。如上面的四个比较常用的。
扫描,管理WIFI
(1)扫描WIFI热点
// 获取WifiManager final WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); btnStart = (Button) findViewById(R.id.button1); btnStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //开始扫描 wm.startScan(); } }); // 注册广播,接收wifi扫描结果 registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 获取所有扫描到的WIFI,可以获取Wifi的相关信息。如信号强度,链接速度,SSID,身份验证等 List<ScanResult> list = wm.getScanResults(); Toast.makeText(MainActivity.this, MessageFormat.format("共找到{0}个wifi", list.size()), Toast.LENGTH_SHORT).show(); } }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
ps:这里注意一下intent filter的Action是“SCAN_RESULTS_AVAILABLE_ACTION”
(2)管理WIFI
// 获取WifiManager final WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE); btnStart = (Button) findViewById(R.id.button1); btnStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 获取已配置WIFI列表 List<WifiConfiguration> list = wm.getConfiguredNetworks(); if (list.size() > 0) { String txt = ""; for (WifiConfiguration wc : list) { txt += wc.SSID + " "; } Toast.makeText( MainActivity.this, MessageFormat.format("您已经配置了{0}个wifi连接,分别是{1}", list.size(), txt), Toast.LENGTH_SHORT) .show(); boolean disableOthers=true; //连接第一个WIFI,其他WIFI不可用 wm.enableNetwork(list.get(0).networkId, disableOthers); } } });