有什么方法可以识别 Android 中使用的数据类型 (2G/3G)?
Any way to identify the data type being used (2G/3G) in Android?
我需要阻止 Android 应用程序在使用 2G 网络连接时向服务器同步数据,并在使用 3G/4G 或 WiFi 连接时允许它,data/WiFi 标识很简单,但是我怎么知道 phone 当前使用的是 2G 模式还是 3G/4G 模式?
使用TelephonyManager可以实时识别SIM卡模式,但不能识别实际使用的数据载体,因为Android为2G分配E
图标,H
,H+
对于 3G 那么必须有一种方法来识别这一点。有什么想法吗?
是的,有。
在 TelephonyManager
you have some constants like TelephonyManager.NETWORK_TYPE_EDGE
to check that. Use those constants along with the methods getType()
and getSubtype()
from NetworkInfo
。
编辑: 我当时很蠢。您只需调用 NetworkInfo.getSubtypeName
就可以了。
NetworkInfo info = Connectivity.getNetworkInfo(context);
Log.d("tag","Network type: " + info.getSubtypeName());
或者您也可以尝试其他解决方案。
旧的解决方案
试试这样的:
NetworkInfo info = Connectivity.getNetworkInfo(context);
getConnectionType(info.getType(),info.getSubtype());
并调用这个函数:
private String getConnectionType(int type, int subType) {
if(type==ConnectivityManager.TYPE_WIFI){
return "WiFi";
}
else if(type==ConnectivityManager.TYPE_MOBILE){
switch(subType){
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_CDMA:
return "1G"; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_GPRS:
return "2G"; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_UMTS:
return "3G"; // ~ 2-14 Mbps
case TelephonyManager.NETWORK_TYPE_LTE: // API level 11
return "4G"; // ~ 10+ Mbps
// Unknown
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
return "Not defined";
}
}
else{
return "Not defined";
}
}
当然,上面的方法只是一个建议,展示它是如何工作的,你可以根据自己的目的改变它,让它更完整,改变return
类型等
我需要阻止 Android 应用程序在使用 2G 网络连接时向服务器同步数据,并在使用 3G/4G 或 WiFi 连接时允许它,data/WiFi 标识很简单,但是我怎么知道 phone 当前使用的是 2G 模式还是 3G/4G 模式?
使用TelephonyManager可以实时识别SIM卡模式,但不能识别实际使用的数据载体,因为Android为2G分配E
图标,H
,H+
对于 3G 那么必须有一种方法来识别这一点。有什么想法吗?
是的,有。
在 TelephonyManager
you have some constants like TelephonyManager.NETWORK_TYPE_EDGE
to check that. Use those constants along with the methods getType()
and getSubtype()
from NetworkInfo
。
编辑: 我当时很蠢。您只需调用 NetworkInfo.getSubtypeName
就可以了。
NetworkInfo info = Connectivity.getNetworkInfo(context);
Log.d("tag","Network type: " + info.getSubtypeName());
或者您也可以尝试其他解决方案。
旧的解决方案
试试这样的:
NetworkInfo info = Connectivity.getNetworkInfo(context);
getConnectionType(info.getType(),info.getSubtype());
并调用这个函数:
private String getConnectionType(int type, int subType) {
if(type==ConnectivityManager.TYPE_WIFI){
return "WiFi";
}
else if(type==ConnectivityManager.TYPE_MOBILE){
switch(subType){
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_CDMA:
return "1G"; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_GPRS:
return "2G"; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_UMTS:
return "3G"; // ~ 2-14 Mbps
case TelephonyManager.NETWORK_TYPE_LTE: // API level 11
return "4G"; // ~ 10+ Mbps
// Unknown
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
return "Not defined";
}
}
else{
return "Not defined";
}
}
当然,上面的方法只是一个建议,展示它是如何工作的,你可以根据自己的目的改变它,让它更完整,改变return
类型等