有什么方法可以识别Android中正在使用的数据类型(2G / 3G)?

时间:2015-10-01 19:44:01

标签: android

我需要阻止Android应用程序在使用2G网络连接时将数据同步到服务器,并在使用3G / 4G或WiFi连接时允许它,数据/ WiFi识别很容易,但我怎么知道手机目前正在使用2G模式还是3G / 4G模式?

使用TelephonyManager可以识别SIM模式,但不能识别实时使用的实际数据载体,因为Android会为2G和E分配H图标,H+对于3G,必须有一种方法来识别这一点。有什么想法吗?

1 个答案:

答案 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类型等。