在Android中如何确定哪个网络接口是Wifi、3G、4G(LTE)和VPN?

4
在安卓中,我通过以下代码找到了与网络接口相关联的接口名称和IP地址。
// Iterate over all network interfaces.
for (Enumeration<NetworkInterface> en = 
    NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)
    {
        NetworkInterface intf = en.nextElement();
        // Iterate over all IP addresses in each network interface.
        for (Enumeration<InetAddress> enumIPAddr = 
            intf.getInetAddresses(); enumIPAddr.hasMoreElements();)
        {
            InetAddress iNetAddress = enumIPAddr.nextElement();
            // Loop back address (127.0.0.1) doesn't count as an in-use IP address.
            if (!iNetAddress.isLoopbackAddress())
            {
                sLocalIP = iNetAddress.getHostAddress().toString();
                sInterfaceName = intf.getName();
            }
        }
    }

由于网络接口名称可能因制造商而异,同一制造商的不同设备之间也可能存在差异。

在安卓系统中如何确定哪个网络接口用于wifi、3G、4G(LTE)和VPN?


请查看Android中的ConnectivityManager.java文件,其中指定了连接类型,请与这些内容进行比较。http://developer.android.com/reference/android/net/ConnectivityManager.html - android_dev
ConnectivityManager 不提供任何有关网络接口的信息。 - Priyank Patel
1个回答

4
使用这些方法,您可以确定是否是Wifi或移动连接:
private static boolean isConnectedWifi(Context context) {
        NetworkInfo info = ConnectionUtil.getNetworkInfo(context);
        return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
    }

private static boolean isConnectedMobile(Context context) {
        NetworkInfo info = ConnectionUtil.getNetworkInfo(context);
        return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);
}

如果是移动连接,您可以使用 info.getSubType() 方法获取更多信息。 使用此方法:

 private static String getConnectionType(int type, int subType) {
        if (type == ConnectivityManager.TYPE_WIFI) {
            return "TYPE_WIFI";
        } else if (type == ConnectivityManager.TYPE_MOBILE) {
            switch (subType) {
                case TelephonyManager.NETWORK_TYPE_UNKNOWN:
                    return "TYPE_UNKNOWN";
                case TelephonyManager.NETWORK_TYPE_1xRTT:
                    return "TYPE_1XRTT"; // ~ 50-100 kbps
                case TelephonyManager.NETWORK_TYPE_CDMA:
                    return "TYPE_CDMA"; // ~ 14-64 kbps
                case TelephonyManager.NETWORK_TYPE_EDGE:
                    return "TYPE_EDGE"; // ~ 50-100 kbps
                case TelephonyManager.NETWORK_TYPE_EVDO_0:
                    return "TYPE_EVDO_0"; // ~ 400-1000 kbps
                case TelephonyManager.NETWORK_TYPE_EVDO_A:
                    return "TYPE_EVDO_A"; // ~ 600-1400 kbps
                case TelephonyManager.NETWORK_TYPE_GPRS:
                    return "TYPE_GPRS"; // ~ 100 kbps
                case TelephonyManager.NETWORK_TYPE_HSDPA:
                    return "TYPE_HSDPA"; // ~ 2-14 Mbps
                case TelephonyManager.NETWORK_TYPE_HSPA:
                    return "TYPE_HSPA"; // ~ 700-1700 kbps
                case TelephonyManager.NETWORK_TYPE_HSUPA:
                    return "TYPE_HSUPA"; // ~ 1-23 Mbps
                case TelephonyManager.NETWORK_TYPE_UMTS:
                    return "TYPE_UMTS"; // ~ 400-7000 kbps
                case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8
                    return "TYPE_IDEN"; // ~25 kbps


                // Unknown
                default:
                    return "TYPE_UNKNOWN";
            }
        } else {
            return "TYPE UNKNOWN";
        }
    }

希望这能对你有所帮助 :)

如果wifi和LTE都开启,那么两个连接和IP会同时存在,该怎么办? - Priyank Patel
我认为同时拥有两个活动连接是不可能的。 - Alejandro Martínez Martínez
如果您的设备同时开启了WiFi和LTE数据,则会同时拥有两个IP地址。 - Priyank Patel
有趣。但是,你能同时连接两个吗? - Alejandro Martínez Martínez
我不知道,但是当我使用问题中提供的代码搜索设备的网络接口时,它会返回两个接口和可用的IP地址...但我该如何确定哪个IP地址是Wifi的,哪个IP地址是LTE的? - Priyank Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接