我的应用程序上有一个显示网络类型(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无线数据标准的链接。
答案 0 :(得分:102)
您可以将以下方法直接放在Utility类中:
public String getNetworkClass(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:
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:
return "3G";
case TelephonyManager.NETWORK_TYPE_LTE:
return "4G";
default:
return "Unknown";
}
}
感谢Android源代码的帮助。 =]
答案 1 :(得分:73)
基于Android Developer文档&维基百科链接在这里我给出了评论&定义网络类型。检查评论中的链接。
您可以使用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();
}
}
答案 2 :(得分:9)
您可以使用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;
}
答案 3 :(得分:3)
从技术上讲,1xRTT是一项3G技术(尽管很多人认为2G仅基于数据速度)。此外,您还需要在switch语句中添加WiMax以返回4G。它不再常用,但Sprint的WiMax网络暂时仍在运行。
答案 4 :(得分:1)
我认为你真的必须硬编码你希望他们拥有的等价值。大多数这些技术的快速搜索应该给你一些关于哪个被认为是3G或4G的想法(虽然从技术上讲,它们都不是真正的4G)。由于HSPA和HSPA +之间似乎没有区别,您可能希望运行某种速度或延迟检查,并以这种方式使用它。
答案 5 :(得分:0)
在Kotlin中具有 5G 支持的API 29 / Android Q更新版本:
enum class Generation {
`2G`,
`3G`,
`4G`,
`5G`
}
fun getNetworkGeneration(context: Context): Generation? {
val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
return when (telephonyManager.networkType) {
TelephonyManager.NETWORK_TYPE_UNKNOWN -> null
TelephonyManager.NETWORK_TYPE_GPRS,
TelephonyManager.NETWORK_TYPE_EDGE,
TelephonyManager.NETWORK_TYPE_CDMA,
TelephonyManager.NETWORK_TYPE_1xRTT,
TelephonyManager.NETWORK_TYPE_IDEN,
TelephonyManager.NETWORK_TYPE_GSM -> Generation.`2G`
TelephonyManager.NETWORK_TYPE_UMTS,
TelephonyManager.NETWORK_TYPE_EVDO_0,
TelephonyManager.NETWORK_TYPE_EVDO_A,
TelephonyManager.NETWORK_TYPE_HSDPA,
TelephonyManager.NETWORK_TYPE_HSUPA,
TelephonyManager.NETWORK_TYPE_HSPA,
TelephonyManager.NETWORK_TYPE_EVDO_B,
TelephonyManager.NETWORK_TYPE_EHRPD,
TelephonyManager.NETWORK_TYPE_HSPAP,
TelephonyManager.NETWORK_TYPE_TD_SCDMA -> Generation.`3G`
TelephonyManager.NETWORK_TYPE_LTE,
TelephonyManager.NETWORK_TYPE_IWLAN -> Generation.`4G`
TelephonyManager.NETWORK_TYPE_NR -> Generation.`5G`
else -> null
}
}
在活动中像这样使用它:
val generation = getNetworkGeneration(this)
when (generation) {
Generation.`2G` -> TODO()
Generation.`3G` -> TODO()
Generation.`4G` -> TODO()
Generation.`5G` -> TODO()
null -> TODO()
}