Get my wifi ip address Android
Asked Answered
K

9

49

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!

Katerine answered 24/5, 2013 at 8:31 Comment(1)
You seem to expect the private IP. This will help. #6065010Retrorocket
R
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.

Retrorocket answered 24/5, 2013 at 10:6 Comment(5)
formatIpAddress() is deprecated. See solution by Digital Rounin below, using InetAddress.getHostAddress() instead.Helmick
only for rookies : it should be getSystemService(Context.WIFI_SERVICE)Pressman
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 #29937933 for a shorter method (that returns the ip as an int but in the correct order).Nerissanerita
See my answer in the following. It will get the active link's ip address, no matter wifi or mobileFarrar
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: npmjs.com/package/cordova-plugin-android-wifi-managerJapan
R
81

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.

Rosana answered 5/9, 2013 at 14:8 Comment(6)
unable to import BigInteger in Android Studio. i know its weird but it happened so.Pressman
The endianness conversion is actually very important for Nexus 5 and more devices. Thanks !Trencher
"WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE)" It's still a little better.Piccaninny
This results in a reverse IP address... anyone else?Woodford
@ElliotM No, the result is a correct human-readable IP address. Did you do the test on a specific / exotic device ?Antipope
@Antipope yupWoodford
R
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.

Retrorocket answered 24/5, 2013 at 10:6 Comment(5)
formatIpAddress() is deprecated. See solution by Digital Rounin below, using InetAddress.getHostAddress() instead.Helmick
only for rookies : it should be getSystemService(Context.WIFI_SERVICE)Pressman
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 #29937933 for a shorter method (that returns the ip as an int but in the correct order).Nerissanerita
See my answer in the following. It will get the active link's ip address, no matter wifi or mobileFarrar
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: npmjs.com/package/cordova-plugin-android-wifi-managerJapan
R
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" />
Ramey answered 15/1, 2014 at 21:34 Comment(0)
W
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));
Woodford answered 15/5, 2018 at 21:40 Comment(1)
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.Plumbic
R
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?
}
Ramey answered 23/1, 2014 at 22:44 Comment(1)
Missing WifiInfo wifiInfo = wifiManager.getConnectionInfo();Lorrimor
M
1

If adb is installed in the terminal then do:

Runtime.getRuntime.exec("adb", "shell", "getprop", "dhcp.wlan0.ipaddress");
Moulmein answered 17/1, 2014 at 9:11 Comment(3)
Caused by: java.io.IOException: Cannot run program "adb": error=2, No such file or directoryBirdman
Install android sdkMoulmein
Where? On smartphone? On computer imposable compile app without sdk.Birdman
B
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);
    }
Buhr answered 17/1, 2018 at 11:54 Comment(0)
F
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;
}
Farrar answered 15/6, 2018 at 8:16 Comment(0)
N
-1

Formatter.formatIpAddress(int) is deprecated:

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ipAddress = BigInteger.valueOf(wm.getDhcpInfo().netmask).toString();
Nurserymaid answered 12/5, 2015 at 20:23 Comment(1)
Yep. It won't support IPv6.Lanchow

© 2022 - 2024 — McMap. All rights reserved.