2012-06-13 11 views
20

में IP_ADDRESS कैसे प्राप्त करूं मैं वाईफ़ाई या 3 जी कनेक्शन का उपयोग कर किसी डिवाइस का आईपी पता प्राप्त करने का प्रयास कर रहा हूं। मुझे आईपीवी 6 प्रारूप में आईपी पता मिल रहा है जो समझ में नहीं आता है। मैं आईपीवी 4 प्रारूप आईपी पते में चाहता हूं। मैंने Google किया है लेकिन डिन को कोई उचित समाधान मिला है।मैं IPV4 प्रारूप

यहाँ

कोड है जो मैं एक उपकरण का 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; 
} 

मैं इस ouput हो रही है:

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

यह इस तरह प्रदर्शित किया जाना चाहिए:

192.168.1.1 

कृपया मेरी मदद करें ..

उत्तर

44

कई गुर की कोशिश कर रहा .. अंत में मैं IPV4 प्रारूप में आईपी पते प्राप्त कर सकते हैं के बाद .. यहाँ मेरी कोड है ..

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

शून्य परिणाम को रोकने के लिए अनुमति को न भूलें : <उपयोग-अनुमति एंड्रॉइड: name = "android.permission.INTERNET" /> – Vyacheslav

+0

कहां और क्या "ipv4" घोषित करना है – CrazyMind

2

ऐसा लगता है कि जावा एपीआई में आईपीवी 4 पते के लिए एक अलग वर्ग Inet4Address है।

+0

मैंने कोशिश की लेकिन यह एक एमुलेटर का डिफ़ॉल्ट आईपी पता स्थानीयहोस्ट आईपी पता नहीं है .. –

+0

लोकलहोस्ट 127.0.0.1 है, मुझे संदेह है कि आप यही चाहते हैं। –

+0

@ Tech.Rahul यदि आप लोकलहोस्ट प्राप्त करना चाहते हैं तो आप 'InetAddress addr = InetAddress.getLocalHost();' जैसे कुछ का उपयोग नहीं कर सकते? – 0nyx

8

आप कल्पना नहीं कर सकते कि किसी भी उपकरण सिर्फ एक नेटवर्क पता है। आप यह भी नहीं मान सकते कि इसमें कोई आईपीवी 4 होगा - यह केवल आईपीवी 6 हो सकता है, इसलिए आपके एप्लिकेशन को आईपीवी 4 और आईपीवी 6 एड्रेस डिस्प्ले को संभालने में सक्षम होना होगा।

आमतौर पर, एक एंड्रॉइड फोन में कम से कम दो इंटरफेस होते हैं जो 3 जी डेटा के लिए उपयोग करने योग्य आईपी पते, आरएमनेट 0 असाइन करते हैं, जो आईपीवी 4 के लिए अक्सर कैरियर-ग्रेड नेट होता है और इसलिए इनकमिंग सॉकेट कनेक्शन स्वीकार नहीं कर सकता है, और इसमें आईपीवी 6 भी हो सकता है को संबोधित; और वाईफाई के लिए wlan0, जिसमें जो भी आईपीवी 4 और/या आईपीवी 6 पता होगा, वह उस नेटवर्क के साथ बातचीत कर सकता है जो इसे जोड़ता है।

एंड्रॉइड के कुछ संस्करण जानबूझकर (आमतौर पर अधिक महंगा) आरएमनेट 0 लिंक छोड़ देंगे जब यह वाईफाई से जुड़ता है - 3 जी डेटा उपयोग को कम करने के प्रयास में। यह व्यवहार एक समस्या है जब वाईफ़ाई ने कैप्टिव पोर्टल के साथ जुड़ा हुआ है जिसके लिए मैन्युअल साइन-इन की आवश्यकता होती है।

संबंधित मुद्दे