Получить мой Wi-Fi IP-адрес Android

Как я могу получить IP-адрес моего телефона, когда он подключен по Wi-Fi?

Я нашел методВот но он возвращает что-то вроде 24.182.239.255, даже если ям под Wi-Fi, и я ожидаю что-то вроде 192.168.1.10.I '

мне нравится что-то вроде:

if (you are under wifi)
    String ip4 = getWifiIP()
else
    String ip4 = getIPAddress with the method linked before

Большое спасибо!

 Siddharth N24 мая 2013 г., 10:37
Вы, кажется, ожидаете частный IP. Это поможет.stackoverflow.com/questions/6064510/...

Ответы на вопрос(9)

Так что нужно учитывать, чтоFormatter.formatIpAddress (целое) осуждается:

Этот метод устарел на уровне API 12. Используйте getHostAddress (), который поддерживает адреса IPv4 и IPv6. Этот метод не поддерживает адреса IPv6.

Итак, используяformatIpAddress(int) скорее всего, не является хорошим долгосрочным решением, хотя оно будет работать.

Вот потенциальное решение, если вы хотите получить IP-адрес для интерфейса WiFi:

protected String wifiIpAddress(Context context) {
    WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
    int ipAddress = wifiManager.getConnectionInfo().getIpAddress();

    // Convert little-endian to big-endianif needed
    if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
        ipAddress = Integer.reverseBytes(ipAddress);
    }

    byte[] ipByteArray = BigInteger.valueOf(ipAddress).toByteArray();

    String ipAddressString;
    try {
        ipAddressString = InetAddress.getByAddress(ipByteArray).getHostAddress();
    } catch (UnknownHostException ex) {
        Log.e("WIFIIP", "Unable to get host address.");
        ipAddressString = null;
    }

    return ipAddressString;
}

Как указано в предыдущих ответах, вам необходимо установить следующее вAndroidManifest.xml:


Обратите внимание, что это только пример решения. Вам нужно потратить время, чтобы проверить нулевые значения и так далее, чтобы убедиться, что UX является гладким.

Ирония заключается в том, что с одной стороны Google осуждаетformatIpAddress(int), но все еще имеетgetIpAddress () по-прежнему возвращает целочисленное значение. IP-адрес, являющийся int, также исключает его совместимость с IPv6.

Следующим является тот факт, что порядковый номер может быть или не быть проблемой. Я протестировал только три устройства, и все они были с прямым порядком байтов. Кажется, что порядковый номер может варьироваться в зависимости от аппаратного обеспечения, даже если мы работаем на виртуальных машинах, это все еще может быть проблемой. Поэтому, чтобы быть в безопасности, я добавил в код проверку порядка байтов.

getByAddress (байт []) по-видимому, хочет, чтобы целочисленное значение было прямым порядком байтов. Из исследования этого выясняется, что порядок байтов в сети имеет порядок байтов. Имеет смысл, поскольку адрес типа 192.168.12.22 является числом с прямым порядком байтов.

Проверять, выписыватьсяHammerNet Проект GitHub. Он реализует приведенный выше код вместе с кучей проверок работоспособности, способностью обрабатывать значения по умолчанию для AVD, модульные тесты и другие вещи. Я должен был реализовать это для моего приложения и решил открыть исходный код библиотеки.

 Danpe16 июл. 2015 г., 12:42
Преобразование порядка байтов на самом деле очень важно для Nexus 5 и более устройств. Спасибо !"
 ElliotM15 мая 2018 г., 23:34
Это приводит к обратному IP-адресу ... кто-нибудь еще?
 Denis15 июн. 2017 г., 10:12
WifiManager wifiManager = (WifiManager) context.getApplicationContext (). GetSystemService (Context.WIFI_SERVICE) " Это'все еще немного лучше.
 1010101026 дек. 2013 г., 02:28
невозможно импортировать BigInteger в Android Studio. Я знаю, это странно, но так случилось.

Судя по моим журналам сбоев, похоже, что не каждое устройство возвращает MAC-адрес WiFi.

Вот более чистая версия самого популярного ответа.

final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
final ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
byteBuffer.putInt(wifiInfo.getIpAddress());
try {
final InetAddress inetAddress = InetAddress.getByAddress(null, byteBuffer.array());
} catch (UnknownHostException e) {
    //TODO: Return null?
}
 behelit02 окт. 2017 г., 10:12
что такоеwifiInfoВаш код неполон

Следующий код взят из настроек AOSP. Получи активную ссылкуS IP, не имеет значения Wi-Fi или мобильный телефон. Это'самый распространенный способ.

http://androidxref.com/8.0.0_r4/xref/packages/apps/Settings/src/com/android/settings/deviceinfo/Status.java#251

/**  
 * Returns the default link's IP addresses, if any, taking into account IPv4 and IPv6 style
 * addresses.
 * @param context the application context
 * @return the formatted and newline-separated IP addresses, or null if none.
 */
public static String getDefaultIpAddresses(ConnectivityManager cm) {                                                                      
    LinkProperties prop = cm.getActiveLinkProperties();
    return formatIpAddresses(prop);
}    

private static String formatIpAddresses(LinkProperties prop) {
    if (prop == null) return null;
    Iterator iter = prop.getAllAddresses().iterator();
    // If there are no entries, return null
    if (!iter.hasNext()) return null;
    // Concatenate all available addresses, comma separated
    String addresses = "";
    while (iter.hasNext()) {
        addresses += iter.next().getHostAddress();
        if (iter.hasNext()) addresses += "\n";
    }
    return addresses;
}

Нашел этот хороший ответ,https://gist.github.com/stickupkid/1250733

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ipString = String.format(“%d.%d.%d.%d”, (ip & 0xff), (ip >> 8 & 0xff), (ip >> 16 & 0xff), (ip >> 24 & 0xff));

Вы получите WiFi IPv4, IPv6 или оба.

public static Enumeration getWifiInetAddresses(final Context context) {
    final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    final WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    final String macAddress = wifiInfo.getMacAddress();
    final String[] macParts = macAddress.split(":");
    final byte[] macBytes = new byte[macParts.length];
    for (int i = 0; i< macParts.length; i++) {
        macBytes[i] = (byte)Integer.parseInt(macParts[i], 16);
    }
    try {
        final Enumeration e =  NetworkInterface.getNetworkInterfaces();
        while (e.hasMoreElements()) {
            final NetworkInterface networkInterface = e.nextElement();
            if (Arrays.equals(networkInterface.getHardwareAddress(), macBytes)) {
                return networkInterface.getInetAddresses();
            }
        }
    } catch (SocketException e) {
        Log.wtf("WIFIIP", "Unable to NetworkInterface.getNetworkInterfaces()");
    }
    return null;
}

@SuppressWarnings("unchecked")
public static T getWifiInetAddress(final Context context, final Class inetClass) {
    final Enumeration e = getWifiInetAddresses(context);
    while (e.hasMoreElements()) {
        final InetAddress inetAddress = e.nextElement();
        if (inetAddress.getClass() == inetClass) {
            return (T)inetAddress;
        }
    }
    return null;
}

Использование:

final Inet4Address inet4Address = getWifiInetAddress(context, Inet4Address.class);
final Inet6Address inet6Address = getWifiInetAddress(context, Inet6Address.class);

И не надозабыть:


Решение Вопроса

Если вы хотите получить частный IP-адрес вашего устройства при подключении к Wi-Fi, вы можете попробовать это.

WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
String ipAddress = Formatter.formatIpAddress(ip);

Обязательно добавьте разрешение


к вашему манифесту.

 Emmanuel19 дек. 2013 г., 22:30
formatIpAddress () устарел. Смотрите решение от Digital Rounin ниже, используя вместо этого InetAddress.getHostAddress ().
 Abraham Philip03 янв. 2016 г., 15:59
Endiannes является важным фактором, приведенный выше код вернет обратный IP на оборудовании Little Endian. Проверьте цифровой Rounin 'Ответ ниже для правильного метода. Или жеstackoverflow.com/questions/29937433/... для более короткого метода (который возвращает ip как int, но в правильном порядке).
 1010101026 дек. 2013 г., 02:30
только для новичков: это должен быть getSystemService (Context.WIFI_SERVICE)
 Yong15 июн. 2018 г., 10:18
Смотрите мой ответ в следующем. Получит активную ссылкуIP-адрес, независимо от того, Wi-Fi или мобильный

Добавить следующее разрешение.

 

WifiManager инициализировать в onCreate.

 WifiManager wifiMgr = (WifiManager) getContext().getSystemService(context.WIFI_SERVICE);

Используйте следующую функцию.

 public void WI-FI_IP() {
    WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
    int ip = wifiInfo.getIpAddress();
    String ipAddress = Formatter.formatIpAddress(ip);
    }

Formatter.formatIpAddress (int) устарела:

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ipAddress = BigInteger.valueOf(wm.getDhcpInfo().netmask).toString();
 aclokay10 янв. 2017 г., 19:47
Ага. Это победилоПоддержка IPv6.

Если adb установлен в терминале, тогда выполните:

Runtime.getRuntime.exec("adb", "shell", "getprop", "dhcp.wlan0.ipaddress");

Ваш ответ на вопрос