获取WiFi设备的直连IP地址

我试图获得我的设备的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,没有其他的方法是太工作了..帮助!

Solutions Collecting From Web of "获取WiFi设备的直连IP地址"

发送对方的本地IP地址(从192.168.xx开始)给组所有者。 经过这个“握手”,这并不是真的需要时间,这是所有的好去。 没有find任何其他方式获得对方的IP地址,由GroupListener / PeerListener / …提供的唯一信息是MAC地址。

就像参考一样:我是WiFi-Shoot(通过WiFi Direct直接传输文件的应用程序)的开发者 。

不幸的是,没有办法得到你自己的IP地址,操作的一般原则稍有不同:

  • 所有的操作将通过WiFiP2PManager进行
  • 调用initialize来获得一个Channel,所有其他的操作都需要这个Channel。
  • 在你discoverPeersconnect到其中的一个
  • 你可以requestGroupInfo告诉你,如果该设备是组的所有者和什么是组的所有者的IP地址。 所以非业主可以使用提供的地址连接到业主,业主将听取连接。
  • 你也可以requestPeers给你一个所有连接的同行的名单。 这包括MAC地址和名称。

调用Context.getSystemService(Context.WIFI_P2P_SERVICE)会给你一个WiFiP2PManager。

是的,你需要一些WiFI权限,比如ACCESS_WIFI_STATECHANGE_WIFI_STATE等等。

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

使用这个代码

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

您是否拥有连接到Android程序清单的WiFi设置的权限? 至less需要ACCESS_WIFI_STATE [1] 。 如果这还不够,可能还需要ACCESS_NETWORK_STATE [2] 。 我没有发现你的代码有什么不好,所以试图使用Manifest将是我的build议。

作为源代码的第一个链接在接受的答案中还有INTERNET权限,这样你的程序也可以联系某个地方来请求连接,从而IP。 如果这两个先不行的话,那将是下一个尝试的权限。

你询问官方或可信来源,这些来自可信的来源。 每一次信息的和平都至less在Stackoverflow上投票一次,如果有东西说这些东西已经使得它至less为某人。

我的来源:

[1] 如何从代码获取设备的IP地址?

[2] Android WifiManager getConnectionInfo需要CHANGE_WIFI_STATE?

如果您正在尝试获取连接到WiFinetworking的其他设备的IP地址

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

获得互联网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

首先,检查清单文件的权限:

 <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_SERVICEfind它。 如果您对服务广播的IP地址感到好奇,则NsdServiceInfo实例具有getHost()方法。