我的应用程序上有一个显示网络类型(2G、3G或4G)的指示器,但获取网络类型后,我如何知道它应该属于什么速度类别?
我知道如何检测网络类型:
private TelephonyManager telephonyManager;
telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
CurrentNetworkType = telephonyManager.getNetworkType();
给定可能的返回值:
// public static final int NETWORK_TYPE_1xRTT
// Since: API Level 4
// Current network is 1xRTT
// Constant Value: 7 (0x00000007)
//
// public static final int NETWORK_TYPE_CDMA
// Since: API Level 4
// Current network is CDMA: Either IS95A or IS95B
// Constant Value: 4 (0x00000004)
//
// public static final int NETWORK_TYPE_EDGE
// Since: API Level 1
// Current network is EDGE
// Constant Value: 2 (0x00000002)
//
// public static final int NETWORK_TYPE_EHRPD
// Since: API Level 11
// Current network is eHRPD
// Constant Value: 14 (0x0000000e)
//
// public static final int NETWORK_TYPE_EVDO_0
// Since: API Level 4
// Current network is EVDO revision 0
// Constant Value: 5 (0x00000005)
//
// public static final int NETWORK_TYPE_EVDO_A
// Since: API Level 4
// Current network is EVDO revision A
// Constant Value: 6 (0x00000006)
//
// public static final int NETWORK_TYPE_EVDO_B
// Since: API Level 9
// Current network is EVDO revision B
// Constant Value: 12 (0x0000000c)
//
// public static final int NETWORK_TYPE_GPRS
// Since: API Level 1
// Current network is GPRS
// Constant Value: 1 (0x00000001)
//
// public static final int NETWORK_TYPE_HSDPA
// Since: API Level 5
// Current network is HSDPA
// Constant Value: 8 (0x00000008)
//
// public static final int NETWORK_TYPE_HSPA
// Since: API Level 5
// Current network is HSPA
// Constant Value: 10 (0x0000000a)
//
// public static final int NETWORK_TYPE_HSPAP
// Since: API Level 13
// Current network is HSPA+
// Constant Value: 15 (0x0000000f)
//
// public static final int NETWORK_TYPE_HSUPA
// Since: API Level 5
// Current network is HSUPA
// Constant Value: 9 (0x00000009)
//
// public static final int NETWORK_TYPE_IDEN
// Since: API Level 8
// Current network is iDen
// Constant Value: 11 (0x0000000b)
//
// public static final int NETWORK_TYPE_LTE
// Since: API Level 11
// Current network is LTE
// Constant Value: 13 (0x0000000d)
//
// public static final int NETWORK_TYPE_UMTS
// Since: API Level 1
// Current network is UMTS
// Constant Value: 3 (0x00000003)
//
// public static final int NETWORK_TYPE_UNKNOWN
// Since: API Level 1
// Network type is unknown
// Constant Value: 0 (0x00000000)
我会认为LTE是4G,但其中哪些才是真正的3G呢?任何其他我会考虑的2G。
那么,3G和非3G之间的界限在哪里呢?
更新:我在https://stackoverflow.com/a/8548926/949577上找到了另一个相关的答案,它使用ConnectivityManager()来获取类型和子类型,然后将子类型分类为快速或不快速。我不知道使用ConnectivityManager()是否比使用TelephonyManager ()更好,因为它们似乎都能够返回网络类型。
我还在http://en.wikipedia.org/wiki/Comparison_of_wireless_data_standards上找到了一个比较无线数据标准的链接。
发布于 2013-06-27 19:21:18
基于安卓开发者文档和维基百科链接,我在这里给出了评论&定义网络type.Check,评论中的链接。
您可以使用getNetworkType
获取网络类型。
public class CommonUtils {
/**
* To get device consuming netowkr type is 2g,3g,4g
*
* @param context
* @return "2g","3g","4g" as a String based on the network type
*/
public static String getNetworkType(Context context) {
TelephonyManager mTelephonyManager = (TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
int networkType = mTelephonyManager.getNetworkType();
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 "2g";
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
/**
From this link https://en.wikipedia.org/wiki/Evolution-Data_Optimized ..NETWORK_TYPE_EVDO_0 & NETWORK_TYPE_EVDO_A
EV-DO is an evolution of the CDMA2000 (IS-2000) standard that supports high data rates.
Where CDMA2000 https://en.wikipedia.org/wiki/CDMA2000 .CDMA2000 is a family of 3G[1] mobile technology standards for sending voice,
data, and signaling data between mobile phones and cell sites.
*/
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:
//Log.d("Type", "3g");
//For 3g HSDPA , HSPAP(HSPA+) are main networktype which are under 3g Network
//But from other constants also it will 3g like HSPA,HSDPA etc which are in 3g case.
//Some cases are added after testing(real) in device with 3g enable data
//and speed also matters to decide 3g network type
//https://en.wikipedia.org/wiki/4G#Data_rate_comparison
return "3g";
case TelephonyManager.NETWORK_TYPE_LTE:
//No specification for the 4g but from wiki
//I found(LTE (Long-Term Evolution, commonly marketed as 4G LTE))
//https://en.wikipedia.org/wiki/LTE_(telecommunication)
return "4g";
default:
return "Notfound";
}
}
/**
* To check device has internet
*
* @param context
* @return boolean as per status
*/
public static boolean isNetworkConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnected();
}
}
发布于 2012-02-15 04:40:21
您可以使用getSubtype()
了解更多详细信息。
int netType = info.getType();
int netSubtype = info.getSubtype();
if (netType == ConnectivityManager.TYPE_WIFI) {
return info.isConnected();
} else if (netType == ConnectivityManager.TYPE_MOBILE
&& netSubtype == TelephonyManager.NETWORK_TYPE_UMTS
&& !mTelephony.isNetworkRoaming()) {
return info.isConnected();
} else {
return false;
}
发布于 2013-12-07 12:59:55
从技术上讲,1xRTT是一种3G技术(尽管许多人认为它仅仅是基于数据速度的2G )。此外,您还需要在switch语句中添加WiMax以返回4G。它不再经常使用,但斯普林特的WiMax网络暂时仍在运行。
https://stackoverflow.com/questions/9283765
复制相似问题