Android 中监听WIFI连接状态变化

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" />

猜你喜欢

转载自blog.csdn.net/u011928958/article/details/64132675