我需要在托管热点时找到设备的IP地址。到目前为止我已经使用过这段代码了:
//if is using Hotspot
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
if (intf.getName().contains("wlan")) {
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && (inetAddress.getAddress().length == 4)) {
return inetAddress.getHostAddress();
}
}
}
}
这很好用,但wifi NetworkInterface
名称在某些设备上有所不同。所以我必须首先找到设备的wifi NetworkInterface
名称(针对其热点)。我怎么能找到这个名字?或者是否有更好的方法来查找设备的IP地址?
///通过MAC查找正确的IP地址似乎也不起作用
答案 0 :(得分:11)
首先,我尝试获取WiFi接口的MAC地址,将其与每个接口的MAC地址进行比较。但事实证明,至少在运行CM的N4上,打开热点时WiFi接口的MAC会发生变化。
所以我写了一些代码来遍历设备列表,找到识别wifi接口的东西。这段代码完全适用于我的N4:
private String getWifiIp() throws SocketException {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
if (intf.isLoopback()) {
continue;
}
if (intf.isVirtual()) {
continue;
}
if (!intf.isUp()) {
continue;
}
if (intf.isPointToPoint()) {
continue;
}
if (intf.getHardwareAddress() == null) {
continue;
}
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses();
enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (inetAddress.getAddress().length == 4) {
return inetAddress.getHostAddress();
}
}
}
return null;
}
只有一个界面符合所有条件:wlan0
。
可能的其他解决方案:
走一些最常见的界面名称并尝试在列表中找到它们:new String[] { "wlan0", "eth0", ...];
答案 1 :(得分:9)
我最近发现WifiAP IP地址在Android中是硬编码的。除非用户手动更改此值(我认为这是非常罕见的)使用硬编码值绝对足够。我认为这是最好的方式。 IP地址是&#34; 192.168.43.1&#34; :https://github.com/CyanogenMod/android_frameworks_base/blob/cm-10.1/wifi/java/android/net/wifi/WifiStateMachine.java?source=c#L1299
答案 2 :(得分:2)
这可以帮到你。
调用shell来询问网络适配器并检查你需要的那些就像是wlan所以请遵循以下代码
Process p=Runtime.getRuntime().exec("ip link show | grep -o \": wlan[0-9]:\" ");
BufferedReader readCommandOutput =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line=null;
while((line=readCommandOutput.readLine())!=null){
// Lines containing wlan will be returned
// parse to get the name of that interface.
String interface=line.split(":")[1];
//this is the interface you need.
}
if (line==null){
//nothing was found.
}
readCommandOutput.close();
附加说明
或者您可以使用Play商店中的Android终端仿真器,以便在android shell中运行此命令。
用于检索IP地址
WifiManager wifi=(WifiManager)getSystemService(WIFI_SERVICE);
int address=wifi.getDhcpInfo().ipAddress;
Toast.makeText(this,intToIP(address),1).show();
public String intToIP(int i) {
return ((i & 0xFF)
+ "." + ((i >> 8) & 0xFF)
+ "." + ((i >> 16) & 0xFF)
+ "." + ((i >> 24) & 0xFF));
}
答案 3 :(得分:1)
当你想在同一设备上获取热点设备的ip而不知道如何在连接的设备上获取它时,此解决方案有效 (主要是服务器的IP是192.168.43.1,你可以通过硬编码来完成工作)
public void serverip()
{
DhcpInfo dhcpInfo = wifiManager.getDhcpInfo();
if (dhcpInfo==null){
Toast.makeText(MainActivity.this, "No ip for server", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "ip of server "+android.text.format.Formatter.formatIpAddress(dhcpInfo.gateway), Toast.LENGTH_SHORT).show();
}
}
答案 4 :(得分:0)
请将intf.getName()
替换为intf.getDisplayName()
,然后尝试。
答案 5 :(得分:0)
尝试此代码:
public String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
String ip = Formatter.formatIpAddress(inetAddress.hashCode());
Toast.makeText(getApplicationContext(), "***** IP="+ ip, 1).show();
return ip;
}
}
}
} catch (SocketException ex) {
Toast.makeText(getApplicationContext(), "***** IP="+ex.toString(), 1).show();
}
return null;
}
在oncreate上编写代码进行检查,热点已启用不是.....
WifiManager wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);
wifiManager.setWifiEnabled(false);
boolean wifiEnabled = wifiManager.isWifiEnabled();
if (wifiEnabled) {
Toast.makeText(getApplicationContext(),"on",Toast.LENGTH_SHORT).show();
getLocalIpAddress();
}else {
Toast.makeText(getApplicationContext(),"off",Toast.LENGTH_SHORT).show();
}
答案 6 :(得分:0)
除非用户手动更改此值(我认为这非常罕见),否则使用硬编码值绝对足够。我认为这是最好的方式。 IP地址为“192.168.43.1”,as seen here。
这适用于我的三星A3和华为PRA-LX1,但HTC Desires 530也可以返回192.168.1.1
。