48

How can I get the ip address of my phone when it is connected under wifi?

I found a method here but it returns something like 24.182.239.255 even if I'm under wifi and I expect something like 192.168.1.10.

I'd like something like:

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

Many thanks!

laalto
  • 150,114
  • 66
  • 286
  • 303
Luigi Tiburzi
  • 4,265
  • 7
  • 32
  • 43
  • You seem to expect the private IP. This will help. http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device – siddharthsn May 24 '13 at 08:37

9 Answers9

80

So something to consider is that Formatter.formatIpAddress(int) is being deprecated:

This method was deprecated in API level 12. Use getHostAddress(), which supports both IPv4 and IPv6 addresses. This method does not support IPv6 addresses.

So using formatIpAddress(int) is likely not a good long term solution, although it will work.

Here is a potential solution if you are looking to absolutely on get the IP address for the WiFi interface:

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

As stated in previous responses, you need to set the following in your AndroidManifest.xml:

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

Note that this is only an example solution. You should take time to check for null values and so on to make sure that the UX is smooth.

The irony is that on one hand Google is deprecating formatIpAddress(int), but still has getIpAddress() still returns an integer value. The IP address being an int also rules it out for being IPv6 compliant.

Next is the fact that endianness may or may not be an issue. I have only tested three devices and they have all been little-endian. It seems like endianness can vary depending on the hardware, even though we are running in VMs this can still be an issue. So to be on the safe side I added an endian check in the code.

getByAddress(byte[]) appears to want the integer value to be big endian. From researching this it appears that network byte order is big-endian. Makes sense since an address like 192.168.12.22 is a big-endian number.


Check out HammerNet GitHub project. It implements the code above along with a bunch of sanity checks, ability to handle defaults for AVDs, unit tests, and other things. I had to implement this for an app of mine and decided to open source the library.

pedrohdz
  • 1,561
  • 14
  • 13
51

If you would like to get the private IP address of your device when connected to Wi-Fi, you can try this.

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

Be sure to add the permission

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

to your manifest.

siddharthsn
  • 1,709
  • 1
  • 21
  • 32
  • 15
    formatIpAddress() is deprecated. See solution by Digital Rounin below, using InetAddress.getHostAddress() instead. – Emmanuel Dec 19 '13 at 21:30
  • 1
    only for rookies : it should be getSystemService(Context.WIFI_SERVICE) – 10101010 Dec 26 '13 at 01:30
  • Endiannes is an important consideration, the above code will return the reversed IP on Little Endian hardware. Check Digital Rounin's answer below for the correct method. Or http://stackoverflow.com/questions/29937433/gethostaddress-returns-a-reversed-ip-adress for a shorter method (that returns the ip as an int but in the correct order). – Abraham Philip Jan 03 '16 at 14:59
  • See my answer in the following. It will get the active link's ip address, no matter wifi or mobile – Yong Jun 15 '18 at 08:18
  • Thanks for this answer, it lead to resolving my question as well. I was seeking the same answer but with Cordova. To get a devices IP address with Cordova, try using the following module: https://www.npmjs.com/package/cordova-plugin-android-wifi-manager – user3067533 Jun 18 '19 at 06:45
8

This will get you the WiFi IPv4, IPv6 or both.

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

Usage:

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

And don't forget:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Dustin
  • 2,064
  • 1
  • 16
  • 12
7

Found this nice answer, 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));
em_
  • 2,134
  • 2
  • 24
  • 39
  • I cannot edit it, because it is less than 6 characters, so for anyone trying this: You have to replace the quotes in `String.format` with normal ones. – Bowi Jul 25 '23 at 09:49
3

Based on my crash logs, it appears not every device returns the WiFi mac address.

Here is a cleaner version of the most popular reply.

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?
}
Dustin
  • 2,064
  • 1
  • 16
  • 12
1

If adb is installed in the terminal then do:

Runtime.getRuntime.exec("adb", "shell", "getprop", "dhcp.wlan0.ipaddress");
Thejus Krishna
  • 1,755
  • 1
  • 19
  • 28
0

Add Following Permission.

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

WifiManager initialize in onCreate.

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

Use following function.

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

The following code is from AOSP Settings. It get the active link's ip, not matter wifi or mobile. It's the most common way.

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<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;
}
Yong
  • 1,529
  • 12
  • 21
-1

Formatter.formatIpAddress(int) is deprecated:

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ipAddress = BigInteger.valueOf(wm.getDhcpInfo().netmask).toString();
mridul
  • 1,986
  • 9
  • 29
  • 50