有没有办法检测Android上使用的是哪个蜂窝网络?

有没有办法检测Android上使用的是哪个蜂窝网络?,android,Android,我的应用程序将提供实时视频流。我想知道是否有办法检测用户的设备上是否有2G、3G或4G,以及当前连接是否属于哪一类?我的问题是专门针对Android设备的。我不知道有什么方法可以查询设备的硬件功能(有哪些无线电),但如果你问如何检测当前的蜂窝数据连接类型,请查看,它“返回一个指示无线电技术(网络类型)的常数”目前在设备上用于数据传输” 我会考虑值 NETWorksType,LTE 和 NETWorksYyType HSPAP < /代码>以指示4G连接。由于3G和4G之间的界限模糊,并且由于一组

我的应用程序将提供实时视频流。我想知道是否有办法检测用户的设备上是否有2G、3G或4G,以及当前连接是否属于哪一类?我的问题是专门针对Android设备的。

我不知道有什么方法可以查询设备的硬件功能(有哪些无线电),但如果你问如何检测当前的蜂窝数据连接类型,请查看,它“返回一个指示无线电技术(网络类型)的常数”目前在设备上用于数据传输”

我会考虑值<代码> NETWorksType,LTE 和<代码> NETWorksYyType HSPAP < /代码>以指示4G连接。由于3G和4G之间的界限模糊,并且由于一组旧技术已被有效固定(我们没有发明新的2G网络),更好的策略可能是识别不足的网络技术,并在连接使用已知的慢速技术(例如EDGE)时显示警告

还要记住,网络技术本身并不一定等同于一定的连接速度。甚至4G连接的运行速度也可能不足以进行视频流传输,这取决于许多因素,其中一些因素是设备外部因素(天气、信号强度、设备电池电量、基站可用带宽等)

其他注意事项:

  • 您应该首先检查活动网络连接是否为蜂窝连接。为此,获取并检查该对象的属性。这将指示活动网络是Wi-Fi还是蜂窝网络。请记住,可能没有活动网络(
    null
    将返回)

  • 您还应该检查关于当前网络连接是否有数据限制的提示。如果是这样,则无论连接类型如何,都应在执行数据密集型操作之前警告用户

    • 这是一个,您可以将其分叉并编辑

      package com.emil.android.util;
      
      import android.content.Context;
      import android.net.ConnectivityManager;
      import android.net.NetworkInfo;
      import android.telephony.TelephonyManager;
      
      /**
       * Check device's network connectivity and speed 
       * @author emil http://stackoverflow.com/users/220710/emil
       *
       */
      public class Connectivity {
      
          /**
           * Get the network info
           * @param context
           * @return
           */
          public static NetworkInfo getNetworkInfo(Context context){
              ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
              return cm.getActiveNetworkInfo();
          }
      
          /**
           * Check if there is any connectivity
           * @param context
           * @return
           */
          public static boolean isConnected(Context context){
              NetworkInfo info = Connectivity.getNetworkInfo(context);
              return (info != null && info.isConnected());
          }
      
          /**
           * Check if there is any connectivity to a Wifi network
           * @param context
           * @param type
           * @return
           */
          public static boolean isConnectedWifi(Context context){
              NetworkInfo info = Connectivity.getNetworkInfo(context);
              return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
          }
      
          /**
           * Check if there is any connectivity to a mobile network
           * @param context
           * @param type
           * @return
           */
          public static boolean isConnectedMobile(Context context){
              NetworkInfo info = Connectivity.getNetworkInfo(context);
              return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);
          }
      
          /**
           * Check if there is fast connectivity
           * @param context
           * @return
           */
          public static boolean isConnectedFast(Context context){
              NetworkInfo info = Connectivity.getNetworkInfo(context);
              return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype()));
          }
      
          /**
           * Check if the connection is fast
           * @param type
           * @param subType
           * @return
           */
          public static boolean isConnectionFast(int type, int subType){
              if(type==ConnectivityManager.TYPE_WIFI){
                  return true;
              }else if(type==ConnectivityManager.TYPE_MOBILE){
                  switch(subType){
                  case TelephonyManager.NETWORK_TYPE_1xRTT:
                      return false; // ~ 50-100 kbps
                  case TelephonyManager.NETWORK_TYPE_CDMA:
                      return false; // ~ 14-64 kbps
                  case TelephonyManager.NETWORK_TYPE_EDGE:
                      return false; // ~ 50-100 kbps
                  case TelephonyManager.NETWORK_TYPE_EVDO_0:
                      return true; // ~ 400-1000 kbps
                  case TelephonyManager.NETWORK_TYPE_EVDO_A:
                      return true; // ~ 600-1400 kbps
                  case TelephonyManager.NETWORK_TYPE_GPRS:
                      return false; // ~ 100 kbps
                  case TelephonyManager.NETWORK_TYPE_HSDPA:
                      return true; // ~ 2-14 Mbps
                  case TelephonyManager.NETWORK_TYPE_HSPA:
                      return true; // ~ 700-1700 kbps
                  case TelephonyManager.NETWORK_TYPE_HSUPA:
                      return true; // ~ 1-23 Mbps
                  case TelephonyManager.NETWORK_TYPE_UMTS:
                      return true; // ~ 400-7000 kbps
                  /*
                   * Above API level 7, make sure to set android:targetSdkVersion 
                   * to appropriate level to use these
                   */
                  case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11 
                      return true; // ~ 1-2 Mbps
                  case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9
                      return true; // ~ 5 Mbps
                  case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13
                      return true; // ~ 10-20 Mbps
                  case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8
                      return false; // ~25 kbps 
                  case TelephonyManager.NETWORK_TYPE_LTE: // API level 11
                      return true; // ~ 10+ Mbps
                  // Unknown
                  case TelephonyManager.NETWORK_TYPE_UNKNOWN:
                  default:
                      return false;
                  }
              }else{
                  return false;
              }
          }
      
      }
      
      还要确保将此权限添加到您的AndroidManifest.xml中

      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
      
      
      
      对于所有小于或等于100kbps的速度,网络被视为2G。

      对于所有大于100kbps和小于1mbps的速度,网络被视为3G。

      对于所有大于1mbps的速度,网络被视为4G。


      网络速度的来源包括维基百科

      我看到它有很多种类型:网络类型:未知网络类型:GPRS网络类型:边缘网络类型:UMTS网络类型:HSDPA网络类型:HSUPA网络类型:HSPA网络类型:CDMA网络类型:EVDO 0网络类型:EVDO A网络类型:EVDO B网络类型:RTT网络类型:IDEN网络类型:LTE有一个类似的问题得到了重复的回答,答案可以在这里找到:我认为它还没有完全解决,如何使用管理器将其缩小到2G、3G或4G。如果我认为用户使用的是3G,而实际上是2G,这会对我试图创造的体验产生影响。@AndroidDeveloper您必须简要研究各种类型的网络,以确定每种网络的产生和理论最大速度;但是,我建议只确定绝对不适合的网络类型(2G或更早),并将其排除在外。使用这种方法无法有效区分3G和4G连接。我希望获得更多反馈,看看是否有人区分了不同的网络类型并对其速度进行了分类。这将有望为我和其他人节省很多时间。我正在我的应用程序中使用这些代码。我还在网上的某个地方找到了它,我记不得它在哪里了。1xRTT-(50-100kbps)CDMA-(14-64kbps)EDGE-(50-100kbps)EVDO-(400-1000kbps)EVDO_A-(600-1400kps)GPRS-(100kbps)HSDPA-(2-14Mbps)HSPA-(700-1700kbps)HSUPA-(1-23Mbps)UMTS-(400-7000 kbps)EHRPD-(1-2Mbps)EVDO_B-(5 Mbps)HSPAP-(10-20Mbps)IDEN-(25kbps)LTE-(10+Mbps)@kuchi请记住,网络拥塞、数据计划超期和其他因素意味着连接类型不是实际速度的可靠指标。这门课太棒了。我发现它对我很有用。我希望我能接受它作为答案。+15000Ultimate class,这是非常有用的Bravo,这是我见过的最好的一门课。+1可能值得一提的是编写了clas当你的答案写下来的时候,看起来就像是你写的。