注册权限
使用WiFi需要保证在 AndroidManifest.xml
中添加如下权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"
android:required="false"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
android:required="false"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:required="false" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
申请权限
我们在开始监听之前要确定权限均以开启。
public static final int REQUEST_CODE = 100001;//定义权限返回码
private boolean checkPermissionAllGranted(String[] permissions,Context context) {
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
// 只要有一个权限没有被授予, 则直接返回 false
return false;
}
}
return true;
}
boolean isAllGranted = checkPermissionAllGranted(
new String[] {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.ACCESS_NETWORK_STATE
}
,CurrentActivity.this);
if (isAllGranted) {// 如果这3个权限全都拥有, 则直接执行
/* 执行代码 */
}
else ActivityCompat.requestPermissions(CurrentActivity.this,new String[]{
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.ACCESS_NETWORK_STATE
},REQUEST_CODE);//申请权限
监听
安卓中WiFi状态信息变化时系统会广播对应消息,我们可以注册一个receiver来接受这个消息,receiver接收到消息后会调用我们定义的 onReceive
函数,我们可以在函数中检查消息码来监控WiFi的状态。
onReceive
创建一个类继承于 BroadcastReceiver
然后在其中实现 onReceive
函数。
public static class WIFIreceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
String action = intent.getAction();
if(action != null){
switch (action){
case WifiManager.WIFI_STATE_CHANGED_ACTION://监控WiFi开启与关闭
int Wstate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,0);
switch (Wstate){
case WifiManager.WIFI_STATE_ENABLED:
Log.d("WIFI_info","WIFI已开启");
break;
case WifiManager.WIFI_STATE_DISABLED:
Reference.CurrentWIFI = "";
Log.d("WIFI_info","WIFI已关闭");
break;
}
break;
case WifiManager.NETWORK_STATE_CHANGED_ACTION://监控WiFi连接是否切换
String bssid = ConditionInfo.WIFI.getBSSID(context);
if(!Reference.CurrentWIFI.equals(bssid) && !bssid.equals("") && !bssid.equals("00:00:00:00:00:00")){
Reference.CurrentWIFI = bssid;
Log.d("WIFI_info","WIFI已修改"+Reference.CurrentWIFI);
}
break;
//bssid是WiFi的物理地址,ssid是WiFi的名称
}
}
}
关于状态码的更多知识请参考安卓文档 WifiManager
注册receiver
最后需要在需要进行监测的Activity中注册我们写好的receiver。
/* CurrentActivity */
WIFIreceiver = new WIFIreceiver(); //创建receiver实例
IntentFilter filter = new IntentFilter();//创建filter实例
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);//添加我们所需要检测的状态
context.registerReceiver(WIFIreceiver,filter); //在当前activity中注册该receiver
完成这一步我们就可以顺利地检测WiFi状态的变化了。