簡體   English   中英

如果連接了 wifi,則 Android 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中。 它的功能總是包括“有效”和“互聯網”

我在這里看到了什么? 為什么我的蜂窩網絡丟失了? 這個幻像蜂窩網絡是什么?

  • 目標SDK版本:29
  • 設備:Galaxy S10 - Android 12

蜂窩網絡沒有丟失,但您的應用不允許使用它。 連接 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM