有什么方法可以识别 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类型等