我需要阻止Android应用程序在使用2G网络连接时将数据同步到服务器,并在使用3G / 4G或WiFi连接时允许它,数据/ WiFi识别很容易,但我怎么知道手机目前正在使用2G模式还是3G / 4G模式?
使用TelephonyManager可以识别SIM模式,但不能识别实时使用的实际数据载体,因为Android会为2G和E
分配H
图标,H+
对于3G,必须有一种方法来识别这一点。有什么想法吗?
答案 0 :(得分:1)
是的,有。
在TelephonyManager
上,您有一些常量,例如TelephonyManager.NETWORK_TYPE_EDGE
来检查。{3}}将这些常量与NetworkInfo
中的方法getType()
和getSubtype()
一起使用。
编辑:我当时很蠢。您只需致电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
类型等。