随着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();
}
}
});
View Code
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;
}
}
}
View Code
在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));
View Code
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);
}
}
});
View Code