![](/img/trans.png)
[英]ConnectionManager not giving network callbacks when using `TRANSPORT_CELLULAR`
[英]Android TRANSPORT_CELLULAR network not available if wifi is connected. How do we make it available?
在我連接 wifi 的那一刻,即使蜂窩網絡指示燈肯定亮起,蜂窩網絡也會完全丟失。
這是我的網絡請求
val request = NetworkRequest.Builder().run {
addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
build()
}
connectivityManager.registerNetworkCallback(request, callback)
我試過查看connectivityManager.allNetworks
列表,但找不到它。 只有wifi網絡在那里。
更奇怪的是,還有一個始終存在的其他蜂窩網絡。 它沒有與我的蜂窩網絡相同的 ID。 沒有任何聯系可以與之建立聯系。 它永遠不會出現在registerNetworkCallback
中。 它的功能總是包括“有效”和“互聯網”
我在這里看到了什么? 為什么我的蜂窩網絡丟失了? 這個幻像蜂窩網絡是什么?
蜂窩網絡沒有丟失,但您的應用不允許使用它。 連接 WiFi 后,一切都被迫使用該連接。 此規則的唯一例外是如果您的手機具有稱為“雙加速”的功能,該功能允許蜂窩連接保持活動狀態(顯然,用戶必須啟用該功能)。 或者,您可能在手機的開發人員選項中有一個名為“蜂窩數據始終處於活動狀態”的設置,它會做同樣的事情。
但不用說,您不能依賴在生產環境中啟用的這兩個功能中的任何一個。 因此,只需假設當 WiFi 連接時,這是您的應用程序可以使用的唯一連接
我想通了。
如果您調用registerNetworkCallback
會發生上述情況,但是如果您使用TRANSPORT_CELLULAR
調用requestNetwork
,
connectivityManager.requestNetwork(request, callback)
Android 將保留蜂窩網絡。 我很困惑,因為文檔太少了。 一旦你這樣做,它會要求你添加CHANGE_NETWORK_STATE
權限。
完成此步驟后,網絡可用,但您將無法使用它發出任何請求。 你必須打電話
connectivityManager.bindProcessToNetwork(theCellularNetwork)
獲得任何連接。
完成此操作后,蜂窩網絡可以與 wifi 網絡一起使用。 您甚至可以將一些流量發送給一個,將一些流量發送給另一個。 如果你像我一樣使用OkHttp
,你只需將客戶端與網絡的socketFactory
val client = OkHttpClient().newBuilder().run {
socketFactory(network.socketFactory)
build()
}
client.newCall(
Request.Builder().url("https://example.com").build()
).execute().let {
Log.i(TAG, "Fetched ${it.body!!.string()}")
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.