检测网络变化(wifi、2g、3g、4g)
1.注册广播"android.net.conn.CONNECTIVITY_CHANGE"和"android.net.wifi.STATE_CHANGE" 进行监听:
private class ConnectivityBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { try { String action = intent.getAction(); Log.e("ConnectivityBroadcastReceiver", "action= "+action); if ((!action.equals(ConnectivityManager.CONNECTIVITY_ACTION) && !action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) || !isListening_) { return; } if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { networkInfo_ = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if(networkInfo_.isConnected()) { // WIFI is connected state_ = NET_STATE_WIFI_CONNECTED; }else{ state_ = NET_STATE_DISCONNECTED; } } else if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { networkInfo_ = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); String apn = networkInfo_.getExtraInfo(); Log.e("ConnectivityBroadcastReceiver", "apn= "+apn); boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); if(networkInfo_.getType() == ConnectivityManager.TYPE_WIFI){ if ( networkInfo_.isConnected() ){ state_ = NET_STATE_WIFI_CONNECTED; }else{ state_ = noConnectivity ? NET_STATE_DISCONNECTED : NET_STATE_WIFI_CONNECTED; } }else if(networkInfo_.getType() == ConnectivityManager.TYPE_MOBILE){ if (noConnectivity) { state_ = NET_STATE_DISCONNECTED; } else { TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); int type = telephonyManager.getNetworkType(); Log.e("ConnectivityBroadcastReceiver", "type= "+type); state_ = getNetworkClass(type); } }else { if (noConnectivity) { state_ = NET_STATE_DISCONNECTED; } else { state_ = NET_STATE_UNKNOWN; } } } NotifyEvent(); } catch (Exception e) { e.printStackTrace(); } } };
2.判断TYPE_MOBILE下的网络类型:
private int getNetworkClass(int networkType) { switch (networkType) { case TelephonyManager.NETWORK_TYPE_GPRS: case TelephonyManager.NETWORK_TYPE_EDGE: case TelephonyManager.NETWORK_TYPE_CDMA: case TelephonyManager.NETWORK_TYPE_1xRTT: case TelephonyManager.NETWORK_TYPE_IDEN: return NET_STATE_2G_CONNECTED; case TelephonyManager.NETWORK_TYPE_UMTS: case TelephonyManager.NETWORK_TYPE_EVDO_0: case TelephonyManager.NETWORK_TYPE_EVDO_A: case TelephonyManager.NETWORK_TYPE_HSDPA: case TelephonyManager.NETWORK_TYPE_HSUPA: case TelephonyManager.NETWORK_TYPE_HSPA: case TelephonyManager.NETWORK_TYPE_EVDO_B: case TelephonyManager.NETWORK_TYPE_EHRPD: case TelephonyManager.NETWORK_TYPE_HSPAP: return NET_STATE_3G_CONNECTED; case TelephonyManager.NETWORK_TYPE_LTE: return NET_STATE_4G_CONNECTED; default: return NET_STATE_UNKNOWN; } }
3.在AndroidManifest.xml中加上权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>