2015-08-21 15 views
17

एंड्रॉइड मार्शमलो एपीआई पर स्विचिंग, मैं org.apache.http.conn.util.InetAddressUtilsInetAddressUtils.isIPv4Address(ipAddress) के लिए किसी डिवाइस से सभी आईपी सूचीबद्ध करने के लिए कोड में उपयोग कर रहा था।एंड्रॉइड एपीआई -23: इनेट एड्रेस यूटिलस प्रतिस्थापन

API-23 changes के हिस्से के रूप में, InetAddressUtils कक्षा अब चला गया है।

अब मैं नीचे दिए गए कोड को कैसे बदल सकता हूं?

public static String ipAddress() { 
    try { 
     for (final Enumeration<NetworkInterface> enumerationNetworkInterface = NetworkInterface.getNetworkInterfaces(); enumerationNetworkInterface.hasMoreElements();) { 
      final NetworkInterface networkInterface = enumerationNetworkInterface.nextElement(); 
      for (Enumeration<InetAddress> enumerationInetAddress = networkInterface.getInetAddresses(); enumerationInetAddress.hasMoreElements();) { 
       final InetAddress inetAddress = enumerationInetAddress.nextElement(); 
       final String ipAddress = inetAddress.getHostAddress(); 
       if (! inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipAddress)) { 
        return ipAddress; 
       } 
      } 
     } 
     return null; 
    } 
    catch (final Exception e) { 
     LogHelper.wtf(null, e); 
     return null; 
    } 
} 
+1

आप क्या करने की कोशिश कर रहे हैं? यदि आप सिर्फ यह जानना चाहते हैं कि कोई आईपी आईपीवी 6 है या नहीं, तो आप 'इनट एड्रेस इंस्टेंटफ इननेट 6 एड्रेस' या 'इनट एड्रेस इन्फैंक इननेट 4 एड्रेस' की जांच कर सकते हैं। – rekire

+0

मैं एंड्रॉइड एपीआई -23 – shkschneider

+0

के साथ काम करने वाले कोड के साथ 'InetAddressUtils.isIPv4Address (ipAddress)' को प्रतिस्थापित करने का प्रयास कर रहा हूं, इसके नामों की तरह कहते हैं: यदि आईपी पता आईपीवी 4 है या नहीं https://hc.apache.org/ httpcomponents-client-ga/httpclient/apidocs/org/apache/http/conn/util/InetAddressUtils.html # isIPv4Address (java.lang.String) यह विधि अब Android API-23 में अनुपलब्ध है। मैं बस इसे बदलना चाहता हूं लेकिन मुझे अभी तक कोई विकल्प नहीं पता है। – shkschneider

उत्तर

23

जैसे कि मैंने टिप्पणियों से interprete आप इस तुलना के साथ कि समारोह की जगह ले सकता:

inetAddress instanceof Inet4Address 

तो अपने कोड में खत्म होगा:

if(!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { 
+1

ठीक है, वास्तव में 'InetAddressUtils' एंड्रॉइड के एपीआई -23 से चला गया है, लेकिन' Inet4Address' नहीं है। कामकाज के लिए धन्यवाद। – shkschneider

+0

आपका स्वागत :-) – rekire

+0

हैं या आप भी कर सकते हैं: Inet4Address.class.isInstance (inetAddress) – Bostone

2

मैं कुछ बेहतर नहीं मिल सका Inet4Address या Inet6Address

public boolean isValidIp4Address(final String hostName) { 
     try { 
     return Inet4Address.getByName(hostName) != null; 
    } catch (UnknownHostException ex) { 
     return false; 
    } 
} 

public boolean isValidIp6Address(final String hostName) { 
     try { 
     return Inet6Address.getByName(hostName) != null; 
    } catch (UnknownHostException ex) { 
     return false; 
    } 
} 
में कनवर्ट करने से

नोट, getHostByName वास्तव में लुकअप करता है, जो हमेशा वांछनीय नहीं होता है।

या, आप InetAddessUtils का स्रोत प्राप्त कर सकते हैं, जो GetByName() के विपरीत, लुकअप नहीं करता है, लेकिन केवल बिंदीदार पते स्वीकार करता है। कोड वास्तव में छोटा है। यह regexp कक्षाओं का उपयोग करता है जो एंड्रॉइड द्वारा समर्थित हैं। बस अपरिवर्तनीय एनोटेशन को हटा दें जो वास्तव में महत्वपूर्ण नहीं है, और यह संकलित होगा!

+0

' getByName() 'मुझे लगता है 'InetAddress' से विरासत की तरह। – shkschneider

0

कोशिश पकड़ तर्क भयानक व्यवहार है और अगर पूरी तरह से अपरिहार्य केवल किया जाना चाहिए के रूप में उपयोग करते हुए ..

इस बजाय की तरह कुछ का उपयोग करें:

if (inetAddress instanceof Inet4Address){ 
    //do something 
} 
1

में लाइन निम्नलिखित एसडीके 23 ऐड में इस लाइब्रेरी का उपयोग करने के प्रोजेक्ट की build.gradle फ़ाइल:

useLibrary 'org.apache.http.legacy' 
संबंधित मुद्दे