Android检测网络类型
16lz
2023-05-28
Android检测网络类型
主要使用BroadcastReceiver去监听网络变化,实时发广播去通知:
首先要封装一个工具类去检测网络
public class NetWorkUtils { private static final int NETWORK_TYPE_UNAVAILABLE = -1; // private static final int NETWORK_TYPE_MOBILE = -100; private static final int NETWORK_TYPE_WIFI = -101; private static final int NETWORK_CLASS_WIFI = -101; private static final int NETWORK_CLASS_UNAVAILABLE = -1; /** Unknown network class. */ private static final int NETWORK_CLASS_UNKNOWN = 0; /** Class of broadly defined "2G" networks. */ private static final int NETWORK_CLASS_2_G = 1; /** Class of broadly defined "3G" networks. */ private static final int NETWORK_CLASS_3_G = 2; /** Class of broadly defined "4G" networks. */ private static final int NETWORK_CLASS_4_G = 3; // 适配低版本手机 /** Network type is unknown */ public static final int NETWORK_TYPE_UNKNOWN = 0; /** Current network is GPRS */ public static final int NETWORK_TYPE_GPRS = 1; /** Current network is EDGE */ public static final int NETWORK_TYPE_EDGE = 2; /** Current network is UMTS */ public static final int NETWORK_TYPE_UMTS = 3; /** Current network is CDMA: Either IS95A or IS95B */ public static final int NETWORK_TYPE_CDMA = 4; /** Current network is EVDO revision 0 */ public static final int NETWORK_TYPE_EVDO_0 = 5; /** Current network is EVDO revision A */ public static final int NETWORK_TYPE_EVDO_A = 6; /** Current network is 1xRTT */ public static final int NETWORK_TYPE_1xRTT = 7; /** Current network is HSDPA */ public static final int NETWORK_TYPE_HSDPA = 8; /** Current network is HSUPA */ public static final int NETWORK_TYPE_HSUPA = 9; /** Current network is HSPA */ public static final int NETWORK_TYPE_HSPA = 10; /** Current network is iDen */ public static final int NETWORK_TYPE_IDEN = 11; /** Current network is EVDO revision B */ public static final int NETWORK_TYPE_EVDO_B = 12; /** Current network is LTE */ public static final int NETWORK_TYPE_LTE = 13; /** Current network is eHRPD */ public static final int NETWORK_TYPE_EHRPD = 14; /** Current network is HSPA+ */ public static final int NETWORK_TYPE_HSPAP = 15; /** * 获取运营商 * * @return */ public static String getProvider(Context context) { String provider = "未知"; try { TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); String IMSI = telephonyManager.getSubscriberId(); Log.e("tag", "getProvider.IMSI:" + IMSI); if (IMSI == null) { if (TelephonyManager.SIM_STATE_READY == telephonyManager .getSimState()) { String operator = telephonyManager.getSimOperator(); Log.e("tag", "getProvider.operator:" + operator); if (operator != null) { if (operator.equals("46000") || operator.equals("46002") || operator.equals("46007")) { provider = "中国移动"; } else if (operator.equals("46001")) { provider = "中国联通"; } else if (operator.equals("46003")) { provider = "中国电信"; } } } } else { if (IMSI.startsWith("46000") || IMSI.startsWith("46002") || IMSI.startsWith("46007")) { provider = "中国移动"; } else if (IMSI.startsWith("46001")) { provider = "中国联通"; } else if (IMSI.startsWith("46003")) { provider = "中国电信"; } } } catch (Exception e) { e.printStackTrace(); Log.e("error", "getProvider: "+e.toString()); } return provider; } /** * 获取网络类型 * * @return */ public static String getCurrentNetworkType(Context context) { int networkClass = getNetworkClass(context); String type = "未知"; switch (networkClass) { case NETWORK_CLASS_UNAVAILABLE: type = "无"; break; case NETWORK_CLASS_WIFI: type = "Wi-Fi"; break; case NETWORK_CLASS_2_G: type = "2G"; break; case NETWORK_CLASS_3_G: type = "3G"; break; case NETWORK_CLASS_4_G: type = "4G"; break; case NETWORK_CLASS_UNKNOWN: type = "未知"; break; } return type; } private static int getNetworkClass(Context context) { int networkType = NETWORK_TYPE_UNKNOWN; try { final NetworkInfo network = ((ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE)) .getActiveNetworkInfo(); if (network != null && network.isAvailable() && network.isConnected()) { int type = network.getType(); if (type == ConnectivityManager.TYPE_WIFI) { networkType = NETWORK_TYPE_WIFI; } else if (type == ConnectivityManager.TYPE_MOBILE) { TelephonyManager telephonyManager = (TelephonyManager) context .getSystemService( Context.TELEPHONY_SERVICE); networkType = telephonyManager.getNetworkType(); } } else { networkType = NETWORK_TYPE_UNAVAILABLE; } } catch (Exception ex) { ex.printStackTrace(); } return getNetworkClassByType(networkType); } private static int getNetworkClassByType(int networkType) { switch (networkType) { case NETWORK_TYPE_UNAVAILABLE: return NETWORK_CLASS_UNAVAILABLE; case NETWORK_TYPE_WIFI: return NETWORK_CLASS_WIFI; case NETWORK_TYPE_GPRS: case NETWORK_TYPE_EDGE: case NETWORK_TYPE_CDMA: case NETWORK_TYPE_1xRTT: case NETWORK_TYPE_IDEN: return NETWORK_CLASS_2_G; case NETWORK_TYPE_UMTS: case NETWORK_TYPE_EVDO_0: case NETWORK_TYPE_EVDO_A: case NETWORK_TYPE_HSDPA: case NETWORK_TYPE_HSUPA: case NETWORK_TYPE_HSPA: case NETWORK_TYPE_EVDO_B: case NETWORK_TYPE_EHRPD: case NETWORK_TYPE_HSPAP: return NETWORK_CLASS_3_G; case NETWORK_TYPE_LTE: return NETWORK_CLASS_4_G; default: return NETWORK_CLASS_UNKNOWN; } }}
新建一个BroadcastReceiver去实时监听网络状态变化
public class NetWorkStatusReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { String operator = NetWorkUtils.getProvider(context); String netType = NetWorkUtils.getCurrentNetworkType(context); Toast.makeText(context, "运营商:"+operator+"\n 网络状态:"+netType, Toast.LENGTH_LONG).show(); } }}
当网络状态发生变化时,就可以实时监听网络状态了。
更多相关文章
- Android(安卓)MediaPlayer 常用方法介绍
- Android使用Retrofit进行网络请求
- AIR Native Extension的使用(Android)一 : 打包ane
- Android中判断网络功能是否可用
- Android的网络状态判断
- TabHost页卡
- Android(安卓)7.0 https/tls证书配置问题
- Android(安卓)MediaPlayer 常用方法介绍
- Android电量和插拔电源状态广播监听