我可以在Android模拟器中做什么来将它连接到我的本地主机web服务器页面http://localhost或http://127.0.0.1?

我已经尝试过了,但模拟器仍然需要我的请求,如谷歌搜索localhost或更糟糕的是,它说,它没有找到页面,而我的web服务器正常运行。


当前回答

公认的答案是正确的,但对我的情况不适用。我必须在主机上关闭公司VPN-client的情况下创建虚拟设备。这是完全可以理解的,因为许多公司网络使用以10开头的地址(专用网络范围),这可能会干扰特殊地址10.0.2.2

其他回答

我知道这是旧的,但如果您发现10.0.2.2不能作为计算机IP,请按照以下说明找到它

如果你是在windows下,你可以去simbol system,写ipconfig,检查分配给你机器的ip是什么。

对于我的Mac OS mountain Lion设备:

http://10.0.2.2:8888

工作完美!

尽管阅读了这里和其他地方的所有答案,我还是花费了几个小时试图调试这个问题,因为地址10.0.2.2无法工作,即使在Chrome浏览器中也是如此。如果同样的情况发生在您身上,这里有一个逐步的指南,尝试调试并希望解决您的问题。

检查模拟器网关是否为10.0.2.2

在模拟的Android中,进入设置> WiFi,检查它是否连接到AndroidWiFi热点(代表你的主机),然后点击底部的高级,然后检查网关地址:它应该指向10.0.2.2。如果不是,那么你有另一个问题,也许改变代理设置可以解决你的问题,看看这里如何与Android Studio自2022年,因为代理设置现在隐藏起来:如何在模拟器中配置代理在新版本的Android Studio?

检查您的服务器是否可以从主机计算机访问

只需打开web浏览器,输入http://localhost:<port>,查看您的本地web应用程序是否可访问。如果不是,那么您的本地服务器参数可能有问题。

检查您的服务器是否可以从模拟器访问

打开Chrome浏览器,将其指向http://10.0.2.2:<端口>(对于genymotion,替换为http://10.0.3.2:<端口>)。如果你的网页应用出现了,很好,你就完成了。如果不是,那么测试下面的其他步骤以查明根源问题。

使用另一台服务器进行测试

如果您的web应用程序可以从您的主机计算机访问,但不能在模拟器中访问,根本原因可能是您的本地服务器出于某种原因限制了对某些接口的访问,可能是出于安全原因。

要检查这一点,请尝试使用另一个服务器,只需一个简单的HTTP服务器即可,例如HTTP -server with nodejs,或python -m HTTP。服务器8000使用Python 3。

然后,尝试从模拟器的Chrome浏览器(例如http://10.0.2.2:8000)访问这个简单的服务器。如果它工作,那么这确认您的本地服务器限制了对某些接口的访问。您需要阅读本地服务器的文档以扩大权限。

例如,在我的例子中,我的服务器是angular-cli (AngularJS),默认情况下只限制为localhost服务。为了让它工作,我必须使用ng serve——disable-host-check——host 0.0.0.0而不是仅仅使用ng serve,就像在另一个问题中建议的那样。——host 0.0.0.0指示web服务器为所有接口服务。类似的参数可以提供给大多数web服务器。

另一种方法可能是禁用一些未使用的适配器,特别是虚拟适配器,例如vpn。

您的Android应用程序的权限清除文本

Now, your web app should be accessible from inside the emulator, using Chrome app, with the URL http://10.0.2.2:<port>. The last piece of the puzzle is to add permissions in your Android app to access 10.0.2.2 and especially cleartext if your local webserver is not equipped with a SSL certificate (the most likely scenario for a local development webserver - just check if https://localhost:<port> works or only http://localhost:<port> from the host computer). This will allow your Android app to access your local webserver, just like Chrome does.

添加特定的权限来访问明文(例如,从Android 9 (API 28)起,从Android应用程序访问http://)是必要的。有几种方法可以配置您的Android应用程序来添加此权限,请参阅:https://stackoverflow.com/a/50834600/1121352

结论

从Android模拟器访问主机可能很棘手,但通过仔细的逐步调试,在大多数情况下都有可能克服这个问题。

最后一个选择,可能更快,是获得付费订阅服务,如ngrok,但免费版是无用的,因为他们必须在web浏览器中打开web应用程序,在你的Android应用程序的webview之外。

你可以在每次运行模拟器时使用localhost:8000来连接到你机器的localhost(仅在Mac上测试):

adb reverse tcp:8000 tcp:8000

只要把它放到Android Studio终端。

它基本上设置了一个反向代理,其中运行在您的手机上的http服务器接受端口上的连接,并将它们连接到您的计算机,反之亦然。