我正在尝试获取设备的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 :(得分:11)
正如参考:我是WiFi-Shoot (a direct file transfer app via WiFi Direct)的开发者。
不幸的是,没有办法获得自己的IP地址,操作的一般原则略有不同:
initialize
以获取频道,所有其他操作都需要此频道。discoverPeers
和connect
之后requestGroupInfo
告诉您该设备是否是群组所有者以及群组所有者的IP地址是什么。因此,非所有者可以使用提供的地址连接到所有者,所有者将收听连接。requestPeers
为您提供所有已连接对等方的列表。这包括MAC地址和名称。通话Context.getSystemService(Context.WIFI_P2P_SERVICE)
将为您提供WiFiP2P管。
是的,您需要一堆WiFI权限,例如ACCESS_WIFI_STATE
,CHANGE_WIFI_STATE
等。
答案 1 :(得分:4)
将对等方的本地IP地址(以192.168.x.x开头)发送给组所有者。在这次“握手”之后,这并不需要时间,这一切都很好。没有找到任何其他方式来获取对等方的IP地址,GroupListener / PeerListener / ...提供的唯一信息是mac地址。
答案 2 :(得分: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; }
*/
}
答案 3 :(得分: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?
答案 4 :(得分:0)
如果您尝试获取连接到WiFi网络的其他设备的IP地址
try {
Address = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Address);
获取Internet 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
答案 5 :(得分: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()方法。
答案 6 :(得分:-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" />