Как получить IP-адрес устройства из кода?

Возможно ли получить IP-адрес устройства с использованием какого-либо кода?

Это мой помощник для чтения IP-адресов и MAC-адресов. Реализация pure-java, но у меня есть блок комментариев в getMACAddress() который может читать значение из специального файла Linux (Android). Я запускаю этот код только на нескольких устройствах и эмуляторе, но дайте мне знать, если вы найдете странные результаты.

 // AndroidManifest.xml permissions   // test functions Utils.getMACAddress("wlan0"); Utils.getMACAddress("eth0"); Utils.getIPAddress(true); // IPv4 Utils.getIPAddress(false); // IPv6 

Utils.java

 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 toConvert * @return hexValue */ 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 which to be converted * @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 which to be converted to string * @return String value of File * @throws java.io.IOException if error occurs */ 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 ignored){} } } /** * 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 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 (byte aMac : mac) buf.append(String.format("%02X:",aMac)); if (buf.length()>0) buf.deleteCharAt(buf.length()-1); return buf.toString(); } } catch (Exception ignored) { } // 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 useIPv4 true=return ipv4, false=return ipv6 * @return address or empty string */ public static String getIPAddress(boolean useIPv4) { try { List interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface intf : interfaces) { List addrs = Collections.list(intf.getInetAddresses()); for (InetAddress addr : addrs) { if (!addr.isLoopbackAddress()) { String sAddr = addr.getHostAddress(); //boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); boolean isIPv4 = sAddr.indexOf(':')<0; if (useIPv4) { if (isIPv4) return sAddr; } else { if (!isIPv4) { int delim = sAddr.indexOf('%'); // drop ip6 zone suffix return delim<0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase(); } } } } } } catch (Exception ignored) { } // for now eat exceptions return ""; } } 

Отказ от ответственности. Идеи и пример кода для этого classа Utils поступали из нескольких сообщений SO и Google. Я очистил и объединил все примеры.

Это сработало для меня:

 WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress()); 

Я использовал следующий код: Причина, по которой я использовал hashCode, заключалась в том, что я получал некоторые значения мусора, добавленные к ip-адресу, когда я использовал getHostAddress . Но hashCode работал очень хорошо для меня, так как тогда я могу использовать Formatter, чтобы получить ip-адрес с правильным форматированием.

Вот пример вывода:

1.using getHostAddress : ***** IP=fe80::65ca:a13d:ea5a:233d%rmnet_sdio0

2. использование hashCode и Formatter: ***** IP=238.194.77.212

Как вы можете видеть, 2-й метод дает мне именно то, что мне нужно.

 public String getLocalIpAddress() { try { for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { String ip = Formatter.formatIpAddress(inetAddress.hashCode()); Log.i(TAG, "***** IP="+ ip); return ip; } } } } catch (SocketException ex) { Log.e(TAG, ex.toString()); } return null; } 

Хотя есть правильный ответ, я разделяю мой ответ здесь и надеюсь, что таким образом будет больше удобства.

 WifiManager wifiMan = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInf = wifiMan.getConnectionInfo(); int ipAddress = wifiInf.getIpAddress(); String ip = String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff),(ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff)); 
 public static String getLocalIpAddress() { try { for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { return inetAddress.getHostAddress(); } } } } catch (SocketException ex) { ex.printStackTrace(); } return null; } 

Я добавил inetAddress instanceof Inet4Address чтобы проверить, является ли это адресом ipv4.

Ниже код может помочь вам. Не забудьте добавить разрешения ..

 public String getLocalIpAddress(){ try { for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress(); } } } } catch (Exception ex) { Log.e("IP Address", ex.toString()); } return null; } 

Добавьте в файл манифеста разрешение.

    

счастливое кодирование !!

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

http://www.ip-api.com/json

или

http://www.telize.com/geoip

Загрузка веб-сайта в виде строки может быть выполнена с помощью Java-кода:

http://www.itcuties.com/java/read-url-to-string/

Разберите объект JSON следующим образом:

https://stackoverflow.com/a/18998203/1987258

Атрибут json «query» или «ip» содержит IP-адрес.

 private InetAddress getLocalAddress()throws IOException { try { for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { //return inetAddress.getHostAddress().toString(); return inetAddress; } } } } catch (SocketException ex) { Log.e("SALMAN", ex.toString()); } return null; } 

Метод getDeviceIpAddress возвращает IP-адрес устройства и предпочитает адрес интерфейса Wi-Fi, если он подключен.

  @NonNull private String getDeviceIpAddress() { String actualConnectedToNetwork = null; ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (connManager != null) { NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (mWifi.isConnected()) { actualConnectedToNetwork = getWifiIp(); } } if (TextUtils.isEmpty(actualConnectedToNetwork)) { actualConnectedToNetwork = getNetworkInterfaceIpAddress(); } if (TextUtils.isEmpty(actualConnectedToNetwork)) { actualConnectedToNetwork = "127.0.0.1"; } return actualConnectedToNetwork; } @Nullable private String getWifiIp() { final WifiManager mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); if (mWifiManager != null && mWifiManager.isWifiEnabled()) { int ip = mWifiManager.getConnectionInfo().getIpAddress(); return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 24) & 0xFF); } return null; } @Nullable public String getNetworkInterfaceIpAddress() { try { for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { NetworkInterface networkInterface = en.nextElement(); for (Enumeration enumIpAddr = networkInterface.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { String host = inetAddress.getHostAddress(); if (!TextUtils.isEmpty(host)) { return host; } } } } } catch (Exception ex) { Log.e("IP Address", "getLocalIpAddress", ex); } return null; } 

Недавно IP-адрес по-прежнему возвращается getLocalIpAddress() несмотря на то, что он отключен от сети (без индикатора обслуживания). Это означает, что IP-адрес, отображаемый в настройках> О телефоне> Статус, отличается от того, что было рассмотрено приложением.

Я применил обходной путь, добавив этот код:

 ConnectivityManager cm = getConnectivityManager(); NetworkInfo net = cm.getActiveNetworkInfo(); if ((null == net) || !net.isConnectedOrConnecting()) { return null; } 

Это звонит кому-нибудь?

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

Если у вас есть shell; ifconfig eth0 также работал для устройства x86

Пожалуйста, проверьте этот код … Используя этот код. мы получим ip из мобильного интернета …

 for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { NetworkInterface intf = en.nextElement(); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } } } 

Я не занимаюсь Android, но я бы занялся этим совершенно по-другому.

Отправьте запрос в Google, например: https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=my%20ip

И обратитесь к полю HTML, где отправлен ответ. Вы также можете напрямую запросить источник.

Google больше всего хочет быть там дольше, чем ваше приложение.

Просто помните, может быть, у вашего пользователя нет интернета в это время, что бы вы хотели!

Удачи

Это переделка этого ответа, который устраняет несущественную информацию, дает более полезные комментарии, имена переменных и улучшает логику.

Не забудьте включить следующие разрешения:

   

InternetHelper.java:

 public class InternetHelper { /** * Get IP address from first non-localhost interface * * @param useIPv4 true=return ipv4, false=return ipv6 * @return address or empty string */ public static String getIPAddress(boolean useIPv4) { try { List interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface interface_ : interfaces) { for (InetAddress inetAddress : Collections.list(interface_.getInetAddresses())) { /* a loopback address would be something like 127.0.0.1 (the device itself). we want to return the first non-loopback address. */ if (!inetAddress.isLoopbackAddress()) { String ipAddr = inetAddress.getHostAddress(); boolean isIPv4 = ipAddr.indexOf(':') < 0; if (isIPv4 && !useIPv4) { continue; } if (useIPv4 && !isIPv4) { int delim = ipAddr.indexOf('%'); // drop ip6 zone suffix ipAddr = delim < 0 ? ipAddr.toUpperCase() : ipAddr.substring(0, delim).toUpperCase(); } return ipAddr; } } } } catch (Exception ignored) { } // if we can't connect, just return empty string return ""; } /** * Get IPv4 address from first non-localhost interface * * @return address or empty string */ public static String getIPAddress() { return getIPAddress(true); } } 

Вы можете сделать это

 String stringUrl = "https://ipinfo.io/ip"; //String stringUrl = "http://whatismyip.akamai.com/"; // Instantiate the RequestQueue. RequestQueue queue = Volley.newRequestQueue(MainActivity.instance); //String url ="http://www.google.com"; // Request a string response from the provided URL. StringRequest stringRequest = new StringRequest(Request.Method.GET, stringUrl, new Response.Listener() { @Override public void onResponse(String response) { // Display the first 500 characters of the response string. Log.e(MGLogTag, "GET IP : " + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { IP = "That didn't work!"; } }); // Add the request to the RequestQueue. queue.add(stringRequest); 

Просто используйте Volley, чтобы получить ip с этого сайта

 RequestQueue queue = Volley.newRequestQueue(this); String urlip = "http://checkip.amazonaws.com/"; StringRequest stringRequest = new StringRequest(Request.Method.GET, urlip, new Response.Listener() { @Override public void onResponse(String response) { txtIP.setText(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { txtIP.setText("didnt work"); } }); queue.add(stringRequest); 

Основываясь на том, что я тестировал, это мое предложение

 import java.net.*; import java.util.*; public class hostUtil { public static String HOST_NAME = null; public static String HOST_IPADDRESS = null; public static String getThisHostName () { if (HOST_NAME == null) obtainHostInfo (); return HOST_NAME; } public static String getThisIpAddress () { if (HOST_IPADDRESS == null) obtainHostInfo (); return HOST_IPADDRESS; } protected static void obtainHostInfo () { HOST_IPADDRESS = "127.0.0.1"; HOST_NAME = "localhost"; try { InetAddress primera = InetAddress.getLocalHost(); String hostname = InetAddress.getLocalHost().getHostName (); if (!primera.isLoopbackAddress () && !hostname.equalsIgnoreCase ("localhost") && primera.getHostAddress ().indexOf (':') == -1) { // Got it without delay!! HOST_IPADDRESS = primera.getHostAddress (); HOST_NAME = hostname; //System.out.println ("First try! " + HOST_NAME + " IP " + HOST_IPADDRESS); return; } for (Enumeration netArr = NetworkInterface.getNetworkInterfaces(); netArr.hasMoreElements();) { NetworkInterface netInte = netArr.nextElement (); for (Enumeration addArr = netInte.getInetAddresses (); addArr.hasMoreElements ();) { InetAddress laAdd = addArr.nextElement (); String ipstring = laAdd.getHostAddress (); String hostName = laAdd.getHostName (); if (laAdd.isLoopbackAddress()) continue; if (hostName.equalsIgnoreCase ("localhost")) continue; if (ipstring.indexOf (':') >= 0) continue; HOST_IPADDRESS = ipstring; HOST_NAME = hostName; break; } } } catch (Exception ex) {} } } 
Interesting Posts

Перенаправление отправляет меня на ту же страницу, когда я нажимаю «Назад»,

Почему меньше, когда у вас может быть больше? (Пейджеры на * Nix)

Как удалить строки из начала и конца строки (Java)?

Как преобразовать массив байтов в двойной и обратно?

Как я могу определить, какой пользователь в настоящее время входит в систему Windows 7?

Как включить или выключить пустые функции окна поворота

Как использовать первую букву строки в Java?

Как подключить LPT-принтер к материнской плате без параллельного порта?

Ошибка Opera «Не удается открыть каталог профиля пользователя, потому что вам не хватает достаточных привилегий». После потери мощности

Как включить Java Quick Starter (JQS) в Windows 7

Задержка jquery hover event?

Ant для запуска цели Ant, только если файл существует?

Получение пути к файловой системе classа, выполняемого

Как установить радиус закругленного угла для рисования цвета с помощью xml?

Почему это регулярное выражение позволяет каретку?

Давайте будем гением компьютера.