首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果连接wifi,则Android TRANSPORT_CELLULAR网络不可用。我们怎样才能得到它?

如果连接wifi,则Android TRANSPORT_CELLULAR网络不可用。我们怎样才能得到它?
EN

Stack Overflow用户
提问于 2022-08-19 07:49:47
回答 2查看 100关注 0票数 0

当我连接上无线网络的时候,蜂窝网络就会完全丢失,尽管蜂窝网络指示灯是绝对开着的。

这是我的网络请求

代码语言:javascript
复制
val request = NetworkRequest.Builder().run {
    addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
    build()
  }

connectivityManager.registerNetworkCallback(request, callback)

我试过在connectivityManager.allNetworks列表中查找,现在找不到了。只有无线网络在里面。

更奇怪的是,还有另外一个一直存在的蜂窝网络。它没有与我的蜂窝网络相同的ID。没有任何联系,可以与它。它从来没有出现在registerNetworkCallback上。它的功能总是包括“有效”和“互联网”。

我在这里看到了什么?为什么我的手机网络丢失了?这个幻影蜂窝网络是什么?

  • targetSdkVersion: 29
  • 设备:GalaxyS10- Android 12
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-19 10:31:29

我想出来了。

如果您调用registerNetworkCallback,则会发生上述情况,但如果您使用TRANSPORT_CELLULAR调用requestNetwork

代码语言:javascript
复制
connectivityManager.requestNetwork(request, callback)

Android将保持移动网络的正常运行。我很困惑,因为文件太缺乏了。一旦您这样做,它将要求您添加CHANGE_NETWORK_STATE权限。

在这一步之后,网络是可用的,但是您将无法使用它提出任何请求。你得打电话

代码语言:javascript
复制
connectivityManager.bindProcessToNetwork(theCellularNetwork)

找到任何联系。

在此之后,蜂窝网络可以与wifi网络一起使用。你甚至可以发送一些流量给其中一个和另一个。如果您像我一样使用OkHttp,您只需将客户端绑定到网络的socketFactory

代码语言:javascript
复制
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()}")
}    
票数 2
EN

Stack Overflow用户

发布于 2022-08-19 07:56:38

蜂窝网络并没有丢失,但是你的应用程序不允许使用它。一旦连接到WiFi,一切都被迫使用该连接。这个规则的唯一例外是如果你的手机有一个叫做“双重加速”的功能,它允许蜂窝连接保持活动(很明显,用户必须启用这个功能)。或者,您可以在手机的开发人员选项中设置一个名为“蜂窝数据始终处于活动状态”的设置,这将做同样的事情。

但是不用说,您不能依赖在生产环境中启用的这两个特性中的任何一个。所以,假设当WiFi连接时,这是应用程序可以使用的唯一连接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73413465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档