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

我的应用将以直播video流为特色。 我想知道是否有办法检测用户的设备上是否有2G,3G或4G,以及当前连接属于哪个类别? 我的问题是关于Android设备。

我不知道如何查询设备的硬件function(存在哪些无线电),但如果您询问如何检测当前types的蜂窝数据连接,请查看TelephonyManager.getNetworkType() ,其中“返回一个常量,指示当前在设备上用于数据传输的无线电技术(网络types)“。

我会考虑值NETWORK_TYPE_LTENETWORK_TYPE_HSPAP来指示4G连接。 由于3G和4G之间的界限很模糊,并且由于旧技术的集合得到了有效的修复(我们没有发明新的2G网络),更好的策略可能是识别不够的网络技术并在连接时显示警告正在使用已知的慢速技术(例如,EDGE)。

还要记住,仅网络技术并不一定等同于某种连接速度。 即使4G连接也可以以不足以进行video流的速度运行,具体取决于许多因素,其中一些因素是设备外部的(天气,信号强度,设备电池电量,蜂窝塔可用带宽等)

其他警告:

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

  • 您还应检查ConnectivityManager.isActiveNetworkMetered()以获取有关当前网络连接是否具有数据限制的提示。 如果是这样,您应该在执行数据密集型操作之前警告用户,而不管连接types如何。

这是类的要点 ,所以你可以分叉并编辑它。

 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中

  

对于所有小于或等于100kbps的速度,网络被认为是2G。

对于所有大于100kbps且小于1mbps的速度,该网络被认为是3G。

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

网络速度的来源包括维基百科http://en.wikipedia.org/wiki/Comparison_of_wireless_data_standards