2016-09-16 110 views
0

這裏有一個獲取IP地址的問題。我已經看到所有可能的方式來刪除已棄用的formatIpAddress但沒有任何東西給我正確的解決方案我已經使用MAC地址完全相同的方式,我得到了Mac地址但是當我使用IP地址輸出是0.0.0.0。問題在IP地址

的代碼是:

WifiManager wifiManager = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE); 
    WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
    //Ip Address 
    int ipAddress = wifiInfo.getIpAddress(); 
    String ip = Formatter.formatIpAddress(wifiManager.getConnectionInfo().getIpAddress()); 
    TextView ip_address= (TextView) v.findViewById(R.id.ip_address_mobfragment); 
    ip_address.setText(""+ip); 
+0

奇怪的東西,檢查你的代碼,得到的結果詮釋ip地址= -1879004992,字符串IP = 192.168.0.144 – DEADMC

+0

那麼什麼是解決方案嗎? – Abhi

+0

嗯,你的測試環境是什麼?模擬器,真實設備,...?它連接到互聯網嗎? – jdstaerk

回答

0

嗯,我有我自己的疑難問題的解決方案已經用這種方法來打印IP

這裏是我的代碼:

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


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(); 
        //boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); 
        boolean isIPv4 = sAddr.indexOf(':')<0; 

        if (useIPv4) { 
         if (isIPv4) 
          return sAddr; 
        } else { 
         if (!isIPv4) { 
          int delim = sAddr.indexOf('%'); // drop ip6 zone suffix 
          return delim<0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase(); 
         } 
        } 
       } 
      } 
     } 
    } catch (Exception ex) { } // for now eat exceptions 
    return ""; 
} 

,並在那裏我必須使用活動是:

String ip=Utils.getIPAddress(true); 
0

沒有你添加的權限,您的清單(不太清楚,如果你需要他們TBH)?

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

是的,我已經獲得清單許可。 – Abhi

0

試試這個工作對我來說

WifiManager wm = (WifiManager)getActivity().getSystemService(getActivity().WIFI_SERVICE); 
    String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress()); 
    Log.d("ipaddress",""+ip); 

AndroidManifest.xml中

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

0.0.0.0來自您的解決方案。 – Abhi

+0

添加權限ACCESS_WIFI_STATE –

+0

我已經完成了更早的權限。 – Abhi