2012-06-13 75 views
20

Tôi đang cố gắng lấy địa chỉ IP của thiết bị, tức là sử dụng kết nối WIFI hoặc 3G. Tôi nhận được địa chỉ IP ở định dạng IPV6 mà không phải là dễ hiểu. Tôi muốn trong IPV4 định dạng địa chỉ IP. Tôi đã thực hiện google nhưng dint tìm thấy bất kỳ giải pháp thích hợp.Làm cách nào để nhận IP_ADDRESS ở định dạng IPV4

đây là mã mà tôi đang sử dụng để có được địa chỉ IP của một thiết bị

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

Tôi nhận ouput này:

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

Nó sẽ được hiển thị như thế này:

192.168.1.1 

hãy giúp tôi ..

Trả lời

44

Sau khi thử nhiều thủ đoạn .. Cuối cùng tôi có thể nhận được địa chỉ IP ở định dạng IPV4 .. Dưới đây là mã của tôi ..

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

Added nếu tình trạng như hình dưới đây

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

thay vì điều này

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

Rất cám ơn .. Rahul

Một thay thế để kiểm tra nếu địa chỉ là một địa chỉ phiên bản 4 là:

if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) 
+0

Đừng quên sự cho phép để ngăn chặn kết quả null : Vyacheslav

+0

Vị trí và nội dung cần khai báo "ipv4" – CrazyMind

2

Có vẻ như có một lớp riêng biệt Inet4Address trong API Java cho địa chỉ IPv4.

+0

Tôi đã thử nhưng địa chỉ IP mặc định của trình giả lập không phải là địa chỉ IP cục bộ. –

+0

Localhost là 127.0.0.1, tôi nghi ngờ đó là những gì bạn muốn. –

+0

@ Tech.Rahul nếu bạn muốn nhận được localhost, bạn có thể không sử dụng một cái gì đó như 'InetAddress addr = InetAddress.getLocalHost();'? – 0nyx

8

Bạn không thể giả định rằng bất kỳ thiết bị chỉ có một địa chỉ mạng. Bạn cũng không thể giả định rằng nó sẽ có bất kỳ IPv4 nào - nó có thể chỉ là IPv6, vì vậy ứng dụng của bạn sẽ cần có khả năng xử lý cả hai màn hình địa chỉ IPv4 và IPv6. Thông thường, điện thoại Android có ít nhất hai giao diện được gán địa chỉ ip có thể sử dụng, rmnet0 cho dữ liệu 3G, cho IPv4 thường là NAT cấp nhà cung cấp và do đó không thể chấp nhận kết nối ổ cắm đến và cũng có thể có IPv6 địa chỉ nhà; và wlan0 cho wifi, sẽ có bất kỳ IPv4 và/hoặc địa chỉ IPv6 nào có thể thương lượng với mạng mà nó gắn vào.

Một số phiên bản Android sẽ cố tình thả liên kết rmnet0 (thường đắt hơn) khi nó kết nối với wifi - trong nỗ lực giảm mức sử dụng dữ liệu 3G. Hành vi này là một vấn đề khi wifi đã gắn liền với một cái gì đó mà là một cổng bị khóa đòi hỏi phải đăng nhập bằng tay.

Các vấn đề liên quan