Как определить, какой сетевой интерфейс предназначен для Wi-Fi, 3G, 4G (LTE) и VPN в Android?

В Android я нашел имена сетевых интерфейсов и 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();
            }
        }
    }

Из-за того, что имя сетевого интерфейса может отличаться от производителя к производителю, а также может различаться в разных устройствах одного производителя.

Как определить, какой сетевой интерфейс предназначен для Wi-Fi, 3G, 4G (LTE) и VPN в Android?


person Priyank Patel    schedule 09.07.2014    source источник
comment
Пожалуйста, взгляните на ConnectivityManager.java в Android, где он указал тип соединений, пожалуйста, сравните с этими вещами. developer.android.com/reference/android/net/   -  person android_dev    schedule 09.07.2014
comment
ConnectivityManager не предоставляет никакой информации о сетевом интерфейсе.   -  person Priyank Patel    schedule 09.07.2014


Ответы (1)


С помощью этих методов вы можете определить, является ли это Wi-Fi или мобильным соединением:

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";
        }
    }

Надеюсь, это поможет вам :)

person Alejandro Martínez Martínez    schedule 09.07.2014
comment
Что делать, если Wi-Fi и LTE включены, в этом случае одновременно существуют два соединения и IP? - person Priyank Patel; 09.07.2014
comment
Я думаю, что невозможно иметь два активных соединения одновременно. - person Alejandro Martínez Martínez; 09.07.2014
comment
Если на вашем устройстве есть данные Wi-Fi и LTE, то оно содержит два IP-адреса одновременно. - person Priyank Patel; 09.07.2014
comment
интересно. Но можно ли подключиться к обоим одновременно? - person Alejandro Martínez Martínez; 09.07.2014
comment
Этого я не знаю, но когда я ищу сетевые интерфейсы устройства, используя мой код, указанный в вопросе, он дает два доступных интерфейса и IP-адреса ... но как я могу определить, какой IP-адрес предназначен для Wi-Fi и какой IP-адрес для ЛТЕ? - person Priyank Patel; 09.07.2014