Android(安卓)中监听WIFI连接状态变化
16lz
2021-01-26
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 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" />
更多相关文章
- Android(安卓)BLE 总结-源码篇(BluetoothLeAdvertiser)
- android 网络状态
- 阅读《Android(安卓)从入门到精通》(33)——Intent 分类
- 手机蓝牙和蓝牙模块进行通信
- Android(安卓)连接Mysql数据库步骤(新手步骤)
- Android第一行代码学习笔记Chapter5&6
- unable to connect to 192.168.1.110:5555 解决办法
- Android(安卓)判断网络状态
- mac下android真机调试,连接不上设备的解决方法