我在使用小米 Mi 9 SE 开发的应用程序中遇到问题,而我的其他(较旧)手机(例如 BQ M5 或某些三星)则没有这个问题。
我的APP连接到Web服务以获取一些信息。我有这个 Web 服务的 3 个环境:测试(在本地 LAN 中的 PC 中)、预生产和生产。
测试:“http://10.60.8.223:8080/ws/webservice.wsdl”; (小米连接不上,其他可以连接)
PRE:“https://ws-pre.myaplication.com/ws/webservice.wsdl”; (全部连接正确)
专业版:“https://ws-pro.myaplication.com/ws/webservice.wsdl”; (全部连接正确)
使用任何其他手机,我可以连接到 3 个环境,但是使用小米,我无法连接到我正在调试 Web 服务的 TEST url。
你知道发生了什么事吗? 我可以尝试什么? 也许小米阻止了http连接但承认了https?
提前非常感谢您。 阿德里安。
我已经解决了:
在RES文件夹中创建一个名为network_security_config.xml的xml文件。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:android="http://schemas.android.com/apk/res/android">
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
在 Android Manifest 中,应用程序标签内:
<application
...
android:networkSecurityConfig="@xml/network_security_config">
你也可以这样做。
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
如果其他人也有同样的问题,并且“网络安全配置”仍然不允许来自小米的连接,但该应用程序可以在其他设备上使用,并且您不断收到类似的信息:
"connect failed: EACCES (Permission denied)"
D/client: java.net.ConnectException: failed to connect to /192.168.100.6 (port 8089) from /:: (port 48643): connect failed: EACCES (Permission denied)
W/System.err: java.net.ConnectException: failed to connect to /192.168.100.6 (port 8089) from /:: (port 48643): connect failed: EACCES (Permission denied)
at libcore.io.IoBridge.connect(IoBridge.java:137)
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:137)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
at java.net.Socket.connect(Socket.java:621)
at java.net.Socket.connect(Socket.java:570)
at java.net.Socket.<init>(Socket.java:450)
at java.net.Socket.<init>(Socket.java:292)
at twenkid.android.basic.recreatetwenkid_reader_1.MultiTouchActivity$ClientThread.run(MultiTouchActivity.java:207)
at java.lang.Thread.run(Thread.java:764)
W/System.err: Caused by: android.system.ErrnoException: connect failed: EACCES (Permission denied)
at libcore.io.Linux.connect(Native Method)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:118)
at libcore.io.IoBridge.connectErrno(IoBridge.java:151)
at libcore.io.IoBridge.connect(IoBridge.java:129)
... 11 more`
然后:
从手机的 GUI 中卸载该应用程序,并在下次从 PC/Android Studio 等运行时再次安装它。 最终为我解决了这个问题...我们假设当我们按“运行”时,更新后会重新安装该应用程序在 IDE 中,但这些权限似乎没有更新,至少在我的手机上是这样。
感谢 Adrian,在重新阅读提供的网络安全明文配置后,我意识到/回忆起立即尝试重新安装,该配置比我迄今为止使用的版本更短,但我的和这个都不起作用(我的也包括域...,即使有特定的 LAN 地址,甚至端口)。
另一种可能的设置是特定站点和地址的域配置。
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">example.com</domain>
</domain-config>
https://developer.android.com/privacy-and-security/security-config