2012-06-13 15 views
20

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

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

それはこのように表示されるべきである:

192.168.1.1 
ここ

は、私は、この出力に含まを取得しています、私は、デバイス

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

のIPアドレスを取得するために使用していたコードです

私を助けてください。

答えて

44

...最終的に私は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; 
} 

追加

/**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) 
+0

nullの結果を防ぐための許可を忘れないでください: Vyacheslav

+0

"ipv4"をどこで宣言するのですか? – CrazyMind

2

Java APIにIPv4アドレス用に別のクラスInet4Addressがあるようです。多くのトリックをしようとした後

+0

ローカルホストのIPアドレスではなく、エミュレータのデフォルトのIPアドレスを与えようとしました。 –

+0

ローカルホストは127.0.0.1です。私はそれがあなたの望むものだとは思っていません。 –

+0

@ Tech.Rahulローカルホストを取得したい場合は、 'InetAddress addr = InetAddress.getLocalHost();'のようなものを使用できない可能性がありますか? – 0nyx

8

あなたは、任意のデバイスは、単に一つのネットワークアドレスを持っていると仮定することはできません。また、IPv4があると想定することはできません。これはIPv6のみであるため、アプリケーションでIPv4とIPv6の両方のアドレス表示を処理できる必要があります。

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

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

関連する問題