코드에서 장치의 IP 주소를 얻는 방법은 무엇입니까?


383

일부 코드를 사용하여 장치의 IP 주소를 얻을 수 있습니까?


5
이것이 N 크기의 모음이라는 것을 잊지 마십시오. N == (0 || 1)이라고 가정 할 수 없습니다. 다시 말해, 장치가 네트워크와 통신하는 한 가지 방법 만 있다고 가정하지 말고 네트워크와 전혀 통신 할 수있는 방법이 없다고 가정하지 마십시오.
James Moore



외부 서비스에서 가져와야 합니다 ipof.in/txt 는 그러한 서비스 중 하나입니다
vivekv

안드로이드에서 프로그래밍 방식으로 얻을 수 있습니까?
Tanmay Sahoo

답변:


434

이것은 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 클래스의 아이디어와 예제 코드는 여러 SO 게시물과 Google에서 나왔습니다. 모든 예를 정리하고 병합했습니다.


17
getHardwareAddress ()로 인해 API 레벨 9 이상이 필요합니다.
Calvin

2
문제 보풀 경고 toUpperCase(). 잡기 Exception는 항상 혼란 스럽습니다 (그리고 도우미 메소드는 어쨌든 던지고 호출자가 예외를 처리하도록해야합니다-이를 수정하지는 않았습니다). 서식 : 80 줄을 넘지 않아야합니다. 에 대한 조건부 실행 getHardwareAddress()- 패치 : github.com/Utumno/AndroidHelpers/commit/... . 당신은 무엇을 말합니까?
Mr_and_Mrs_D 19

5
로컬 네트워크 (예 : Wi-Fi 또는 에뮬레이터)를 사용하는 경우 개인 IP 주소가 제공됩니다. 프록시 주소를 제공하는 특정 웹 사이트에 대한 요청을 통해 프록시 IP 주소를 얻을 수 있습니다 (예 : whatismyip.akamai.com
Julien Kronegg

1
이것은 Wi-Fi를 사용하는 실제 장치에서 완벽하게 작동합니다. 고마워요 형제
Mr Neo

5
IP 주소를 얻으려고 할 때 Nexus 6에서 잘못된 결과를 얻었습니다. "/ XX :: XXXX : XXXX : XXXX : XXXX % dummy0"형식의 주소를 제공하는 이름이 "name : dummy0 (dummy0)"인 NetworkInterface가 있지만 wlan0에 해당하는 실제 네트워크 인터페이스도 있지만 "더미"가 먼저 발생하기 때문에 항상 그 더미 주소를 얻습니다
Julian Suarez

201

이것은 나를 위해 일했다 :

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

10
이것은 나를 위해 작동합니다. 그러나 "ACCESS_WIFI_STATE"권한이 필요하고 "Umair"가 작성한 것처럼 목록 사용법이 필요하지 않습니다.
안드로이드 개발자

13
어떤 이유로 formatIpAddress가 더 이상 사용되지 않습니다. 대신 무엇을 사용해야합니까?
안드로이드 개발자

8
문서에서 : Use getHostAddress(), IPv4 및 IPv6 주소를 모두 지원합니다. 이 방법은 IPv6 주소를 지원하지 않습니다.
Ryan R

7
서버 및 클라이언트 IP 주소 @RyanR을 얻는 데 getHostAddress ()를 사용하는 방법은 무엇입니까?
gumuruh

42
사용자가 wifi 대신 데이터를 사용하더라도 여전히 작동합니까?
PinoyCoder

65

나는 다음 코드를 사용했다 : hashCode를 사용한 이유는 내가 사용할 때 ip 주소에 가비지 값이 추가 되었기 때문이다 getHostAddress. 그러나hashCode Formatter를 사용하여 IP 주소를 올바른 형식으로 가져올 수 있으므로 정말 잘 작동했습니다.

다음은 예제 출력입니다.

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

2. 사용 hashCodeFormatter: ***** IP=238.194.77.212

보시다시피 두 번째 방법은 내가 필요한 것을 정확하게 제공합니다.

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()추가 한 포맷터와 동일한 작업을 수행합니다.
Phil

10
hashCode를 사용하는 것은 명백하지 않으며, 말도 안됩니다. 대신 InetAddress.getHostAddress ()를 사용하십시오.
포인터 널

이 부분을 변경하십시오. if (! inetAddress.isLoopbackAddress ()) {String ip = Formatter.formatIpAddress (inetAddress.hashCode ()); Log.i (TAG, "***** IP ="+ ip); IP를 반환; } 이것과 함께 : if (! inetAddress.isLoopbackAddress () && InetAddressUtils.isIPv4Address (inetAddress.getHostAddress ())) {return inetAddress .getHostAddress (). toString (); } 이것은 올바른 IP 형식을 제공합니다
Chuy47

동시에 코드는 전화가 celluar이있을 수 있습니다, 첫째 IP를 반환, WIFI 및 BT 주소
reker

@ Chuy47 그것은 InetAddressUtils를 찾을 수 없다고 말합니다
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;
}

ipv4 주소인지 확인하기 위해 inetAddressinstanceof Inet4Address를 추가 했습니다.


내 하루를 구했다! 감사. 그것은 삼성 S7 가장자리에 작업 유일한 코드입니다
Dhananjay Sarsonia

이것은 WiFi 인터페이스 만 얻는 위의 대신에 진정한 대답입니다.
nyconing

이것은 정답이어야하며 WiFi와 모바일 네트워크 모두에서 작동하며 사용자 정의 형식 대신 "getHostAddress"를 사용합니다.
Balázs Gerlei

그러나 로컬 IP를
얻으려면

53

정답이 있지만 여기에 내 답변을 공유 하고이 방법이 더 편리하기를 바랍니다.

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
감사! 포맷터는 더 이상 사용되지 않으며 실제로 간단한 비트 로직을 작성하는 느낌이 들지 않았습니다.
William Morrison

4
잘 작동하지만 WIFI_STATE 권한이 필요합니다.<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Brent Faust

1
나는 성형기를 사용하지만 작동하지 않습니다. 대단해! 정말 감사합니다. 마지막 줄에서 수행 된 작업을 설명해 주시겠습니까? % d. % d. % d. % d 그러나 다른 것을 알고 있습니까? 감사합니다
Günay Gültekin

1
아니, 이것은 OP에 직접 응답하지 않습니다. WiFi를 사용하여 인터넷에 연결하는 모든 Android 기기가 아니기 때문입니다. 이더넷상의 NAT LAN 또는 NAT WAN 연결이 아닌 BT가있을 수 있습니다.
nyconing

31

아래 코드가 도움이 될 수 있습니다. 권한을 추가하는 것을 잊지 마십시오.

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

행복한 코딩 !!


6
"fe80 :: f225 : b7ff : fe8c : d357 % wlan0"과 같은 잘못된 값을 반환합니다.
Jorgesys

그가를 Inet4Address instanceof를 InetAddress를 추가 evertvandenbruel의 답변 @Jorgesys 체크
temirbek

3
변화가이 같은 조건은 올바른 IP를 얻을 경우 : (Inet4Address 또는 instanceof를 inetAddress.isLoopbackAddress () &&의 InetAddress!) 경우
Rajesh.k

동시에 코드는 전화가 celluar이있을 수 있습니다, 첫째 IP를 반환, WIFI 및 BT 주소
reker

핫스팟이 켜져 있으면 하나 이상의 IP를 얻을 수 있습니다
Harsha

16

지금까지 제공된 솔루션의 경우와 같은 권한을 추가 할 필요가 없습니다. 이 웹 사이트를 문자열로 다운로드하십시오 :

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

또는

http://www.telize.com/geoip

자바 코드를 사용하여 웹 사이트를 문자열로 다운로드 할 수 있습니다.

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

JSON 객체를 다음과 같이 구문 분석하십시오.

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

jquery 속성 "query"또는 "ip"는 IP 주소를 포함합니다.


2
인터넷 연결이 필요합니다. 큰 문제
David

4
왜 큰 문제입니까? 물론 IP 주소는 기술적으로 그러한 연결과 관련되어 있기 때문에 인터넷 연결이 필요합니다. 집을 떠나 식당에 가면 다른 인터넷 연결과 다른 IP 주소를 사용하게됩니다. ACCESS_NETWORK_STATE 또는 ACCESS_WIFI_STATE와 같이 더 추가 할 것이 필요하지 않습니다. 인터넷 연결은 본인이 제공 한 솔루션에 필요한 유일한 권한입니다.
Daan

2
어느 도메인? ip-api.com이 작동하지 않으면 telize.com을 폴백으로 사용할 수 있습니다. 그렇지 않으면 api.ipify.org 를 사용할 수 있습니다 . 그것은 (하지 JSON) 여기로도 주문 가능합니다 ip.jsontest.com/?callback=showIP . 많은 앱은 온라인 상태를 유지하는 도메인을 사용합니다. 그것은 정상입니다. 그러나 폴백을 사용하면 문제가 발생할 가능성이 거의 없습니다.
Daan

3
다윗의 원래 요점은 여전히 ​​유효합니다. 인터넷에 액세스 할 수없는 내부 네트워크에있는 경우 어떻게해야합니까?
hiandbaii

2
나는 확실히 네트워크가 필요하지만 인터넷없이 작동 해야하는 앱의 실용적인 목적을 알지 못했기 때문에 그것에 대해 결코 생각하지 않았습니다 (아마도 있지만 모바일 장치에서는 볼 수 없습니다).
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
이것이 192.168.0.x와 같은 wifi 인터페이스에서 개인 네트워크 IP를 반환 할 수 있습니까? 또는 인터넷에서 사용될 외부 IP 주소를 항상 반환합니까?
벤 H

9

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

4

이것은 관련없는 정보를 제거하고 유용한 주석을 추가하며 변수의 이름을보다 명확하게 지정하고 논리를 개선하는 이 답변 의 재 작업입니다 .

다음 권한을 포함해야합니다.

<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

코 틀린 미니멀리스트 버전

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

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

2

최근 getLocalIpAddress()에는 네트워크와의 연결이 끊어 지더라도 IP 주소가 계속 반환됩니다 (서비스 표시기 없음). 설정> 전화 정보> 상태에 표시된 IP 주소가 응용 프로그램의 생각과 다름을 의미합니다.

전에이 코드를 추가하여 해결 방법을 구현했습니다.

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

누군가에게 종을 울리는가?


2

포맷터없이 Kotlin에서

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

활동에서 다음 함수 getIpAddress(context)는 전화의 IP 주소를 반환합니다.

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 받고 있어요
natsumiyu

휴대 전화가 Wi-Fi 네트워크에 연결되어 있습니까? wifiManager.getConnectionInfo (). getSSID ()를 호출하면 어떤 값이 반환됩니까?
matdev

WiFi가 아닌 모바일 데이터에 연결된 장치에서 작동합니까?
Sergey

아니요,이 방법은 기기가 WiFi에 연결된 경우에만 작동합니다.
matdev

1

@Nilesh와 @anargund의 kotlin 버전입니다

  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
이 실제 프로젝트에서 코드 스타일의 경우, 나는 당신이 로버트 마틴에 의해 "클린 코드"를 읽어 제안
아메드 아델 이스마일

1

장치에 여러 IP 주소가있을 수 있으며 특정 앱에서 사용중인 IP 주소는 요청을받는 서버가 볼 수있는 IP가 아닐 수 있습니다. 실제로 일부 사용자는 VPN 또는 Cloudflare Warp 와 같은 프록시를 사용합니다 .

장치에서 요청을받는 서버가 IP 주소를 얻는 것이 목적이라면 Ipregistry (면책 조항 : 회사에서 근무)와 같은 IP 위치 정보 서비스를 Java 클라이언트 로 쿼리하는 것이 가장 좋습니다 .

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

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

사용하기 간단 할뿐만 아니라 국가, 언어, 통화, 장치 IP의 시간대와 같은 추가 정보를 얻을 수 있으며 사용자가 프록시를 사용하고 있는지 확인할 수 있습니다.


1

이것은 인터넷에 존재하는 가장 쉽고 간단한 방법입니다 ... 우선,이 권한을 매니페스트 파일에 추가하십시오 ...

  1. "인터넷"

  2. "ACCESS_NETWORK_STATE"

이것을 활동의 onCreate 파일에 추가하십시오.

    getPublicIP();

이제이 함수를 MainActivity.class에 추가하십시오.

    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)은 공개 IP 주소를 포함합니다.
지아 무하마드

활동 파일에서 다음과 같이 선언해야합니다. ArrayList <String> urls = new ArrayList <String> (); // 각 줄 읽기
Zia Muhammad

0

쉘이 있다면; ifconfig eth0도 x86 장치에서 작동했습니다


0

이 코드를 확인하십시오 ...이 코드를 사용하십시오. 우리는 모바일 인터넷에서 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();
                    }
                }
            }

0

나는 안드로이드를하지 않지만 완전히 다른 방식 으로이 문제를 해결할 것입니다.

https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=my%20ip 와 같이 Google에 쿼리를 보냅니다.

응답이 게시 된 HTML 필드를 참조하십시오. 소스에 직접 쿼리 할 수도 있습니다.

Google은 귀하의 응용 프로그램보다 더 오래 머무르기를 원할 것입니다.

지금은 사용자에게 인터넷이 없을 수 있습니다. 어떻게 하시겠습니까?

행운을 빕니다


흥미 롭습니다! 그리고 Google에는 IP를 반환하는 일종의 API 호출이 있으며 이는 HTML 스캔보다 안정적입니다.
Scott Biggs

0

당신은 이것을 할 수 있습니다

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

모든 정직에서 나는 코드 안전에 대해 조금만 알고 있으므로 해킹이 어려울 수 있습니다. 그러나 나에게 이것은 가장 다재다능한 방법입니다.

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

WifiManager더 멋진 kotlin 솔루션에서 wifi ip를 얻는 아이디어 중 일부를 컴파일 :

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

또는 다음을 통해 ip4 루프백 장치의 IP 주소를 얻을 수 있습니다 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

내가 테스트 한 내용을 바탕으로 내 제안입니다.

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) {}
   }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.