Koddan cihazın IP adresini nasıl alabilirim?


383

Bir kod kullanarak cihazın IP adresini almak mümkün müdür?


5
Bunun N boyutunda bir koleksiyon olduğunu ve N == (0 || 1) olduğunu varsayamazsınız. Başka bir deyişle, bir cihazın bir ağla konuşmanın yalnızca bir yolu olduğunu ve ağla konuşmanın herhangi bir yolu olmadığını varsaymayın.
James Moore



Harici bir hizmetten almalısınız ipof.in/txt böyle bir hizmettir
vivekv

android programlı almak mümkün mü?
Tanmay Sahoo

Yanıtlar:


434

Bu, IP ve MAC adreslerini okumak için yardımcı aracım. Uygulama pure-java, ancak getMACAddress()özel Linux (Android) dosyasından değeri okuyabilecek bir yorum bloğum var . Bu kodu sadece birkaç cihazda ve Emulator'da çalıştırıyorum, ancak garip sonuçlar bulursanız bana bildirin.

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

}

Feragatname: Bu Utils sınıfına ilişkin fikirler ve örnek kod, çeşitli SO yayınlarından ve Google'dan geldi. Tüm örnekleri temizledim ve birleştirdim.


17
Bu, getHardwareAddress () nedeniyle API düzey 9 ve üzerini gerektirir.
Calvin

2
Sorunlar - tüy bırakmayan uyarılar açık toUpperCase(). Yakalamak Exceptionher zaman tehlikeli (ve yardımcı yöntemler yine de atmalı ve arayanın İstisna ile baş etmesine izin vermelidir - bunu değiştirmedi). Biçimlendirme: 80 satırdan fazla olmamalıdır. getHardwareAddress()- yama için koşullu yürütme : github.com/Utumno/AndroidHelpers/commit/… . Ne diyosun ?
Mr_and_Mrs_D

5
Yerel bir ağdaysanız (örn. Wifi veya emülatör) özel bir IP adresi alırsınız. Sen sana proxy adresi verir belirli bir web sitesine bir istek yoluyla proxy IP adresi alabilir, örneğin whatismyip.akamai.com
Julien Kronegg

1
Bu, Wifi kullanan gerçek cihazla benim için mükemmel çalışıyor. Çok teşekkürler kardeşim
Bay Neo

5
Bir IP adresi almaya çalışırken bir Nexus 6'da bundan kötü sonuçlar alıyorum. "Name: dummy0 (dummy0)" adında "/ XX :: XXXX: XXXX: XXXX: XXXX: XXXX% dummy0" biçiminde bir adres veren bir NetworkInterface var, ayrıca wlan0'a karşılık gelen gerçek bir ağ arabirimi var, ancak "kukla" ilk olduğundan beri her zaman o kukla adresi alıyorum
Julian Suarez

201

Bu benim için çalıştı:

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

10
bu benim için çalışıyor. ancak, "ACCESS_WIFI_STATE" iznine ihtiyaç duyar ve "Umair" yazdığı gibi, liste kullanımına gerek yoktur.
android geliştirici

13
formatIpAddress herhangi bir nedenle kullanımdan kaldırılmıştır. Bunun yerine ne kullanılmalı?
android geliştirici 20

8
Dokümanlardan: getHostAddress()Hem IPv4 hem de IPv6 adreslerini destekleyen kullanın . Bu yöntem IPv6 adreslerini desteklemez.
Ryan R

7
@RyanR sunucusunu ve istemci ip adresini almak için getHostAddress () nasıl kullanılır?
gumuruh

42
kullanıcı wifi yerine veri kullansa bile bu işe yarar mı?
PinoyCoder

65

Aşağıdaki kodu kullandım: hashCode kullandığım nedeni ben kullandığım zaman ip adresine eklenen bazı çöp değerleri alıyordum çünkü getHostAddress. Ama hashCodeo zaman benim için gerçekten iyi çalıştı o zaman doğru biçimlendirme ile ip adresi almak için Formatter kullanabilirsiniz.

İşte örnek çıktı:

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

2. kullanarak hashCodeve Formatter: ***** IP=238.194.77.212

Gördüğünüz gibi 2. yöntemler tam olarak ihtiyacım olanı veriyor.

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

1
getHostAddress()eklediğiniz biçimlendirici öğelerinin aynısını yapar.
Phil

10
HashCode kullanmak düz bir yanlıştır ve saçmalık döndürür. Bunun yerine InetAddress.getHostAddress () öğesini kullanın.
Pointer Null

bu bölümü değiştirin: if (! inetAddress.isLoopbackAddress ()) {String ip = Formatter.formatIpAddress (inetAddress.hashCode ()); Log.i (TAG, "***** IP =" + ip); dönüş ipi; } bununla: if (! inetAddress.isLoopbackAddress () && InetAddressUtils.isIPv4Address (inetAddress.getHostAddress ())) {dönüş inetAddress .getHostAddress (). toString (); } Bu size doğru ip biçimini verecektir
Chuy47

Kod sadece ilk IP'yi döndürür, bir telefon aynı anda
selüar

@ Chuy47 diyor InetAddressUtils bulunamadı
FabioR

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

Bir ipv4 adresi olup olmadığını kontrol etmek için inetAddressinstanceof ekledim Inet4Address.


günümü kurtardım! Teşekkürler. Samsung
S7

Bu, sadece WiFi arayüzü almak yerine yukarıda gerçek bir cevaptır.
nyconing

Bu gerçekten doğru cevap olmalı, hem WiFi hem de mobil ağ için çalışıyor ve özel biçimlendirme yerine "getHostAddress" kullanıyor.
Balázs Gerlei

Ancak, benim yerel IP alır, ben benim kamu IP gerekir (OP de inanıyorum gibi)
FabioR

53

Doğru bir cevap olmasına rağmen, cevabımı burada paylaşıyorum ve bu yolun daha kolay olacağını umuyorum.

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

4
Teşekkürler! Formatter kullanımdan kaldırıldı ve gerçekten basit bir bit mantığı yazmak gibi hissetmedim.
William Morrison

4
Harika çalışıyor, ancak WIFI_STATE izni gerekiyor:<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Brent Faust

1
Ben formaater kullanın ama işe yaramıyor. Bu harika! Gerçekten takdir ediyorum. Son satırda neler yapıldığını açıklar mısınız? % D.% D.% D.% D biliyorum ancak diğerleri? Teşekkürler
Günay Gültekin

1
Hayır bu OP'ye doğrudan cevap vermiyor. Çünkü internete bağlanmak için WiFi kullanan tüm Android cihazlar değil. Ethernet üzerinde NAT veya LAN olabilir veya NATed WAN bağlantısı vb.
Olmayabilir

31

Aşağıdaki kod size yardımcı olabilir .. İzin eklemeyi unutmayın ..

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

Manifest dosyasına aşağıdaki izni ekleyin.

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

mutlu kodlama !!


6
Hey bu yanlış bir değer döndürür: "fe80 :: f225: b7ff: fe8c: d357% wlan0"
Jorgesys

@Jorgesys, inetAddress instanceof Inet4Address
temirbek'i

3
doğru ip almak için böyle bir koşul varsa değiştirin: if (! inetAddress.isLoopbackAddress () && inetAddress instanceof Inet4Address)
Rajesh.k 1:30 '

Kod yalnızca ilk IP'yi döndürür, bir telefon aynı anda
selüar

Etkin noktanız varsa, birden fazla ip alabilirsiniz
Harsha

16

Şimdiye kadar sunulan çözümlerde durum böyle izinler eklemenize gerek yoktur. Bu web sitesini bir dize olarak indirin:

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

veya

http://www.telize.com/geoip

Bir web sitesini dize olarak indirmek java kodu ile yapılabilir:

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

JSON nesnesini şu şekilde ayrıştırın:

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

"Sorgu" veya "ip" json özelliği IP adresini içerir.


2
bunun için İnternet Bağlantısı gerekir. Büyük sorun
David

4
Bu neden büyük bir problem? Bir IP adresi teknik olarak böyle bir bağlantıyla ilişkili olduğu için elbette bir internet bağlantısına ihtiyacınız var. Evden ayrılıp bir restorana giderseniz, başka bir internet bağlantısı ve dolayısıyla başka bir IP adresi kullanacaksınız. ACCESS_NETWORK_STATE veya ACCESS_WIFI_STATE gibi daha fazla şey eklemek için bir şeye ihtiyacınız yok. İnternet bağlantısı, sağladığım çözüm için gereken tek izin.
Daan

2
Hangi alan adı? İp-api.com çalışmazsa telize.com'u yedek olarak kullanabilirsiniz. Aksi takdirde api.ipify.org'u kullanabilirsiniz . Ayrıca burada mevcuttur (json değil): ip.jsontest.com/?callback=showIP . Birçok uygulama, çevrimiçi kalması garanti edilen alanları kullanır; bu normal. Ancak, yedekleri kullanırsanız, bir sorun olması pek olası değildir.
Daan

3
David'in orijinal noktası hala duruyor. İnternet erişimi olmayan dahili bir ağdaysanız ne olur?
hiandbaii

2
Bunu hiç düşünmedim çünkü kesinlikle bir ağa ihtiyaç duyan ancak internet olmadan çalışması gereken bir uygulamanın pratik bir amacını bilmiyorum (belki de var ama mobil cihazlar için görmüyorum).
Daan

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

1
bu 192.168.0.x gibi wifi arayüzü, özel ağ ip dönmek mümkün mü? veya her zaman internette kullanılacak harici ip adresini döndürür mü?
Ben H

9

GetDeviceIpAddress yöntemi aygıtın ip adresini döndürür ve bağlıysa wifi arabirimi adresini tercih eder.

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

4

Bu, ilgisiz bilgileri ortaya çıkaran, yararlı yorumlar ekleyen, değişkenleri daha net bir şekilde adlandıran ve mantığı geliştiren bu cevabın yeniden çalışmasıdır .

Aşağıdaki izinleri eklemeyi unutmayın:

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

}

4

kotlin minimalist versiyonu

fun getIpv4HostAddress(): String {
    NetworkInterface.getNetworkInterfaces()?.toList()?.map { networkInterface ->
        networkInterface.inetAddresses?.toList()?.find {
            !it.isLoopbackAddress && it is Inet4Address
        }?.let { return it.hostAddress }
    }
    return ""
}

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

3

Bu siteden ip almak için Volley'i kullanmanız yeterli

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

2

Son zamanlarda, getLocalIpAddress()ağ bağlantısı kesilmiş olmasına rağmen bir IP adresi döndürülüyor (servis göstergesi yok). Bu, Ayarlar> Telefon hakkında> Durum'da görüntülenen IP adresinin, uygulamanın düşündüğünden farklı olduğu anlamına gelir.

Daha önce bu kodu ekleyerek bir geçici çözüm uyguladık:

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

Bu kimseye bir zil mi çalıyor?


2

Kotlin'de, Formatlayıcı olmadan

private fun getIPAddress(useIPv4 : Boolean): String {
    try {
        var interfaces = Collections.list(NetworkInterface.getNetworkInterfaces())
        for (intf in interfaces) {
            var addrs = Collections.list(intf.getInetAddresses());
            for (addr in addrs) {
                if (!addr.isLoopbackAddress()) {
                    var sAddr = addr.getHostAddress();
                    var isIPv4: Boolean
                    isIPv4 = sAddr.indexOf(':')<0
                    if (useIPv4) {
                        if (isIPv4)
                            return sAddr;
                    } else {
                        if (!isIPv4) {
                            var delim = sAddr.indexOf('%') // drop ip6 zone suffix
                            if (delim < 0) {
                                return sAddr.toUpperCase()
                            }
                            else {
                                return sAddr.substring(0, delim).toUpperCase()
                            }
                        }
                    }
                }
            }
        }
    } catch (e: java.lang.Exception) { }
    return ""
}

2

Etkinliğinizde, aşağıdaki işlev getIpAddress(context)telefonun IP adresini döndürür:

public static String getIpAddress(Context context) {
    WifiManager wifiManager = (WifiManager) context.getApplicationContext()
                .getSystemService(WIFI_SERVICE);

    String ipAddress = intToInetAddress(wifiManager.getDhcpInfo().ipAddress).toString();

    ipAddress = ipAddress.substring(1);

    return ipAddress;
}

public static InetAddress intToInetAddress(int hostAddress) {
    byte[] addressBytes = { (byte)(0xff & hostAddress),
                (byte)(0xff & (hostAddress >> 8)),
                (byte)(0xff & (hostAddress >> 16)),
                (byte)(0xff & (hostAddress >> 24)) };

    try {
        return InetAddress.getByAddress(addressBytes);
    } catch (UnknownHostException e) {
        throw new AssertionError();
    }
}

0.0.0.0 alıyorum
natsumiyu

Telefonunuz bir kablosuz ağa bağlı mı? WifiManager.getConnectionInfo (). GetSSID () öğesini çağırırsanız hangi değer döndürülür?
matdev

WiFi'ye değil Mobil Verilere bağlı cihaz için çalışır mı?
Sergey

Hayır, bu yöntem yalnızca cihaz WiFi'ye bağlıysa çalışır
matdev

1

İşte @Nilesh ve @anargund'un kotlin versiyonu

  fun getIpAddress(): String {
    var ip = ""
    try {
        val wm = applicationContext.getSystemService(WIFI_SERVICE) as WifiManager
        ip = Formatter.formatIpAddress(wm.connectionInfo.ipAddress)
    } catch (e: java.lang.Exception) {

    }

    if (ip.isEmpty()) {
        try {
            val en = NetworkInterface.getNetworkInterfaces()
            while (en.hasMoreElements()) {
                val networkInterface = en.nextElement()
                val enumIpAddr = networkInterface.inetAddresses
                while (enumIpAddr.hasMoreElements()) {
                    val inetAddress = enumIpAddr.nextElement()
                    if (!inetAddress.isLoopbackAddress && inetAddress is Inet4Address) {
                        val host = inetAddress.getHostAddress()
                        if (host.isNotEmpty()) {
                            ip =  host
                            break;
                        }
                    }
                }

            }
        } catch (e: java.lang.Exception) {

        }
    }

   if (ip.isEmpty())
      ip = "127.0.0.1"
    return ip
}

1
Bu gerçek projelerde kod tarzınızsa, robert martin tarafından yazılan "temiz kod" u okumanızı öneririm
Ahmed Adel Ismail

1

Bir aygıtın birkaç IP adresi olabilir ve belirli bir uygulamada kullanımda olan, isteği alan sunucuların göreceği IP olmayabilir. Aslında, bazı kullanıcılar bir VPN veya Cloudflare Warp gibi bir proxy kullanır .

Amacınız IP adresini cihazınızdan istek alan sunucular tarafından gösterildiği gibi almaksa , en iyisi Ipregistry (sorumluluk reddi: şirket için çalışıyorum) gibi bir IP coğrafi konumunu Java istemcisiyle sorgulamaktır :

https://github.com/ipregistry/ipregistry-java

IpregistryClient client = new IpregistryClient("tryout");
RequesterIpInfo requesterIpInfo = client.lookup();
requesterIpInfo.getIp();

Kullanımı gerçekten basit olmasının yanı sıra, ülke, dil, para birimi, aygıt IP'si için saat dilimi gibi ek bilgiler de alırsınız ve kullanıcının bir proxy kullanıp kullanmadığını belirleyebilirsiniz.


1

Bu, internette var olan en kolay ve basit yoldur ... Her şeyden önce, bu izni bildirim dosyanıza ekleyin ...

  1. "İNTERNET"

  2. "ACCESS_NETWORK_STATE"

bunu Etkinlik'in onCreate dosyasına ekleyin ..

    getPublicIP();

Şimdi bu işlevi MainActivity.class'ınıza ekleyin.

    private void getPublicIP() {
ArrayList<String> urls=new ArrayList<String>(); //to read each line

        new Thread(new Runnable(){
            public void run(){
                //TextView t; //to show the result, please declare and find it inside onCreate()

                try {
                    // Create a URL for the desired page
                    URL url = new URL("https://api.ipify.org/"); //My text file location
                    //First open the connection
                    HttpURLConnection conn=(HttpURLConnection) url.openConnection();
                    conn.setConnectTimeout(60000); // timing out in a minute

                    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

                    //t=(TextView)findViewById(R.id.TextView1); // ideally do this in onCreate()
                    String str;
                    while ((str = in.readLine()) != null) {
                        urls.add(str);
                    }
                    in.close();
                } catch (Exception e) {
                    Log.d("MyTag",e.toString());
                }

                //since we are in background thread, to post results we have to go back to ui thread. do the following for that

                PermissionsActivity.this.runOnUiThread(new Runnable(){
                    public void run(){
                        try {
                            Toast.makeText(PermissionsActivity.this, "Public IP:"+urls.get(0), Toast.LENGTH_SHORT).show();
                        }
                        catch (Exception e){
                            Toast.makeText(PermissionsActivity.this, "TurnOn wiffi to get public ip", Toast.LENGTH_SHORT).show();
                        }
                    }
                });

            }
        }).start();

    }


urls.get (0) genel IP adresinizi içerir.
Zia Muhammad

Etkinlik dosyanızda şöyle bildirmeniz gerekir: ArrayList <String> urls = new ArrayList <String> (); // her satırı okumak için
Zia Muhammad

0

Bir kabuğunuz varsa; ifconfig eth0, x86 cihazı için de çalıştı


0

Lütfen bu kodu kontrol edin ... Bu kodu kullanarak. mobil internetten ip alacağız ...

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

0

Android yapmıyorum, ancak bunu tamamen farklı bir şekilde çözeceğim.

Google'a bir sorgu gönderin, şunun gibi: https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=my%20ip

Yanıtın gönderildiği HTML alanına bakın. Ayrıca doğrudan kaynağa da sorgu yapabilirsiniz.

Google, Uygulamanızdan daha uzun süre orada olmayı çok sevecektir.

Unutmayın, kullanıcı şu anda internete sahip olmayabilir, ne olmak istersiniz!

İyi şanslar


İlginç! Ve eminim Google'ın IP'nizi döndürecek bir tür API çağrısı vardır, bu da HTML'yi taramaktan daha kararlı olacaktır.
Scott Biggs

0

Bunu yapabilirsiniz

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

0
 //    @NonNull
    public static String getIPAddress() {
        if (TextUtils.isEmpty(deviceIpAddress))
            new PublicIPAddress().execute();
        return deviceIpAddress;
    }

    public static String deviceIpAddress = "";

    public static class PublicIPAddress extends AsyncTask<String, Void, String> {
        InetAddress localhost = null;

        protected String doInBackground(String... urls) {
            try {
                localhost = InetAddress.getLocalHost();
                URL url_name = new URL("http://bot.whatismyipaddress.com");
                BufferedReader sc = new BufferedReader(new InputStreamReader(url_name.openStream()));
                deviceIpAddress = sc.readLine().trim();
            } catch (Exception e) {
                deviceIpAddress = "";
            }
            return deviceIpAddress;
        }

        protected void onPostExecute(String string) {
            Lg.d("deviceIpAddress", string);
        }
    }

0

Dürüst olmak gerekirse, kod güvenliğine biraz aşinayım, bu yüzden bu hack-ish olabilir. Ama benim için bunu yapmanın en çok yönlü yolu:

package com.my_objects.ip;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class MyIpByHost 
{
  public static void main(String a[])
  {
   try 
    {
      InetAddress host = InetAddress.getByName("nameOfDevice or webAddress");
      System.out.println(host.getHostAddress());
    } 
   catch (UnknownHostException e) 
    {
      e.printStackTrace();
    }
} }

0

Daha WifiManagergüzel bir kotlin çözümünde wifi ipini almak için bazı fikirleri derleme :

private fun getWifiIp(context: Context): String? {
  return context.getSystemService<WifiManager>().let {
     when {
      it == null -> "No wifi available"
      !it.isWifiEnabled -> "Wifi is disabled"
      it.connectionInfo == null -> "Wifi not connected"
      else -> {
        val ip = it.connectionInfo.ipAddress
        ((ip and 0xFF).toString() + "." + (ip shr 8 and 0xFF) + "." + (ip shr 16 and 0xFF) + "." + (ip shr 24 and 0xFF))
      }
    }
  }
}

Alternatif olarak ip4 geri döngü cihazlarının ip adreslerini aşağıdaki yollarla alabilirsiniz NetworkInterface:

fun getNetworkIp4LoopbackIps(): Map<String, String> = try {
  NetworkInterface.getNetworkInterfaces()
    .asSequence()
    .associate { it.displayName to it.ip4LoopbackIps() }
    .filterValues { it.isNotEmpty() }
} catch (ex: Exception) {
  emptyMap()
}

private fun NetworkInterface.ip4LoopbackIps() =
  inetAddresses.asSequence()
    .filter { !it.isLoopbackAddress && it is Inet4Address }
    .map { it.hostAddress }
    .filter { it.isNotEmpty() }
    .joinToString()

-2

Test ettiklerime dayanarak, bu benim teklifim

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) {}
   }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.