如何获取Android模拟器的IP地址?

94

我希望能够通过代码获取当前运行的Android模拟器的IP地址。如何实现?


1
也许这里(https://dev59.com/L1vUa4cB1Zd3GeqPslk9)和这里(http://stackoverflow.com/questions/13217796/is-android-avds-firewall-somehow-more-restricted-to-real-android-firewall)与之相关。 - hhh
@hhh 第二个链接已经失效了。 :) - Muhamed Huseinbašić
1
@MuhamedHuseinbašić,我觉得第二个帖子解决了问题,所以决定将其删除,以保持简单。 - hhh
7个回答

187

请澄清:在您的应用程序内,您可以简单地将仿真器称为“localhost”或127.0.0.1

Web流量通过开发机路由,因此仿真器的外部IP是由互联网提供商分配给该开发机的任何外部IP。可以始终从您的设备访问开发机位于10.0.2.2

如果启动了多个仿真器,则除非您选择一个通过仿真器的本地IP(例如adb -s 192.168.232.2:5555 shell),否则不会工作:

  • 就像真实的Android设备一样,
  • 在仿真器中,从最上方向下滑以打开菜单,
  • 在菜单中,长按WiFi,
  • 最后,进入当前WiFi连接的设置,在那里,您应该看到仿真器进程的IP。

10
我想给你的这篇文章点赞100次。在阅读了你的帖子之后,我终于搞清楚了我的应用程序如何与我运行的另一台本地服务器通信。感谢你! - Spike
你如何从10.0.2.2访问开发机?我尝试了ping,但没有反应,图片在这里(http://i.stack.imgur.com/Yjv7W.jpg)。右侧是ifconfig -app,左侧是terminal-emulator,尝试ping dev-machine。本地主机看不到任何东西,有简单的测试吗? - hhh
@hhh 您可以尝试使用JuiceSSH:https://play.google.com/store/apps/details?id=com.sonelli.juicessh 您可以从提及的IP地址或主机的真实IP地址访问您的主机。两种变体对我都有效。 - Muhamed Huseinbašić
我相信来自模拟器的流量首先会通过一个“虚拟”路由器路由(其IP地址为10.0.2.1),而不是直接路由。因此,在这个路由器10.0.2.1和主机/开发机127.0.0.1/10.0.2.2之间应该会有一个额外的连接。我通常更改要连接的端口号。 - stdout

42

如果你确实想要将IP分配给你的模拟器:

adb shell
ifconfig eth0
可能会给你类似这样的东西:
eth0: ip 10.0.2.15 mask 255.255.255.0 flags [up broadcast running multicast]
或者,如果上述方法失败,请尝试:
adb shell
ifconfig wlan0

在输出中查找inet addr:,例如,我的模拟器日志中出现了inet addr:192.168.232.2


Luise说:“我尝试了 Derek 的方法,它可以在 adb shell 中 ping。” - Tobi Nary
10
在执行adb shell命令后,我遇到了这个错误:ifconfig: eth0: No such device。你有什么想法是出现这种情况的原因吗? - awavi
5
@awavi,它可能会出现在不同的接口中,例如“wlan0”。 - William Reed

27

像这样:

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()) {
                    return inetAddress.getHostAddress().toString();
                }
            }
        }
    } catch (SocketException ex) {
        Log.e(LOG_TAG, ex.toString());
    }
    return null;
}

查看文档获取更多信息:NetworkInterface


8
不要忘记添加 'the android.permission.INTERNET' 权限。 - Stéphane
2
这个给出了IP6地址,如何获取IP4? - Akash Kava

20

使用此方法,您将获得Android模拟器的100%正确IP地址。

要获取您的模拟器的IP地址:

进入adb shell并输入此命令。

adb shell
ifconfig eth0

运行该命令后我得到了:

IP : 10.0.2.15

掩码 : 255.255.255.0

这对我很有效。我也在开发一个网络应用程序。


2
模拟器不再有“eth0”,而是有“radio0”和“wlan0”。您可能需要编辑此答案,因为它不再完全正确。 - Adam Howell
我使用的是 macOS 系统。ifconfig: en0: No such device - Dr.jacky

12
如果您需要引用主机计算机的本地主机,例如当您希望模拟器客户端与主机上运行的服务器进行通信时,请使用别名10.0.2.2来引用主机计算机的环回接口。从模拟器的角度来看,localhost (127.0.0.1)指的是它自己的环回接口。
更多详细信息请参考:https://developer.android.com/studio/run/emulator-networking#networkaddresses

这个答案对我有效。记得包括计算机的端口:http://10.0.2.2:3000/api,例如用于Web API。 - undefined

3
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()) {
                    return inetAddress.getHostAddress().toString();
                }
            }
        }
    } catch (SocketException ex) {
        Log.e(LOG_TAG, ex.toString());
    }
    return null;
}

0

在我的应用程序代码中,我可以轻松获取运行设备的IP地址,如下所示:

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接