我可以在Android模拟器中做什么来将它连接到我的本地主机web服务器页面http://localhost或http://127.0.0.1?
我已经尝试过了,但模拟器仍然需要我的请求,如谷歌搜索localhost或更糟糕的是,它说,它没有找到页面,而我的web服务器正常运行。
我可以在Android模拟器中做什么来将它连接到我的本地主机web服务器页面http://localhost或http://127.0.0.1?
我已经尝试过了,但模拟器仍然需要我的请求,如谷歌搜索localhost或更糟糕的是,它说,它没有找到页面,而我的web服务器正常运行。
当前回答
允许安装PWA
首先,安装Android调试桥:
$ sudo apt install adb android-sdk-platform-tools-common
像往常一样启动你的Android模拟器,例如:
$ ~/Android/Sdk/emulator/emulator -avd Pixel_3a_API_30_x86
然后,在Android模拟器的网桥上配置反向代理,将localhost HTTP请求转发到运行在主机计算机上的localhost服务器的适当端口(例如8000),反之亦然:
$ adb reverse tcp:8000 tcp:8000
一个渐进web应用程序(PWA)正在localhost:8000上提供服务 或者127.0.0.1:8000将是可安装的,并连接到它的service-worker.js。而PWA安装不允许从IP地址10.0.2.2。
注意:adb reverse tcp:8000 tcp:8000需要在每次Android模拟器调用后重新发布。
因此,一个bash脚本启动一个Android模拟器,后面跟着一个反向代理,看起来像这样:
#!/usr/bin/env bash
$HOME/Android/Sdk/emulator/emulator -avd Pixel_3a_API_30_x86 > /dev/null 2>&1
adb reverse tcp:8000 tcp:8000
其他回答
如果你是在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之外。
我知道这是旧的,但如果您发现10.0.2.2不能作为计算机IP,请按照以下说明找到它
如果你使用Android模拟器:
您可以通过以下ip连接到您的Pc localhost: 10.0.2.2:{你的本地主机端口}=>如果你在xamp中设置了你的机器端口,你必须使用这个端口。在我的例子中是10.0.2.2:2080
你也可以使用你的网络适配器IP地址。在CMD中输入ipconfig并找到你的适配器IP地址:
如果模拟器不能连接到这个ip,关闭模拟器,并从AVD管理器冷引导打开它:
如果您使用Genymotion:
您可以通过此IP: 10.0.3.2:{端口号}连接到计算机localhost 或者如上所述的适配器IP地址:在我的示例中是192.168.1.3:2080