2014-12-04 98 views
0

我試圖在android中獲取ip地址,但結果是這樣的! 我想獲得我的wifi範圍的IP地址!我怎樣才能做到這一點 ?從java中獲取ip地址我得到了一些錯誤

private 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(); 
       if (!inetAddress.isLoopbackAddress()) 
       { 

        return inetAddress.getHostAddress().toString(); 

       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e("ServerActivity", ex.toString()); 
    } 
    return null; 
} 

結果是這樣的:FE80 :: 38AA:3cff:feb3:1cef%p2p0 也是我加入的Android mainfast許可:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
+0

試試這個 http://stackoverflow.com/questions/3351929/android-how-to-find-dynamic-ip-from-device – 2014-12-04 12:26:42

回答

0
Here You Will get All Details of Your Device !!! 

    //Main Classs 

     package com.example.devicedetail; 

       import android.annotation.SuppressLint; 
      import android.app.Activity; 
      import android.content.Context; 
      import android.os.Bundle; 
      import android.telephony.TelephonyManager; 
      import android.view.Menu; 

      public class Device extends Activity { 
      @SuppressLint("NewApi") 
       @Override 
       protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_device); 

        String debug2 = System.getProperty("os.version"); 
        String debug3 = android.os.Build.VERSION.RELEASE; 
        String debug4 = android.os.Build.DEVICE; 
        String debug5 = android.os.Build.MODEL; 
        String debug6 = android.os.Build.PRODUCT; 
        String debug7 = android.os.Build.BRAND; 
        String debug8 = android.os.Build.DISPLAY; 
        String debug9 = android.os.Build.CPU_ABI; 
        String debug10 = android.os.Build.CPU_ABI2; 
        String debug11 = android.os.Build.UNKNOWN; 
        String debug12 = android.os.Build.HARDWARE; 
        String debug13 = android.os.Build.ID; 
        String debug14 = android.os.Build.MANUFACTURER; 
        String debug15 = android.os.Build.SERIAL; 
        String debug16 = android.os.Build.USER; 
        String debug17 = android.os.Build.HOST; 

        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
        String imei = telephonyManager.getDeviceId(); 
        String macwlan = Utils.getMACAddress("wlan0"); 
        String macethr = Utils.getMACAddress("eth0"); 
        String ip4 = Utils.getIPAddress(true); // IPv4 
        String ip36 = Utils.getIPAddress(true); // IPv6 

       } 

       @Override 
       public boolean onCreateOptionsMenu(Menu menu) { 
        // Inflate the menu; this adds items to the action bar if it is present. 
        getMenuInflater().inflate(R.menu.activity_device, menu); 
        return true; 
       } 

      } 



    ---------- 




     //Util Class 

     package com.example.devicedetail; 

     import android.annotation.SuppressLint; 
     import java.io.*; 
     import java.net.*; 
     import java.util.*; 
     import org.apache.http.conn.util.InetAddressUtils; 

     public class Utils { 

      /** 
      * Convert byte array to hex string 
      * @param bytes 
      * @return 
      */ 
      public static String bytesToHex(byte[] bytes) { 
       StringBuilder sbuf = new StringBuilder(); 
       for(int idx=0; idx < bytes.length; idx++) { 
        int intVal = bytes[idx] & 0xff; 
        if (intVal < 0x10) sbuf.append("0"); 
        sbuf.append(Integer.toHexString(intVal).toUpperCase()); 
       } 
       return sbuf.toString(); 
      } 

      /** 
      * Get utf8 byte array. 
      * @param str 
      * @return array of NULL if error was found 
      */ 
      public static byte[] getUTF8Bytes(String str) { 
       try { return str.getBytes("UTF-8"); } catch (Exception ex) { return null; } 
      } 

      /** 
      * Load UTF8withBOM or any ansi text file. 
      * @param filename 
      * @return 
      * @throws java.io.IOException 
      */ 
      public static String loadFileAsString(String filename) throws java.io.IOException { 
       final int BUFLEN=1024; 
       BufferedInputStream is = new BufferedInputStream(new FileInputStream(filename), BUFLEN); 
       try { 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFLEN); 
        byte[] bytes = new byte[BUFLEN]; 
        boolean isUTF8=false; 
        int read,count=0;   
        while((read=is.read(bytes)) != -1) { 
         if (count==0 && bytes[0]==(byte)0xEF && bytes[1]==(byte)0xBB && bytes[2]==(byte)0xBF) { 
          isUTF8=true; 
          baos.write(bytes, 3, read-3); // drop UTF8 bom marker 
         } else { 
          baos.write(bytes, 0, read); 
         } 
         count+=read; 
        } 
        return isUTF8 ? new String(baos.toByteArray(), "UTF-8") : new String(baos.toByteArray()); 
       } finally { 
        try{ is.close(); } catch(Exception ex){} 
       } 
      } 

      /** 
      * Returns MAC address of the given interface name. 
      * @param interfaceName eth0, wlan0 or NULL=use first interface 
      * @return mac address or empty string 
      */ 
      @SuppressLint("NewApi") 
      public static String getMACAddress(String interfaceName) { 
       try { 
        List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); 
        for (NetworkInterface intf : interfaces) { 
         if (interfaceName != null) { 
          if (!intf.getName().equalsIgnoreCase(interfaceName)) continue; 
         } 
         byte[] mac = intf.getHardwareAddress(); 
         if (mac==null) return ""; 
         StringBuilder buf = new StringBuilder(); 
         for (int idx=0; idx<mac.length; idx++) 
          buf.append(String.format("%02X:", mac[idx]));  
         if (buf.length()>0) buf.deleteCharAt(buf.length()-1); 
         return buf.toString(); 
        } 
       } catch (Exception ex) { } // for now eat exceptions 
       return ""; 
       /*try { 
        // this is so Linux hack 
        return loadFileAsString("/sys/class/net/" +interfaceName + "/address").toUpperCase().trim(); 
       } catch (IOException ex) { 
        return null; 
       }*/ 
      } 

      /** 
      * Get IP address from first non-localhost interface 
      * @param ipv4 true=return ipv4, false=return ipv6 
      * @return address or empty string 
      */ 
      public static String getIPAddress(boolean useIPv4) { 
       try { 
        List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); 
        for (NetworkInterface intf : interfaces) { 
         List<InetAddress> addrs = Collections.list(intf.getInetAddresses()); 
         for (InetAddress addr : addrs) { 
          if (!addr.isLoopbackAddress()) { 
           String sAddr = addr.getHostAddress().toUpperCase(); 
           boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); 
           if (useIPv4) { 
            if (isIPv4) 
             return sAddr; 
           } else { 
            if (!isIPv4) { 
             int delim = sAddr.indexOf('%'); // drop ip6 port suffix 
             return delim<0 ? sAddr : sAddr.substring(0, delim); 
            } 
           } 
          } 
         } 
        } 
       } catch (Exception ex) { } // for now eat exceptions 
       return ""; 
      } 

     } 



    ---------- 



     //PerMissions 

     <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
     <uses-permission android:name="android.permission.INTERNET" /> 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
0

我用這個

try{ 
      WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); 
      int ipAddress = wm.getDhcpInfo().ipAddress; 
      byte[] ipAddressbyte = BigInteger.valueOf(ipAddress).toByteArray(); 
      for(int i = 0; i < ipAddressbyte.length/2; i++){ 
       int temp = ipAddressbyte[i]; 
       ipAddressbyte[i] = ipAddressbyte[ipAddressbyte.length - i - 1]; 
       ipAddressbyte[ipAddressbyte.length - i - 1] = (byte) temp; 

      } 

      InetAddress myaddr = InetAddress.getByAddress(ipAddressbyte); 
      String hostaddr = myaddr.getHostAddress(); // numeric representation (such as "127.0.0.1") 
      Log.d("INET",hostaddr); 
     }catch (Exception e){ 
      Log.d("Exception",e.getMessage()); 
     } 
+0

我得到errror FO 「formatIpAddress」! – 2014-12-04 12:28:16

+0

你能否發佈錯誤? – 2014-12-04 12:29:57

+0

formatIpAddress無法識別它!你能告訴我那是什麼嗎? – 2014-12-04 12:31:37

0

答案沒有錯,這是ipv6地址,如果你想把它作爲ipv4。你可以嘗試以下

inetAddress.getLocalHost().getHostAddress(); 
+0

我的應用程序將崩潰時,我使用它! – 2014-12-04 12:55:33

0

這是我是如何做到通過點擊設備的IP地址之間就改變,你可能必須使它適合自己的喜好了一下。僅限本地IP,而不是外部。

<uses-permission android:name="android.permission.INTERNET" /> 

private Enumeration<NetworkInterface> networkInterfaces = null; 
private Enumeration<InetAddress> networkAddresses = null; 

... 
    if(wb == this.ipDisplayButton) 
    { 
     try 
     { 
      while(true) 
      { 
       if(this.networkInterfaces == null) 
       { 
        networkInterfaces = NetworkInterface.getNetworkInterfaces(); 
       } 
       if(networkAddresses == null || !networkAddresses.hasMoreElements()) 
       { 
        if(networkInterfaces.hasMoreElements()) 
        { 
         NetworkInterface networkInterface = networkInterfaces.nextElement(); 
         networkAddresses = networkInterface.getInetAddresses(); 
        } 
        else 
        { 
         networkInterfaces = null; 
        } 
       } 
       else 
       { 
        if(networkAddresses.hasMoreElements()) 
        { 
         String address = networkAddresses.nextElement().getHostAddress(); 
         if(address.contains(".")) //IPv4 
         { 
          ipDisplay.setText("IP Address: " + address); 
         } 
         break; 
        } 
        else 
        { 
         networkAddresses = null; 
        } 
       } 
      } 
     } 
     catch(SocketException e) 
     { 
      e.printStackTrace(); 
     } 
    }