您的位置:首页 > 移动开发 > Android开发

Android 中监听WIFI连接状态变化

2017-03-20 20:13 453 查看
Android应用开发过程中通过注册广播监听Wifi状态变化:

广播中获取的action为WifiManager.WIFI_STATE_CHANGED_ACTION用于监听Android Wifi打开或关闭的状态,WifiManager.NETWORK_STATE_CHANGED_ACTION用于判断是否连接到了有效wifi(不能用于判断是否能够连接互联网)。

在收到action 为WifiManager.NETWORK_STATE_CHANGED_ACTION的广播时,通过

NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
String bssid = intent.getStringExtra(WifiManager.EXTRA_BSSID);


以上三个方法能够获取手机当前连接的Wifi信息,注意在wifi断开时Intent中不包含WifiInfo对象,却包含bssid。

class NetworkConnectChangedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Bundle extras = intent.getExtras();
L.e("actioin:"+action);
L.e("==>"+printBundle(extras));

if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {//这个监听wifi的打开与关闭,与wifi的连接无关
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1);
L.e("WIFI状态", "wifiState:" + wifiState);
switch (wifiState) {
case WifiManager.WIFI_STATE_DISABLED:
L.e("WIFI状态", "wifiState:WIFI_STATE_DISABLED");
break;
case WifiManager.WIFI_STATE_DISABLING:
L.e("WIFI状态", "wifiState:WIFI_STATE_DISABLING");
break;
case WifiManager.WIFI_STATE_ENABLED:
L.e("WIFI状态", "wifiState:WIFI_STATE_ENABLED");
break;
case WifiManager.WIFI_STATE_ENABLING:
L.e("WIFI状态", "wifiState:WIFI_STATE_ENABLING");
break;
case WifiManager.WIFI_STATE_UNKNOWN:
L.e("WIFI状态", "wifiState:WIFI_STATE_UNKNOWN");
break;
//
}
}
// 这个监听wifi的连接状态即是否连上了一个有效无线路由,当上边广播的状态是WifiManager.WIFI_STATE_DISABLING,和WIFI_STATE_DISABLED的时候,根本不会接到这个广播。
// 在上边广播接到广播是WifiManager.WIFI_STATE_ENABLED状态的同时也会接到这个广播,当然刚打开wifi肯定还没有连接到有效的无线
if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
Parcelable parcelableExtra = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
String bssid = intent.getStringExtra(WifiManager.EXTRA_BSSID);
if (null != parcelableExtra && !isJoinTimeOut) {
NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;
NetworkInfo.State state = networkInfo.getState();
L.e("NetWork Sate Change:"+state+" connectedBssid:"+connectedBssid);
if(state==NetworkInfo.State.DISCONNECTED){
if(connectedBssid.equals(bssid)){
boolean findCfg=false;
L.e("连接耗时:" + ((System.currentTimeMillis() - start) / 1000.0) + "s");
if (progressWheelDialog != null) {
progressWheelDialog.setTextMsg("灯被成功加入ssid=" + mScanResult.SSID + "的WIFI网络,系统开始切换到指定网络...");
}
List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks();
for(WifiConfiguration configuration:configuredNetworks){

L.e(configuration.SSID+"========>"+mScanResult.SSID);
String addSSID=mScanResult.SSID;
if(!(mScanResult.SSID.startsWith("\"") && mScanResult.SSID.endsWith("\""))){
addSSID="\""+addSSID+"\"";
}
if(configuration.SSID.equals(addSSID)){
findCfg=true;
L.i("找到连接wifi的Configuration..尝试切换wifi");
wifiManager.enableNetwork(configuration.networkId,true);
break;
}
}
if(!findCfg){
L.i("未找到连接wifi的Configuration..尝试创建连接...");
int type=3;
if(TextUtils.isEmpty(mPass)){
type=0;
}
WifiConfiguration configuration=  WifiUtils.createWifiInfoCfg(mScanResult.SSID,mPass,type);
L.i("新的wifi配置:"+configuration);
int newNetId = wifiManager.addNetwork(configuration);
L.i("新的netId="+newNetId);
wifiManager.enableNetwork(newNetId,true);
}

}
}else if(state== NetworkInfo.State.CONNECTED){
if(mScanResult!=null) {
String ssid = wifiInfo.getSSID();
String addSSID=mScanResult.SSID;
if(!(mScanResult.SSID.startsWith("\"") && mScanResult.SSID.endsWith("\""))){
addSSID="\""+addSSID+"\"";
}
L.i(ssid + "***>" + mScanResult.SSID);
L.i("总共耗时:"+((System.currentTimeMillis()-start)/1000.0));
if (ssid.equals(addSSID)) {
handler.removeCallbacks(watchDog);
//                                dismissLoadDialog(TYPE_LOAD_DIALOG);
if(progressWheelDialog!=null) {
progressWheelDialog.dismiss();
}
T.showShort(getApplicationContext(), "操作成功!");
Intent intent1 = new Intent(WiFiActivity2.this, MainActivity.class);
intent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent1);
}
}
}
}
}
}

private  String printBundle(Bundle bundle) {
StringBuilder sb = new StringBuilder();
for (String key : bundle.keySet()) {
if (key.equals(WifiManager.EXTRA_WIFI_STATE)) {
sb.append("\nkey:" + key + ", value:" + bundle.getInt(key));
} else {
sb.append("\nkey:" + key + ", value:" + bundle.get(key));
}
}
//        L.e("bundle:"+bundle);
return sb.toString();
}

}


动态注册广播:

private void registerNetworkConnectChangeReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
networkConnectChangedReceiver = new NetworkConnectChangedReceiver();
registerReceiver(networkConnectChangedReceiver, filter);
}


AndroidManifest添加权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: