Last active
January 27, 2024 15:01
-
-
Save khannedy/29d1de0321e03668fcb1 to your computer and use it in GitHub Desktop.
Get IP Address Android Device
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); | |
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress()); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// AndroidManifest.xml permissions | |
<uses-permission android:name="android.permission.INTERNET" /> | |
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | |
// test functions | |
Utils.getMACAddress("wlan0"); | |
Utils.getMACAddress("eth0"); | |
Utils.getIPAddress(true); // IPv4 | |
Utils.getIPAddress(false); // IPv6 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.*; | |
import java.net.*; | |
import java.util.*; | |
import org.apache.http.conn.util.InetAddressUtils; | |
public class Utils { | |
/** | |
* Convert byte array to hex string | |
* @param bytes | |
* @return | |
*/ | |
public static String bytesToHex(byte[] bytes) { | |
StringBuilder sbuf = new StringBuilder(); | |
for(int idx=0; idx < bytes.length; idx++) { | |
int intVal = bytes[idx] & 0xff; | |
if (intVal < 0x10) sbuf.append("0"); | |
sbuf.append(Integer.toHexString(intVal).toUpperCase()); | |
} | |
return sbuf.toString(); | |
} | |
/** | |
* Get utf8 byte array. | |
* @param str | |
* @return array of NULL if error was found | |
*/ | |
public static byte[] getUTF8Bytes(String str) { | |
try { return str.getBytes("UTF-8"); } catch (Exception ex) { return null; } | |
} | |
/** | |
* Load UTF8withBOM or any ansi text file. | |
* @param filename | |
* @return | |
* @throws java.io.IOException | |
*/ | |
public static String loadFileAsString(String filename) throws java.io.IOException { | |
final int BUFLEN=1024; | |
BufferedInputStream is = new BufferedInputStream(new FileInputStream(filename), BUFLEN); | |
try { | |
ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFLEN); | |
byte[] bytes = new byte[BUFLEN]; | |
boolean isUTF8=false; | |
int read,count=0; | |
while((read=is.read(bytes)) != -1) { | |
if (count==0 && bytes[0]==(byte)0xEF && bytes[1]==(byte)0xBB && bytes[2]==(byte)0xBF ) { | |
isUTF8=true; | |
baos.write(bytes, 3, read-3); // drop UTF8 bom marker | |
} else { | |
baos.write(bytes, 0, read); | |
} | |
count+=read; | |
} | |
return isUTF8 ? new String(baos.toByteArray(), "UTF-8") : new String(baos.toByteArray()); | |
} finally { | |
try{ is.close(); } catch(Exception ex){} | |
} | |
} | |
/** | |
* Returns MAC address of the given interface name. | |
* @param interfaceName eth0, wlan0 or NULL=use first interface | |
* @return mac address or empty string | |
*/ | |
public static String getMACAddress(String interfaceName) { | |
try { | |
List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); | |
for (NetworkInterface intf : interfaces) { | |
if (interfaceName != null) { | |
if (!intf.getName().equalsIgnoreCase(interfaceName)) continue; | |
} | |
byte[] mac = intf.getHardwareAddress(); | |
if (mac==null) return ""; | |
StringBuilder buf = new StringBuilder(); | |
for (int idx=0; idx<mac.length; idx++) | |
buf.append(String.format("%02X:", mac[idx])); | |
if (buf.length()>0) buf.deleteCharAt(buf.length()-1); | |
return buf.toString(); | |
} | |
} catch (Exception ex) { } // for now eat exceptions | |
return ""; | |
/*try { | |
// this is so Linux hack | |
return loadFileAsString("/sys/class/net/" +interfaceName + "/address").toUpperCase().trim(); | |
} catch (IOException ex) { | |
return null; | |
}*/ | |
} | |
/** | |
* Get IP address from first non-localhost interface | |
* @param ipv4 true=return ipv4, false=return ipv6 | |
* @return address or empty string | |
*/ | |
public static String getIPAddress(boolean useIPv4) { | |
try { | |
List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); | |
for (NetworkInterface intf : interfaces) { | |
List<InetAddress> addrs = Collections.list(intf.getInetAddresses()); | |
for (InetAddress addr : addrs) { | |
if (!addr.isLoopbackAddress()) { | |
String sAddr = addr.getHostAddress().toUpperCase(); | |
boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); | |
if (useIPv4) { | |
if (isIPv4) | |
return sAddr; | |
} else { | |
if (!isIPv4) { | |
int delim = sAddr.indexOf('%'); // drop ip6 port suffix | |
return delim<0 ? sAddr : sAddr.substring(0, delim); | |
} | |
} | |
} | |
} | |
} | |
} catch (Exception ex) { } // for now eat exceptions | |
return ""; | |
} | |
} |
good.
For work in sdk > 23 change
from
boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr);
to
boolean isIPv4 = addr instanceof Inet4Address;
Hey! the method that you use in Utils.java works even when the device is not connected to wifi right? and do you know if i use this function at the moment to upload the app to Play Store maybe Google gets angry? i mean that function requires any special permission? TY
InetAddressUtils showing error
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
good