如何监测Android网络类型:5G/4G/3G/2G能力

App可以通过了解所连接的网络类型来获益,例如启用某些功能需要5G提供的带宽和低延迟。如果只有2G或3G网络可用,加载时间会比较慢,因此我们可以对加载时间有一定的预期。

在这里,我们可以利用TelephonyManager类来获取各种关于移动网络状态的信息,其中包括网络类型!不过,使用TelephonyManager相当复杂,因为不同的Android版本有不同的情况需要考虑。

下面我提供了一个示例应用程序,它可以检测我们所连接的移动网络类型,不仅仅是5G / 4G / 3G / 2G,还可以获取到具体的子类型。该应用使用了TelephonyManager,并结合了Jetpack Compose、ViewModel和Kotlin Flow的编写方式。

https://github.com/tdcolvin/NetworkTypeDetector

使用TelephonyManager注册以接收网络信息更新

获取TelephonyManager的方法如下:

val telephonyManager =
  context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

...当上下文是一个Context实例时。请注意,一些手机具有多个SIM卡;如果您想查询特定的SIM卡,请调用TelephonyManager实例上的.createForSubscriptionId(simCardNumber)

使用这个实例,我们现在可以获取网络信息更新。所使用的过程取决于Android版本,即用户的Android版本,而不是您应用的目标API级别。

Android ≥ 12(API ≥ 31)

Android 12及更高版本是最简单的情况,因为有一个专用的监听器,并且不需要权限。

要注册接收网络类型信息,我们使用registerTelephonyCallback(Executor, TelephonyCallback)方法,如下所示:

// The thread Executor used to run the listener. This governs how threads are created and
// reused. Here we use a single thread.
val exec = Executors.newSingleThreadExecutor()

// Create the callback object
val callback = object : TelephonyCallback(), TelephonyCallback.DisplayInfoListener {
    override fun onDisplayInfoChanged(telephonyDisplayInfo: TelephonyDisplayInfo) {
        //TODO: This is next
    }
}

// Finally, register the callback so it can start receiving results.
telephonyManager.registerTelephonyCallback(exec, callback)

注销监听器,方法如下:

telephonyManager.unregisterTelephonyCallback(callback)

"""

仅限 Android 11 (API 30)

注册电话管理器回调的原始方法是使用 listen 方法。该方法接受各种类型的监听器;我们需要的是实现 onDisplayInfoChanged 接口的监听器。

有趣的是,这个方法在一个 Android 版本中就出现并消失了:

这需要 READ_PHONE_STATE 权限。我们将在 UI 代码中稍后处理。现在我们将继续,假定我们已经拥有该权限。

// (At the top of the file)
@file:Suppress("DEPRECATION") //Suppressed as required to support old version

// SDK 30 uses TelephonyManager.listen() to listen for TelephonyDisplayInfo changes.
// It requires READ_PHONE_STATE permission.

@Suppress("OVERRIDE_DEPRECATION")  //Suppressed as required to support old version
// This is the object that will receive the results
val callback = object : PhoneStateListener(exec) {
    override fun onDisplayInfoChanged(telephonyDisplayInfo: TelephonyDisplayInfo) {
        //TODO: This is next
    }
}

// Start listening for results
telephonyManager.listen(callback, PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)

注销监听使用下面代码:

telephonyManager.listen(callback, 0)

Android ≥ 7(API ≥ 24)

Android 10及以下没有任何监听网络类型变化的方法。要支持较旧的版本,您需要实施一个循环,每隔几秒主动检查。

检查的代码如下:

val networkType = telephonyManager.dataNetworkType

这需要 READ_PHONE_STATE 权限。

请注意,Android 10及以下版本不能支持5G,因为5G仅在Android 11及以上版本中可用。

返回的值:网络类型常量

在上述 Android 11 和 ≥12 的代码中,会收到一个带有TelephonyDisplayInfo对象的回调。该对象包含一个 networkType 和一个 overrideNetworkType。而在 Android ≤10 的代码中,只会收到一个 networkType

无论哪种情况,networkType 可以是以下之一:

val baseTypeString = when(networkType) {
    TelephonyManager.NETWORK_TYPE_CDMA -> "CDMA"
    TelephonyManager.NETWORK_TYPE_1xRTT -> "1xRTT"
    TelephonyManager.NETWORK_TYPE_EDGE -> "EDGE"
    TelephonyManager.NETWORK_TYPE_EHRPD -> "eHRPD"
    TelephonyManager.NETWORK_TYPE_EVDO_0 -> "EVDO rev 0"
    TelephonyManager.NETWORK_TYPE_EVDO_A -> "EVDO rev A"
    TelephonyManager.NETWORK_TYPE_EVDO_B -> "EVDO rev B"
    TelephonyManager.NETWORK_TYPE_GPRS -> "GPRS"
    TelephonyManager.NETWORK_TYPE_GSM -> "GSM"
    TelephonyManager.NETWORK_TYPE_HSDPA -> "HSDPA"
    TelephonyManager.NETWORK_TYPE_HSPA -> "HSPA"
    TelephonyManager.NETWORK_TYPE_HSPAP -> "HSPA+"
    TelephonyManager.NETWORK_TYPE_HSUPA -> "HSUPA"
    TelephonyManager.NETWORK_TYPE_IDEN -> "iDen"
    TelephonyManager.NETWORK_TYPE_IWLAN -> "IWLAN"
    TelephonyManager.NETWORK_TYPE_LTE -> "LTE"
    TelephonyManager.NETWORK_TYPE_NR -> "NR (new radio) 5G"
    TelephonyManager.NETWORK_TYPE_TD_SCDMA -> "TD_SCDMA"
    TelephonyManager.NETWORK_TYPE_UMTS -> "UMTS"
    else -> "[Unknown]"
}

如果可用,overrideNetworkType会为某些类型的4G和5G连接提供更多信息。以下是选项:

val overrideString = when(overrideNetworkType) {
    TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA -> "5G non-standalone"
    TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED -> "5G standalone (advanced)"
    TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO -> "LTE Advanced Pro (5Ge)"
    TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA -> "LTE (carrier aggregation)"
    else -> null
}

可能的null处理:

val netTypeString = overrideString ?: baseTypeString

将其构建为一个Kotlin + Flows + ViewModel + Compose应用程序

我在ViewModel中使用了一个Kotlin callbackFlow来设置上述监听器。如果您以前没有遇到过callbackFlow,那就太棒了:它是一个流,可用于在外部API上创建一个监听器,当有人注册时,自动移除该监听器。

我使用.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), null)callbackFlow从冷可观察对象转换为共享热可观察对象。这样,如果有多个消费者注册,就不会创建多个DisplayInfoListenersPhoneStateListenersWhileSubscribed(5000)部分确保可观察对象在所有消费者消失后仍保持存在一段时间,以防它们即将重新出现。(例如,在屏幕旋转的情况下会发生这种情况)。

在Composable中,我使用collectAsStateWithLifecycle()来确保监听器仅在应用程序位于前台时处于活动状态。

GitHub

https://github.com/tdcolvin/NetworkTypeDetector

转自:如何监测Android网络类型:5G/4G/3G/2G能力

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 2G/3G/4G/5G基站/终端软件产品架构、开发、算法,是当前无线通信技术领域的核心内容之一。在这个领域,开发团队需要深入研究无线通信标准,深入理解协议栈的设计原理,设计出高效的算法,并将其应用到终端和基站的软件产品中。 在产品架构上,开发团队需要通过深入研究无线通信标准的规范,设计出符合规范的产品架构。在设计软件架构时,需要考虑到代码的可扩展性、可维护性、可重用性和可移植性等方面。同时,还要考虑到不同厂家和终端之间的兼容性问题。 在算法方面,开发团队需要考虑实际应用场景下的需求,设计出高效的算法。例如,在5G领域,需要在各种复杂的电文场景中增强信号的覆盖范围和传输速度。开发团队需要研究信道估计算法、资源分配算法、功率控制算法等,以确保终端和基站之间的稳定和高效通信。 在开发方面,开发团队要积极采用现代化的软件开发工具和方法,例如自动化测试、持续集成、持续交付等,以提高开发效率和产品质量。同时,还要保证软件的安全性和稳定性。 总之,2G/3G/4G/5G基站/终端软件产品架构、开发、算法是一个充满挑战的领域,需要开发团队的深入研究和不断创新,以应对不断变化的市场需求和技术挑战。 ### 回答2: 2G/3G/4G/5G基站/终端软件产品架构、开发、算法是一项关键的技术,这些技术的发展和应用对于现代通信行业的发展起着决定性的作用。下面就分别来介绍这些技术的产品架构、开发以及算法。 在产品架构方面,基站/终端软件的架构是通信系统的核心,影响着整个通信系统的性能和可靠性。在产品架构的设计中,主要考虑到以下几个因素:首先是系统的可扩展性,其次是系统的安全性以及其它要求。2G/3G/4G/5G基站/终端软件的架构包括物理层、数据链路层、网络层、传输层、应用层等几个主要的部分。在软件开发方面,需要考虑到的主要是实现特定的功能和解决特定的问题,例如快速数据传输、安全加密和可靠通信。 在算法方面,2G/3G/4G/5G基站/终端软件的算法涵盖了许多方面,如多路复用技术、加密技术、信号处理技术等。其中比较重要的算法有MIMO、OFDM等。MIMO技术可获得更高的频谱效率和更高的数据传输速率,而OFDM技术则可有效地解决多径传输、干扰和降噪等问题。在算法的开发中,主要考虑到的是如何使通信系统的性能最大化,使其具有更好的鲁棒性和可靠性。 综上所述,2G/3G/4G/5G基站/终端软件的产品架构、开发和算法是一个复杂而关键的技术,要将其完美地实现需要不断地进行创新和发展。它们的发展和应用将使我们的生活更加便利,促进人们的交流,为通信行业的未来奠定坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值