23

デバイスのIPアドレスを取得しようとしています。つまり、WIFIまたは3G接続を使用しています。理解できないIPV6形式のIPアドレスを取得しています。私はIPV4形式のIPアドレスが欲しいです。私はグーグルをしましたが、dintは適切な解決策を見つけました。

これが私がデバイスのIPアドレスを取得するために使用しているコードです

public String getLocalIpAddress() {
    try {
        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();
                System.out.println("ip1--:" + inetAddress);
                System.out.println("ip2--:" + inetAddress.getHostAddress());
                if (!inetAddress.isLoopbackAddress()) {


                    String ip = inetAddress.getHostAddress().toString();
                    System.out.println("ip---::" + ip);
                    EditText tv = (EditText) findViewById(R.id.ipadd);
                    tv.setText(ip);
                    return inetAddress.getHostAddress().toString();

                }
            }
        }
    } catch (Exception ex) {
        Log.e("IP Address", ex.toString());
    }
    return null;
}

私はこの出力を得ています:

ip1--:/fe80::5054:ff:fe12:3456%eth0%2
ip2--:fe80::5054:ff:fe12:3456%eth0

次のように表示されます。

192.168.1.1

私を助けてください..

4

4 に答える 4

48

多くのトリックを試した後..最終的に私はIPV4形式で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();
                System.out.println("ip1--:" + inetAddress);
                System.out.println("ip2--:" + inetAddress.getHostAddress());

      // for getting IPV4 format
      if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4 = inetAddress.getHostAddress())) {

                    String ip = inetAddress.getHostAddress().toString();
                    System.out.println("ip---::" + ip);
                    EditText tv = (EditText) findViewById(R.id.ipadd);
                    tv.setText(ip);
                    // return inetAddress.getHostAddress().toString();
                    return ip;
                }
            }
        }
    } catch (Exception ex) {
        Log.e("IP Address", ex.toString());
    }
    return null;
}

以下に示すif条件を追加しました

 /**This shows IPV4 format IP address*/
 if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4 = inetAddress.getHostAddress())){}

これの代わりに

 /**This shows IPV6 format IP address*/
 if (!inetAddress.isLoopbackAddress()){}

どうもありがとう..ラフル

アドレスがバージョン4のアドレスであるかどうかを確認する別の方法は次のとおりです。

if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address)
于 2012-06-14T04:33:05.460 に答える
9

どのデバイスにもネットワークアドレスが1つしかないことを想定することはできません。また、IPv4が含まれると想定することはできません。IPv6のみである可能性があるため、アプリケーションはIPv4とIPv6の両方のアドレス表示を処理できる必要があります。

通常、Androidフォンには使用可能なIPアドレスが割り当てられる少なくとも2つのインターフェイスがあります。3Gデータ用のrmnet0は、IPv4の場合はキャリアグレードのNATであることが多いため、着信ソケット接続を受け入れることができず、IPv6アドレスも持つ場合があります。Wi-Fiの場合はwlan0。これは、接続先のネットワークとネゴシエートできるIPv4および/またはIPv6アドレスを持ちます。

一部のバージョンのAndroidは、3Gデータの使用量を削減するために、wifiに接続するときに(通常はより高価な)rmnet0リンクを意図的に削除します。この動作は、Wi-Fiが手動サインインを必要とするキャプティブポータルであるものに接続されている場合に問題になります。

于 2013-02-05T13:12:28.577 に答える
2

IPv4アドレス用のJavaAPIには別のクラスInet4Addressがあるようです。

于 2012-06-13T13:35:32.227 に答える
0

以下は、IPv4かIPv6かを確認する簡単な方法です。

InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
    // It's ipv6
} else if (address instanceof Inet4Address) {
    // It's ipv4
}
于 2020-01-16T14:01:54.337 に答える