Вернуть ВСЕ доступные IP-адреса для устройства Android?

У меня есть необходимость перечислить все доступные IP-адреса для любого конкретного устройства Android.

Я нашел пример кода, но это приводит только к возвращению одного IP-адреса, который является IPv6-адресом. Мне нужно получить все доступные IP-адреса для любого конкретного устройства. Я делаю то же самое на iOS-версии этого приложения, и оно возвращает 3 адреса IPv6, один 192. адрес и один 10. адрес. Я пытаюсь повторить то же самое на Android. Я передаю все значения в массив и отображаю их в списке.

Код, который я на месте:

public String getLocalIpAddress()
{
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    IPAddresses.setText(inetAddress.getHostAddress().toString());
                    return inetAddress.getHostAddress().toString();
                }
            }
         }
    } catch (SocketException ex) {
        String LOG_TAG = null;
        Log.e(LOG_TAG, ex.toString());
    }

    return null;
}

1 ответ

Решение

Мне кажется, твой код просто возвращает первое совпадение - это не проблема? Я бы ожидал, что вы создадите список адресов и вернете его вместо одной строки. Что-то вроде этого:

public String[] getLocalIpAddress()
{          
    ArrayList<String> addresses = new ArrayList<String>();
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    IPAddresses.setText(inetAddress.getHostAddress().toString());
                    addresses.add(inetAddress.getHostAddress().toString());
                }
             }
         }
     } catch (SocketException ex) {
         String LOG_TAG = null;
         Log.e(LOG_TAG, ex.toString());
     }
     return addresses.toArray(new String[0]);
}

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

Другие вопросы по тегам