【问题标题】:HttpURLConnection.connect() fails after network reconnection on Android 10在 Android 10 上重新连接网络后,HttpURLConnection.connect() 失败
【发布时间】:2021-03-21 01:46:52
【问题描述】:

我的应用使用其 WiFi 连接到外部设备(该设备用作服务器)。随着 Android 10 的推出,我需要为不同的平台实现单独的 WiFi 连接流(WifiNetworkSpecifier 用于 Android 10+,wifiManager.enableNetwork 用于

在应用程序中,我可以将文件上传到该外部设备。为此,我需要使用HttpURLConnection。所以我跑了:

val url = URL(UPDATE_FIRMWARE_URL)
val connection = (url.openConnection() as HttpURLConnection)
with(connection) {
    doInput = true
    doOutput = true
    useCaches = false
    requestMethod = METHOD_POST
    //setRequestProperty(HEADER_CONNECTION, "Keep-Alive")
    setRequestProperty("Connection", "close")
    connectTimeout = 6000
    setRequestProperty(HEADER_USER_AGENT, "Android Multipart HTTP Client 1.0")
    setRequestProperty(HEADER_CONTENT_TYPE, "multipart/form-data; boundary=$boundary")
}
connection.connect()

val outputStream = connection.outputStream
DataOutputStream(outputStream).use { outputStream ->
  // actual file upload
}

现在,实际更新包含两个文件,第一次上传后设备重启,我需要重新连接到它的wifi并上传第二个文件。

在 Android connection.connect() 时,我得到 ConnectExcpetion 内部原因connect failed: ENETUNREACH (Network is unreachable)(这真的没有意义,因为我连接到那个网络......)

java.net.ConnectException: Failed to connect to (...)
        at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:1409)
        at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:1359)
        at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:221)
        at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:144)
        at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:106)
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:400)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:333)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:483)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:135)

最初我在 Android 10 上第一次连接时也遇到了问题,但我找到了 this 文章,并添加了 connectTimeout 帮助,但现在当我尝试第二次连接时连接仍然失败(并且每个下次。唯一有帮助的是重新启动整个应用程序(这不是真正的解决方案)。

尽管我总是执行相同的代码,但下一个连接失败可能是什么问题?

【问题讨论】:

  • 我会很感激任何评论为什么我的问题应该得到-1...如果我可以改进我的问题,我会很乐意这样做。显然,Android 10 的行为似乎发生了一些变化,所以我想知道如何才能过度使用它。

标签: android httpurlconnection android-wifi android-10.0


【解决方案1】:

几天后,我终于找到了问题的答案。事实证明,在 Android 10 上,当您连接到不提供互联网的接入点(例如我的外部设备)时,标准 API 调用(使用 Retrofit)工作正常,但在尝试使用 HttpURLConnection 时,系统会尝试使用一些有互联网连接的网络,由于没有,连接失败。

连接正常工作的唯一方法是使用ConnectivityManager.bindProcessToNetwork(network) 强制系统使用我们的网络。这个解决方案是here 提出的,我不知道为什么有人反对这个答案。没错。

有趣的是,如果我们通过设备设置连接到无互联网的网络,即使没有绑定也可以正常连接。

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2011-06-23
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多