Подтвердить что ты не робот

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

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

Я нашел метод здесь, но он возвращает что-то вроде 24.182.239.255, даже если я под wifi, и я ожидаю чего-то вроде 192.168.1.10.

Мне хотелось бы что-то вроде:

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

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

4b9b3361

Ответ 1

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

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

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

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

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

Ответ 2

Итак, нужно учитывать, что Formatter.formatIpAddress(int) устарел:

Этот метод устарел на уровне 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 следующее:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

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

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

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

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


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

Ответ 3

Это даст вам WiFi IPv4, IPv6 или оба.

public static Enumeration<InetAddress> 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<NetworkInterface> 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 extends InetAddress> T getWifiInetAddress(final Context context, final Class<T> inetClass) {
    final Enumeration<InetAddress> 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);

И не забывайте:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Ответ 4

Если adb установлен в терминале, выполните следующие действия:

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

Ответ 5

Основываясь на моих журналах сбоев, похоже, что каждое устройство не возвращает 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?
}

Ответ 6

Нашел этот приятный ответ, 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));

Ответ 7

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

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

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

Ответ 8

Следующий код из настроек AOSP. Он получает активную ссылку ip, не имеет значения wifi или mobile. Это самый распространенный способ.

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

/**  
 * Returns the default link 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<InetAddress> 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;
}

Ответ 9

В вашей деятельности следующая функция getIpAddress(context) возвращает IP-адрес телефона:

public static String getIpAddress(Context context) {
    WifiManager wifiManager = (WifiManager) context.getApplicationContext()
                .getSystemService(WIFI_SERVICE);

    String ipAddress = intToInetAddress(wifiManager.getDhcpInfo().ipAddress).toString();

    ipAddress = ipAddress.substring(1);

    return ipAddress;
}

public static InetAddress intToInetAddress(int hostAddress) {
    byte[] addressBytes = { (byte)(0xff & hostAddress),
                (byte)(0xff & (hostAddress >> 8)),
                (byte)(0xff & (hostAddress >> 16)),
                (byte)(0xff & (hostAddress >> 24)) };

    try {
        return InetAddress.getByAddress(addressBytes);
    } catch (UnknownHostException e) {
        throw new AssertionError();
    }
}

Ответ 10

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

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ipAddress = BigInteger.valueOf(wm.getDhcpInfo().netmask).toString();