首页 > 系统 > Android > 正文

Android判断用户2G/3G/4G移动数据网络

2020-04-11 11:08:18
字体:
来源:转载
供稿:网友

在做 Android App 的时候,为了给用户省流量,为了不激起用户的愤怒,为了更好的用户体验,是需要根据用户当前网络情况来做一些调整的,也可以在 App 的设置模块里,让用户自己选择,在 2G / 3G / 4G 网络条件下,是否允许请求一些流量比较大的数据。

通过 Android 提供的 TelephonyManager 和 ConnectivityManager 都可以获取到 NetworksInfo 对象,可以通过 getType() 获取类型,判断是 wifi 还是 mobile ,如果是 mobile ,可以通过 NetworksInfo 对象的 getSubType() 和 getSubTypeName() 可以获取到对于的网络类型和名字。

网络类型和名字定义在 TelephonyManager 类里。

/** 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;

看到这个代码和注释,相信没有这方面知识的人很难看懂,都啥玩意?这注释跟没注释有啥区别?!就是让人看着更加闹心而已。所以说,注释对阅读代码的人很重 要。当然这些东西可能太专业了,写这些代码的人估计是想写也不知道该怎么了,得写多大一坨啊?!我在最后会贴上一些我整理的资料,可以供大家参考一下,不 是很详细,也不专业,就是大概有个印象。

TelephonyManager 还提供了 getNetworkTypeName(int type) 的方法,这个方法可以返回一个字符串,但是信息量不大。

那怎么判断是 2G , 3G 还是 4G 网络呢?TelephonyManager 还提供了另外一个方法,getNetworkClass(int networkType) ,但这个方法被隐藏掉了,我把代码贴一下。

public static int getNetworkClass(int networkType) { switch (networkType) { 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; } } 

然后下面是这几个常量的值。

/** Unknown network class. {@hide} */ public static final int NETWORK_CLASS_UNKNOWN = 0; /** Class of broadly defined "2G" networks. {@hide} */ public static final int NETWORK_CLASS_2_G = 1; /** Class of broadly defined "3G" networks. {@hide} */ public static final int NETWORK_CLASS_3_G = 2; /** Class of broadly defined "4G" networks. {@hide} */ public static final int NETWORK_CLASS_4_G = 3; 

不知道为啥要把这些东西给隐藏起来,不靠谱?还是其他的更好的方式?!不知道,先这样吧,现在通过上面的手段,是可以知道用户用的是什么网络,当 然也可以区分出来用户使用的是 2G , 3G 还是 4G 了。当然,你获取到这些数据后,你也可以推算出用户用的是哪家公司的网络,移动的,联通的,还是电信的,当然,只在中国。而且虚拟运营商开始真正上市后, 这个就区分不出来是京东的,还是国美,苏宁的了,但是你可以知道你的手机号用的是联通的网还是移动的网。

最后贴上我收集整理的一些资料,可以参考一下。

  • GPRS       2G(2.5) General Packet Radia Service 114kbps
  • EDGE       2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps
  • UMTS      3G WCDMA 联通3G Universal Mobile Telecommunication System 完整的3G移动通信技术标准
  • CDMA     2G 电信 Code Division Multiple Access 码分多址
  • EVDO_0   3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution - Data Only (Data Optimized) 153.6kps - 2.4mbps 属于3G
  • EVDO_A  3G 1.8mbps - 3.1mbps 属于3G过渡,3.5G
  • 1xRTT      2G CDMA2000 1xRTT (RTT - 无线电传输技术) 144kbps 2G的过渡,
  • HSDPA    3.5G 高速下行分组接入 3.5G WCDMA High Speed Downlink Packet Access 14.4mbps
  • HSUPA    3.5G High Speed Uplink Packet Access 高速上行链路分组接入 1.4 - 5.8 mbps
  • HSPA      3G (分HSDPA,HSUPA) High Speed Packet Access
  • IDEN      2G Integrated Dispatch Enhanced Networks 集成数字增强型网络 (属于2G,来自维基百科)
  • EVDO_B 3G EV-DO Rev.B 14.7Mbps 下行 3.5G
  • LTE        4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G过渡,升级版 LTE Advanced 才是4G
  • EHRPD  3G CDMA2000向LTE 4G的中间产物 Evolved High Rate Packet Data HRPD的升级
  • HSPAP  3G HSPAP 比 HSDPA 快些

实例:

import java.io.BufferedReader; import java.io.InputStreamReader; import java.text.DecimalFormat; import java.util.List;   import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.telephony.NeighboringCellInfo; import android.telephony.TelephonyManager; import android.telephony.cdma.CdmaCellLocation; import android.telephony.gsm.GsmCellLocation; import android.util.Log;   public class NetWorkUtil {     public static boolean isWifiAvailable() {     ConnectivityManager connectivityManager = (ConnectivityManager) ConfigManager         .getContext().getSystemService(Context.CONNECTIVITY_SERVICE);     NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();     return (networkInfo != null && networkInfo.isConnected() && networkInfo         .getType() == ConnectivityManager.TYPE_WIFI);   }     /**    * 获取MAC地址    *    * @param context    * @return    */   public static String getMacAddress(Context context) {     if (context == null) {       return "";     }       String localMac = null;     if (isWifiAvailable()) {       localMac = getWifiMacAddress(context);     }       if (localMac != null && localMac.length() > 0) {       localMac = localMac.replace(":", "-").toLowerCase();       return localMac;     }       localMac = getMacFromCallCmd();     if (localMac != null) {       localMac = localMac.replace(":", "-").toLowerCase();     }       return localMac;   }     private static String getWifiMacAddress(Context context) {     String localMac = null;     try {       WifiManager wifi = (WifiManager) context           .getSystemService(Context.WIFI_SERVICE);       WifiInfo info = wifi.getConnectionInfo();       if (wifi.isWifiEnabled()) {         localMac = info.getMacAddress();         if (localMac != null) {           localMac = localMac.replace(":", "-").toLowerCase();           return localMac;         }       }       } catch (Exception e) {       e.printStackTrace();     }       return null;   }     /**    * 通过callCmd("busybox ifconfig","HWaddr")获取mac地址    *    * @attention 需要设备装有busybox工具    * @return Mac Address    */   private static String getMacFromCallCmd() {     String result = "";     result = callCmd("busybox ifconfig", "HWaddr");       if (result == null || result.length() <= 0) {       return null;     }       DebugLog.v("tag", "cmd result : " + result);       // 对该行数据进行解析     // 例如:eth0 Link encap:Ethernet HWaddr 00:16:E8:3E:DF:67     if (result.length() > 0 && result.contains("HWaddr") == true) {       String Mac = result.substring(result.indexOf("HWaddr") + 6,           result.length() - 1);       if (Mac.length() > 1) {         result = Mac.replaceAll(" ", "");       }     }       return result;   }     public static String callCmd(String cmd, String filter) {     String result = "";     String line = "";     try {       Process proc = Runtime.getRuntime().exec(cmd);       InputStreamReader is = new InputStreamReader(proc.getInputStream());       BufferedReader br = new BufferedReader(is);         // 执行命令cmd,只取结果中含有filter的这一行       while ((line = br.readLine()) != null           && line.contains(filter) == false) {       }         result = line;     } catch (Exception e) {       e.printStackTrace();     }     return result;   }     /**    * 网络是否可用    *    * @param context    * @return    */   public static boolean IsNetWorkEnable(Context context) {     try {       ConnectivityManager connectivity = (ConnectivityManager) context           .getSystemService(Context.CONNECTIVITY_SERVICE);       if (connectivity == null) {         ToastUtil.showMessage(context, "无法连接网络");         return false;       }         NetworkInfo info = connectivity.getActiveNetworkInfo();       if (info != null && info.isConnected()) {         // 判断当前网络是否已经连接         if (info.getState() == NetworkInfo.State.CONNECTED) {           return true;         }       }       } catch (Exception e) {       e.printStackTrace();     }     ToastUtil.showMessage(context, "无法连接网络");     return false;   }     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;     private static DecimalFormat df = new DecimalFormat("#.##");     // 适配低版本手机   /** 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;     /**    * 格式化大小    *    * @param size    * @return    */   public static String formatSize(long size) {     String unit = "B";     float len = size;     if (len > 900) {       len /= 1024f;       unit = "KB";     }     if (len > 900) {       len /= 1024f;       unit = "MB";     }     if (len > 900) {       len /= 1024f;       unit = "GB";     }     if (len > 900) {       len /= 1024f;       unit = "TB";     }     return df.format(len) + unit;   }     public static String formatSizeBySecond(long size) {     String unit = "B";     float len = size;     if (len > 900) {       len /= 1024f;       unit = "KB";     }     if (len > 900) {       len /= 1024f;       unit = "MB";     }     if (len > 900) {       len /= 1024f;       unit = "GB";     }     if (len > 900) {       len /= 1024f;       unit = "TB";     }     return df.format(len) + unit + "/s";   }     public static String format(long size) {     String unit = "B";     float len = size;     if (len > 1000) {       len /= 1024f;       unit = "KB";       if (len > 1000) {         len /= 1024f;         unit = "MB";         if (len > 1000) {           len /= 1024f;           unit = "GB";         }       }     }     return df.format(len) + "/n" + unit + "/s";   }     /**    * 获取运营商    *    * @return    */   public static String getProvider() {     String provider = "未知";     try {       TelephonyManager telephonyManager = (TelephonyManager) ConfigManager           .getContext().getSystemService(Context.TELEPHONY_SERVICE);       String IMSI = telephonyManager.getSubscriberId();       Log.v("tag", "getProvider.IMSI:" + IMSI);       if (IMSI == null) {         if (TelephonyManager.SIM_STATE_READY == telephonyManager             .getSimState()) {           String operator = telephonyManager.getSimOperator();           Log.v("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();     }     return provider;   }     /**    * 获取网络类型    *    * @return    */   public static String getCurrentNetworkType() {     int networkClass = getNetworkClass();     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 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;     }   }     private static int getNetworkClass() {     int networkType = NETWORK_TYPE_UNKNOWN;     try {       final NetworkInfo network = ((ConnectivityManager) ConfigManager           .getContext()           .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) ConfigManager               .getContext().getSystemService(                   Context.TELEPHONY_SERVICE);           networkType = telephonyManager.getNetworkType();         }       } else {         networkType = NETWORK_TYPE_UNAVAILABLE;       }       } catch (Exception ex) {       ex.printStackTrace();     }     return getNetworkClassByType(networkType);     }     public static String getWifiRssi() {     int asu = 85;     try {       final NetworkInfo network = ((ConnectivityManager) ConfigManager           .getContext()           .getSystemService(Context.CONNECTIVITY_SERVICE))           .getActiveNetworkInfo();       if (network != null && network.isAvailable()           && network.isConnected()) {         int type = network.getType();         if (type == ConnectivityManager.TYPE_WIFI) {           WifiManager wifiManager = (WifiManager) ConfigManager               .getContext()               .getSystemService(Context.WIFI_SERVICE);             WifiInfo wifiInfo = wifiManager.getConnectionInfo();           if (wifiInfo != null) {             asu = wifiInfo.getRssi();           }         }       }     } catch (Exception e) {       e.printStackTrace();     }     return asu + "dBm";   }     public static String getWifiSsid() {     String ssid = "";     try {       final NetworkInfo network = ((ConnectivityManager) ConfigManager           .getContext()           .getSystemService(Context.CONNECTIVITY_SERVICE))           .getActiveNetworkInfo();       if (network != null && network.isAvailable()           && network.isConnected()) {         int type = network.getType();         if (type == ConnectivityManager.TYPE_WIFI) {           WifiManager wifiManager = (WifiManager) ConfigManager               .getContext()               .getSystemService(Context.WIFI_SERVICE);             WifiInfo wifiInfo = wifiManager.getConnectionInfo();           if (wifiInfo != null) {             ssid = wifiInfo.getSSID();             if (ssid == null) {               ssid = "";             }             ssid = ssid.replaceAll("/"", "");           }         }       }     } catch (Exception e) {       e.printStackTrace();     }     return ssid;   }     /**    * 检查sim卡状态    *    * @param ctx    * @return    */   public static boolean checkSimState() {     TelephonyManager tm = (TelephonyManager) ConfigManager.getContext()         .getSystemService(Context.TELEPHONY_SERVICE);     if (tm.getSimState() == TelephonyManager.SIM_STATE_ABSENT         || tm.getSimState() == TelephonyManager.SIM_STATE_UNKNOWN) {       return false;     }       return true;   }     /**    * 获取imei    */   public static String getImei() {     TelephonyManager mTelephonyMgr = (TelephonyManager) ConfigManager         .getContext().getSystemService(Context.TELEPHONY_SERVICE);     String imei = mTelephonyMgr.getDeviceId();     if (imei == null) {       imei = "000000000000000";     }     return imei;   }     public static String getPhoneImsi() {     TelephonyManager mTelephonyMgr = (TelephonyManager) ConfigManager         .getContext().getSystemService(Context.TELEPHONY_SERVICE);     return mTelephonyMgr.getSubscriberId();   }     public static CellInfo getNetInfo() {     CellInfo info = new CellInfo();     try {       TelephonyManager mTelephonyManager = (TelephonyManager) ConfigManager           .getContext().getSystemService(Context.TELEPHONY_SERVICE);       String operator = mTelephonyManager.getNetworkOperator();       if (operator != null) {         /** 通过operator获取 MCC 和MNC */         if (operator.length() > 3) {           String mcc = operator.substring(0, 3);           String mnc = operator.substring(3);           info.setMcc(mcc);           info.setMnc(mnc);         }       }         int lac = 0;       int cellId = 0;       int phoneType = mTelephonyManager.getPhoneType();       if (phoneType == TelephonyManager.PHONE_TYPE_GSM) {         GsmCellLocation location = (GsmCellLocation) mTelephonyManager             .getCellLocation();         /** 通过GsmCellLocation获取中国移动和联通 LAC 和cellID */         lac = location.getLac();         cellId = location.getCid();       } else if (phoneType == TelephonyManager.PHONE_TYPE_CDMA) {         CdmaCellLocation location = (CdmaCellLocation) mTelephonyManager             .getCellLocation();         lac = location.getNetworkId();         cellId = location.getBaseStationId();         cellId /= 16;       }       if (lac == 0 || cellId == 0) {         List<NeighboringCellInfo> infos = mTelephonyManager             .getNeighboringCellInfo();         int lc = 0;         int ci = 0;         int rssi = 0;         for (NeighboringCellInfo cell : infos) {           // 根据邻区总数进行循环           if (lc == 0 || ci == 0) {             lc = cell.getLac();             ci = cell.getCid();             rssi = cell.getRssi();           }           // sb.append(" LAC : " + info.getLac());           // // 取出当前邻区的LAC           // sb.append(" CID : " + info.getCid());           // // 取出当前邻区的CID           // sb.append(" BSSS : " + (-113 + 2 * info.getRssi()) +           // "/n"); // 获取邻区基站信号强度         }         rssi = -113 + 2 * rssi;       }     } catch (Exception e) {       e.printStackTrace();     }     return info;   }   }

希望本文所述对大家学习Android软件编程有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表