web-dev-qa-db-ja.com

IPV4形式でIP_ADDRESSを取得する方法

デバイスのIPアドレスを取得しようとしています。つまり、WIFIまたは3G接続を使用しています。理解できないIPV6形式のIPアドレスを取得しています。 IPV4形式のIPアドレスが必要です。Googleを実行しましたが、適切な解決策が見つかりませんでした。

これは、デバイスの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

私を助けてください..

23
Rahul Baradia

多くのトリックを試した後、最終的に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)
48
Rahul Baradia

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

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

Androidの一部のバージョンは、3Gデータの使用量を削減するために、wifiに接続するときに(通常はより高価な)rmnet0リンクを意図的にドロップします。この動作は、wifiが手動サインインが必要なキャプティブポータルのようなもの。

8
Simon Hewison

別のクラス Inet4Address Java IPv4アドレス用のAPI)があるようです。

2
0nyx

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

InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
    // It's ipv6
} else if (address instanceof Inet4Address) {
    // It's ipv4
}
0
rkachach