2013-11-28 45 views
8

Tôi đang cố gắng lấy địa chỉ IP của thiết bị nhưng tất cả đều vô ích và không thành công. Tôi đã thửNhận địa chỉ IP WiFi trực tiếp của thiết bị của tôi

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

nhưng nó cho tôi 0.0.0.0 và không có phương pháp nào khác đang hoạt động .. Giúp đỡ !!

+0

Bạn đã thấy http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device – NigelK

+0

Tại sao các bạn đi qua 'WIFI_P2P_SERVICE' cho 'getSystemService()' khi bạn cần một 'WifiManager'? Bạn có nên chuyển 'Context.WIFI_SERVICE' thay thế không? – Vikram

+0

@ user2558882 gần giống như vậy. Nhưng nó sẽ không giúp tôi trong việc nhận IP trực tiếp. – Talib

Trả lời

4

gửi ra địa chỉ ip địa phương của ngang hàng (bắt đầu với 192.168.x.x) cho chủ sở hữu nhóm. Sau khi "bắt tay" này, mà không thực sự mất thời gian, đó là tất cả tốt để đi. Không tìm thấy bất kỳ cách nào khác để nhận địa chỉ IP của người ngang hàng, thông tin duy nhất được cung cấp bởi GroupListener/PeerListener/... là địa chỉ mac.

+4

vui lòng giải thích thêm. – user1850484

+0

Điều này không trả lời được câu hỏi - OP muốn biết cách nhận địa chỉ IP của riêng mình chứ không phải cách thông báo GO của địa chỉ IP đã biết. Vấn đề là chúng tôi không biết nơi để có được 192.168.x.x từ! – CodingLumis

0

Bạn có quyền trên cài đặt WiFi được đính kèm với tệp kê khai chương trình Android của mình không? Ít nhất ACCESS_WIFI_STATE là cần thiết [1]. Nếu điều đó là không đủ, có lẽ ACCESS_NETWORK_STATE cũng cần thiết [2]. Tôi đã không tìm thấy bất cứ điều gì xấu trên mã của bạn, vì vậy cố gắng chơi với Manifest sẽ là đề nghị của tôi.

Liên kết đầu tiên tôi có dưới dạng nguồn có trong câu trả lời được chấp nhận cũng được phép INTERNET, để chương trình của bạn cũng có thể liên hệ với một nơi nào đó để yêu cầu kết nối và do đó IP. Đó sẽ là sự cho phép tiếp theo để thử, nếu hai người đầu tiên không làm việc.

Bạn đã hỏi về các nguồn chính thức hoặc đáng tin cậy, đây là những nguồn đáng tin cậy. Mỗi sự bình an của thông tin được bình chọn lên trên Stackoverflow ít nhất một lần, và rằng nếu một cái gì đó nói rằng những thứ này đã làm cho nó ít nhất là cho một ai đó.

nguồn của tôi:

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

[2] Android WifiManager getConnectionInfo requires CHANGE_WIFI_STATE?

10

Cũng như tài liệu tham khảo: Tôi là nhà phát triển của WiFi-Shoot (a direct file transfer app via WiFi Direct).

Thật không may, không có cách nào để có được địa chỉ IP của riêng bạn, và nguyên tắc chung của hoạt động là hơi khác nhau:

  • Tất cả các hoạt động sẽ được thực hiện với sự WiFiP2PManager
  • gọi initialize để có được một kênh , tất cả các hoạt động khác cần kênh này.
  • sau khi bạn discoverPeersconnect để một trong số họ
  • bạn có thể requestGroupInfo sẽ cho bạn biết nếu thiết bị đó là chủ sở hữu nhóm và chủ sở hữu nhóm địa chỉ IP là gì. Vì vậy, không phải chủ sở hữu có thể kết nối với chủ sở hữu bằng địa chỉ được cung cấp và chủ sở hữu sẽ nghe các kết nối.
  • bạn cũng có thể requestPeers sẽ cung cấp cho bạn danh sách tất cả các đồng nghiệp được kết nối. Điều đó bao gồm địa chỉ MAC và tên.

Cuộc gọi Context.getSystemService(Context.WIFI_P2P_SERVICE) sẽ cung cấp cho bạn WiFiP2PManager.

Và có, bạn sẽ cần một loạt quyền WiFI chẳng hạn như ACCESS_WIFI_STATE, CHANGE_WIFI_STATE trong số những người khác.

+0

nó có nghĩa là bạn đã làm việc trong android P2P, tôi có vài câu hỏi, bạn sẽ vui lòng cho tôi địa chỉ email hoặc địa chỉ facebook của bạn, nếu bạn muốn giúp đỡ? – Talib

+0

requestGroupInfo không cung cấp cho bạn Địa chỉ IP – trampster

0

Nếu bạn đang cố gắng để có được địa chỉ IP của thiết bị khác kết nối với mạng WiFi

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

     System.out.println(Address); 

Bắt địa chỉ IP Internet i.e sống địa chỉ 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(); 
     } 

Đối với kiến ​​thức sâu hơn và phương pháp có nguồn gốc khác liên kết hoang

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

1

Sử dụng mã này

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

Và thêm sự cho phép để biểu hiện của bạn.

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

mã này sẽ cung cấp địa chỉ ip wifi từ bộ định tuyến wifi. Tôi đang tìm một mã để có được địa chỉ ip trực tiếp wifi. – user1850484

+0

trong trả lại trực tiếp Wifi: 0.0.0.0. không làm việc. – David

0

Thứ nhất, kiểm tra file manifest cho phép:

<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"/> 

Sau đó, xác định những gì đang IP tìm kiếm. Nếu bạn muốn phát sóng IP đó cho mục đích ngoài dịch vụ khám phá, hãy tìm nó bằng cách sử dụng WIFI_SERVICE. Nếu bạn tò mò về địa chỉ IP của việc phát sóng dịch vụ của bạn, cá thể NsdServiceInfo có phương thức 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

mã đẹp. cảm ơn bạn. – user1850484

+0

Ở cấp API 23, InetAddressUtils không được chấp nhận. Vì vậy, hãy kiểm tra (inetAddress instanceof Inet4Address) thay vì InetAddressUtils.isIPv4Address (sAddr) –

Các vấn đề liên quan