2013-11-28 433 views
8

我試圖獲取我的設備的IP地址,但都是徒勞,沒有成功。我試過獲取WiFi我的設備的直接IP地址

public String getP2PIpAddr() { 
     WifiManager wifiManager = (WifiManager) getSystemService(WIFI_P2P_SERVICE); 
     WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
     int ip = wifiInfo.getIpAddress(); 

     String ipString = String.format(
     "%d.%d.%d.%d", 
     (ip & 0xff), 
     (ip >> 8 & 0xff), 
     (ip >> 16 & 0xff), 
     (ip >> 24 & 0xff)); 

     return ipString; 
    } 

但它給了我0.0.0.0並沒有其他方法工作太..幫助!

+0

你見過http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device – NigelK

+0

爲什麼你傳遞'WIFI_P2P_SERVICE'到'getSystemService()'當你需要一個WifiManager嗎?你不應該傳遞'Context.WIFI_SERVICE'嗎? – Vikram

+0

@ user2558882它幾乎是一樣的東西。但它不會幫助我獲得WiFi Direct IP。 – Talib

回答

4

發出對端的本地IP地址(以192.168.x.x)到組所有者。在這個「握手」之後,這並不是真正需要時間的,這一切都很好。沒有找到任何其他方式來獲得對方的IP地址,由GroupListener/PeerListener/...提供的唯一信息是MAC地址。

+4

請進一步解釋。 – user1850484

+0

這沒有回答這個問題--OP想知道如何獲得自己的IP地址,而不是如何通知GO已知的IP地址。關鍵是我們不知道從哪裏得到192.168.x.x! – CodingLumis

0

您是否擁有連接到Android程序清單的WiFi設置的權限?需要至少ACCESS_WIFI_STATE[1]。如果這還不夠,大概ACCESS_NETWORK_STATE也需要[2]。我沒有發現你的代碼有什麼不好的地方,所以試圖玩Manifest就是我的建議。

我作爲源的第一個鏈接在接受的答案中也有INTERNET權限,以便您的程序也可以聯繫某處以詢問連接並因此獲得IP。如果這兩個先不起作用,那將是下一個嘗試的權限。

您問及官方或可信來源,這些來自可信的來源。每一次信息的和平都會在Stackoverflow上投票至少一次,並且如果有人說這些東西已經使其至少成爲某人的話。

我的來源:

[1] How to get IP address of the device from code?

[2] Android WifiManager getConnectionInfo requires CHANGE_WIFI_STATE?

10

正如參考:我是WiFi-Shoot (a direct file transfer app via WiFi Direct)的顯影劑。

不幸的是,有沒有辦法讓自己的IP地址,操作的一般原理略有不同:

  • 所有的操作將與WiFiP2PManager
  • 呼叫initialize得到一個頻道進行,所有其他的操作都需要這個頻道。
  • discoverPeersconnect他們
  • 之一後,您可以requestGroupInfo會告訴你,如果該設備是羣主,什麼是羣主的IP地址。所以非業主可以使用提供的地址連接到業主,業主將聽取連接。
  • 你也可以requestPeers這將給你一個所有連接的同行的名單。這包括MAC地址和名稱。

電話Context.getSystemService(Context.WIFI_P2P_SERVICE)會給你一個WiFiP2PManager。

是的,你需要一堆WiFI許可,例如ACCESS_WIFI_STATE,CHANGE_WIFI_STATE等等。

+0

這意味着你已經在android的P2P工作,我有幾個問題,請你給我你的電子郵件地址或Facebook地址,如果你想幫助? – Talib

+0

requestGroupInfo不會給你一個IP地址 – trampster

0

如果你試圖讓連接到WiFi網絡

try { 
      Address = InetAddress.getLocalHost(); 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     System.out.println(Address); 

獲取Internet IP地址我其他設備的IP地址。Ë現場IP地址

String myUrl = "http://api.externalip.net/ip"; 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(myUrl); 

     try{ 
      HttpResponse httpResponse = httpClient.execute(httpGet); 
      HttpEntity ht = httpResponse.getEntity(); 
      BufferedHttpEntity buf = new BufferedHttpEntity(ht); 
      InputStream is = buf.getContent(); 
      BufferedReader r = new BufferedReader(new InputStreamReader(is)); 
      StringBuilder total = new StringBuilder(); 
      String ipaddress = r.readLine(); 
      Toast.makeText(getApplicationContext(),"Live IP : " + ipaddress, Toast.LENGTH_LONG).show(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

更多更深的知識和其他本地方法休耕鏈接

http://developer.android.com/guide/topics/connectivity/wifip2p.html

1

使用此代碼

WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE); 
WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); 
int ip = wifiInfo.getIpAddress(); 
String ipAddress = Formatter.formatIpAddress(ip); 

而且允許添加到您的清單。

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

這段代碼將提供來自wifi路由器的wifi ip地址。我正在尋找一個代碼來獲取wifi-direct ip地址。 – user1850484

+0

在Wifi直接返回:0.0.0.0。不起作用。 – David

0

首先,檢查清單文件權限:

<uses-permission 
    android:required="true" 
    android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission 
    android:required="true" 
    android:name="android.permission.CHANGE_WIFI_STATE"/> 
<uses-permission 
    android:required="true" 
    android:name="android.permission.INTERNET"/> 

然後,定義什麼是IP尋找。如果您想要將該IP廣播用於服務發現之外,請使用WIFI_SERVICE進行查找。如果您對服務廣播的IP地址感到好奇,則NsdServiceInfo實例具有getHost()方法。

3
public static String getIpAddress() { 
    try { 
     List<NetworkInterface> interfaces = Collections 
       .list(NetworkInterface.getNetworkInterfaces()); 
     /* 
     * for (NetworkInterface networkInterface : interfaces) { Log.v(TAG, 
     * "interface name " + networkInterface.getName() + "mac = " + 
     * getMACAddress(networkInterface.getName())); } 
     */ 

     for (NetworkInterface intf : interfaces) { 
      if (!getMACAddress(intf.getName()).equalsIgnoreCase(
        Globals.thisDeviceAddress)) { 
       // Log.v(TAG, "ignore the interface " + intf.getName()); 
       // continue; 
      } 
      if (!intf.getName().contains("p2p")) 
       continue; 

      Log.v(TAG, 
        intf.getName() + " " + getMACAddress(intf.getName())); 

      List<InetAddress> addrs = Collections.list(intf 
        .getInetAddresses()); 

      for (InetAddress addr : addrs) { 
       // Log.v(TAG, "inside"); 

       if (!addr.isLoopbackAddress()) { 
        // Log.v(TAG, "isnt loopback"); 
        String sAddr = addr.getHostAddress().toUpperCase(); 
        Log.v(TAG, "ip=" + sAddr); 

        boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); 

        if (isIPv4) { 
         if (sAddr.contains("192.168.49.")) { 
          Log.v(TAG, "ip = " + sAddr); 
          return sAddr; 
         } 
        } 

       } 

      } 
     } 

    } catch (Exception ex) { 
     Log.v(TAG, "error in parsing"); 
    } // for now eat exceptions 
    Log.v(TAG, "returning empty ip address"); 
    return ""; 
} 

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

不錯的代碼。謝謝。 – user1850484

+0

在API級別23中,不推薦使用InetAddressUtils。因此,請檢查(inetAddress instanceof Inet4Address)而不是InetAddressUtils.isIPv4Address(sAddr) –

相關問題