0

私はAndroid開発に不慣れで、AndroidデバイスのIPアドレスをSMSで別のデバイスに送信するアプリケーションを実行しています。以下のコードから取得した 16 進数ではなく、この 192.168.0.4 のように 10 進数で IP を取得する必要があります。それを行う方法と助けに感謝します。

    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().toString();

                    }
                 }
             }
         } catch (SocketException ex) {
             Log.e(TAG, ex.toString());
         }

         return null;
    } 
4

4 に答える 4

8
public static String getLocalIpv4Address(){
    try {
        String ipv4;
        List<NetworkInterface>  nilist = Collections.list(NetworkInterface.getNetworkInterfaces());
        if(nilist.size() > 0){
            for (NetworkInterface ni: nilist){
                List<InetAddress>  ialist = Collections.list(ni.getInetAddresses());
                if(ialist.size()>0){
                    for (InetAddress address: ialist){
                        if (!address.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4=address.getHostAddress())){ 
                            return ipv4;
                        }
                    }
                }

            }
        }

    } catch (SocketException ex) {

    }
    return "";
}

これは大丈夫ですか?この関数は、利用可能な場合にのみ ipv4 (xxx.xxx.xxx.xxx パターン) を返します。

あなたが言及したこれらの16進数値はipv6アドレスでなければならないことに注意してください。

于 2012-06-13T01:03:46.957 に答える
3

この投稿では、デバイスの IP を取得する方法について説明します。

このコード (前述の投稿から取得) は、正しい方法で IP アドレスを取得する必要があります。

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().toString();
                }
            }
        }
    } catch (SocketException ex) {
        Log.e(LOG_TAG, ex.toString());
    }
    return null;
}
于 2012-06-11T18:09:01.223 に答える
0

空腹の答えは正しいですが、たとえば特定のデバイス「wlan0」の ip_addresses をループすると、最初のアドレスは ipv6 で、2 番目のアドレスは ipv4 であることがわかりました。最初の値のみを返していたため、16 進数の文字列しか取得していませんでした。

for (InetAddress inetAddress : Collections.list(inetAddresses)) {
                String ip_address = inetAddress.getHostAddress();
                Log.d(APP_NAME, "IP: " + ip_address);
                //return if_name + ": " + ip_address;
}

「return」をコメントアウトしたことに注意してください

于 2014-11-23T22:36:20.760 に答える
-1

この情報は、getpropコマンドを使用してシェルから入手できます。

于 2012-06-12T04:27:36.657 に答える