Android 6 (Marshmallow) Wifi + 蓝牙有时会导致 SocketTimeoutException
Android 6 (Marshmallow) Wifi + Bluetooth sometimes results in SocketTimeoutException
我们的 Android 应用程序在用户当前使用该应用程序时使用蓝牙扫描信标时遇到问题。当加载不同的视图时,该应用正在从 API 加载数据。有时,当继续单击视图时,一个请求会失败(超时),并出现此错误:
java.net.SocketTimeoutException: failed to connect to www.examplehost.com/111.222.333.444 (port 80) after 15000ms
at libcore.io.IoBridge.connectErrno(IoBridge.java:169)
at libcore.io.IoBridge.connect(IoBridge.java:122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)
at java.net.Socket.connect(Socket.java:884)
at com.android.okhttp.internal.Platform.connectSocket(Platform.java:117)
at com.android.okhttp.internal.http.SocketConnector.connectRawSocket(SocketConnector.java:434)
at com.android.okhttp.internal.http.SocketConnector.connectCleartext(SocketConnector.java:105)
at com.android.okhttp.Connection.connect(Connection.java:1331)
at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:1410)
at com.android.okhttp.OkHttpClient.connectAndSetOwner(OkHttpClient.java:128)
at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:466)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:447)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:353)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:468)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:410)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:532)
(是我们服务器的IP地址,替换成111.222.333.444)
这是一个超时(> 15 秒),而在此之前的请求相当快。
我在其他设备上没有遇到这个问题,只有在三星 S6 上更新到 Android 6.0.1 时才会遇到这个问题。因为该应用程序在前台,所以我认为它不会是 Doze 或 Standby(Android 6 中的新功能),因为该应用程序正在被积极使用。但是app在后台的时候可能会出现同样的问题(但是很难测试)。
- 关闭 Wifi(因此设备使用 4G 网络)或蓝牙(或两者)时,问题不再出现。
- 在
LG Nexus 5
(也与 Android 6.0.1)上,问题从未发生。
- 我们使用的beacon库:http://altbeacon.github.io/android-beacon-library/(2.7版)
有人知道我们应该在哪里寻找问题吗?提前致谢。
虽然这是我在 S6 上听到的第一份报告,这是 Nexus 4、Nexus 7、Moto G 和 Moto X 等其他设备上的常见问题 . 这些设备在 WiFi 和蓝牙无线电之间受到 干扰, 它们共享相同的无线电频段,并且在某些设备型号中共享芯片和天线。在 Nexus 4 和 Moto G 上,问题严重到无法在使用蓝牙扬声器的同时播放音乐。所以问题不是特定于信标。
没有已知的解决方法,但您可以检测设备型号,如果已知有问题,提示用户关闭 WiFi。甚至为用户做这件事(当然有适当的通知。)
想知道在具有更早 Android 版本的 S6 上是否存在同样的问题。如果是这样,这表明至少对于 S6 来说,固件中的修复是可能的。
完全披露:我是 Android Beacon Library 开源项目的首席开发人员。
你在使用 setHostnameVerifier(new BrowserCompatHostnameVerifier()) 吗?如果是,请将其删除,因为 Android 6.0 附带了一个新的主机名验证器。
我们的 Android 应用程序在用户当前使用该应用程序时使用蓝牙扫描信标时遇到问题。当加载不同的视图时,该应用正在从 API 加载数据。有时,当继续单击视图时,一个请求会失败(超时),并出现此错误:
java.net.SocketTimeoutException: failed to connect to www.examplehost.com/111.222.333.444 (port 80) after 15000ms
at libcore.io.IoBridge.connectErrno(IoBridge.java:169)
at libcore.io.IoBridge.connect(IoBridge.java:122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:452)
at java.net.Socket.connect(Socket.java:884)
at com.android.okhttp.internal.Platform.connectSocket(Platform.java:117)
at com.android.okhttp.internal.http.SocketConnector.connectRawSocket(SocketConnector.java:434)
at com.android.okhttp.internal.http.SocketConnector.connectCleartext(SocketConnector.java:105)
at com.android.okhttp.Connection.connect(Connection.java:1331)
at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:1410)
at com.android.okhttp.OkHttpClient.connectAndSetOwner(OkHttpClient.java:128)
at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:466)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:447)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:353)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:468)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:410)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:532)
(是我们服务器的IP地址,替换成111.222.333.444)
这是一个超时(> 15 秒),而在此之前的请求相当快。
我在其他设备上没有遇到这个问题,只有在三星 S6 上更新到 Android 6.0.1 时才会遇到这个问题。因为该应用程序在前台,所以我认为它不会是 Doze 或 Standby(Android 6 中的新功能),因为该应用程序正在被积极使用。但是app在后台的时候可能会出现同样的问题(但是很难测试)。
- 关闭 Wifi(因此设备使用 4G 网络)或蓝牙(或两者)时,问题不再出现。
- 在
LG Nexus 5
(也与 Android 6.0.1)上,问题从未发生。 - 我们使用的beacon库:http://altbeacon.github.io/android-beacon-library/(2.7版)
有人知道我们应该在哪里寻找问题吗?提前致谢。
虽然这是我在 S6 上听到的第一份报告,这是 Nexus 4、Nexus 7、Moto G 和 Moto X 等其他设备上的常见问题 . 这些设备在 WiFi 和蓝牙无线电之间受到 干扰, 它们共享相同的无线电频段,并且在某些设备型号中共享芯片和天线。在 Nexus 4 和 Moto G 上,问题严重到无法在使用蓝牙扬声器的同时播放音乐。所以问题不是特定于信标。
没有已知的解决方法,但您可以检测设备型号,如果已知有问题,提示用户关闭 WiFi。甚至为用户做这件事(当然有适当的通知。)
想知道在具有更早 Android 版本的 S6 上是否存在同样的问题。如果是这样,这表明至少对于 S6 来说,固件中的修复是可能的。
完全披露:我是 Android Beacon Library 开源项目的首席开发人员。
你在使用 setHostnameVerifier(new BrowserCompatHostnameVerifier()) 吗?如果是,请将其删除,因为 Android 6.0 附带了一个新的主机名验证器。