Как получить IP-адрес устройства из кода?
можно ли получить IP-адрес устройства с помощью кода?
18 ответов:
- Это мой помощник util для чтения IP-и MAC-адресов. Реализация чисто-Java, но у меня есть блок комментариев в
getMACAddress()
который может прочитать значение из специального файла Linux (Android). Я запускал этот код только на нескольких устройствах и эмуляторе, но дайте мне знать здесь, если вы найдете странные результаты.// 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
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<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 (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<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(); //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 ""; } }
отказ от ответственности: идеи и пример кода для этого класса Utils пришли из несколько так постов и Гугл. Я убрал и объединил все примеры.
это сработало для меня:
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
я использовал следующий код: Причина, по которой я использовал хэш-код, заключалась в том, что я получал некоторые значения мусора, добавленные к ip-адресу, когда я использовал
getHostAddress
. НоhashCode
работал очень хорошо для меня, как тогда я могу использовать форматер, чтобы получить ip-адрес с правильным форматированием.вот пример :
1.используя
getHostAddress
:***** IP=fe80::65ca:a13d:ea5a:233d%rmnet_sdio0
2.используя
hashCode
иFormatter
:***** IP=238.194.77.212
как вы можете видеть 2-й методы дает мне именно то, что я необходимость.
public String getLocalIpAddress() { try { for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> 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<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> 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
instanceofInet4Address
чтобы проверить, если это ipv4-адрес.
ниже код может помочь вам.. Не забудьте добавить разрешения..
public String getLocalIpAddress(){ try { for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> 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; }
добавить ниже разрешения в файле манифеста.
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
удачи в кодировании!!
вам не нужно добавлять разрешения, как в случае с решениями, предоставленными до сих пор. Загрузите этот сайт в виде строки:
или
загрузка веб-сайта в виде строки может быть выполнена с помощью кода 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<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> 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-адрес устройства и предпочитает адрес интерфейса wifi, если он подключен.
@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<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { NetworkInterface networkInterface = en.nextElement(); for (Enumeration<InetAddress> 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();
пожалуйста, проверьте этот код...Используя этот код. мы получим ip от мобильного интернета...
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> 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 будет нравится быть там дольше, чем ваше заявление.
просто помни, что это может быть, что ваш пользователь не было интернета в это время, что бы вы хотели сделать !
Удачи
это переделка ответ который удаляет ненужную информацию, добавляет полезные комментарии, более четко называет переменные и улучшает логику.
Не забудьте включить следующие разрешения:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
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<NetworkInterface> 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); } }
просто используйте Volley, чтобы получить ip от этой сайт
RequestQueue queue = Volley.newRequestQueue(this); String urlip = "http://checkip.amazonaws.com/"; StringRequest stringRequest = new StringRequest(Request.Method.GET, urlip, new Response.Listener<String>() { @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);
вы можете сделать это
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<String>() { @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);
основываясь на том, что я проверил это мое предложение
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<NetworkInterface> netArr = NetworkInterface.getNetworkInterfaces(); netArr.hasMoreElements();) { NetworkInterface netInte = netArr.nextElement (); for (Enumeration<InetAddress> 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) {} } }