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

这篇具有很好参考价值的文章主要介绍了如何监测Android网络类型:5G/4G/3G/2G能力。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

如何监测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文章来源地址https://www.toymoban.com/news/detail-501301.html

使用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 版本中就出现并消失了:
如何监测Android网络类型:5G/4G/3G/2G能力

这需要 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能力的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓手机4G/5G网络数据流量(非WiFi)设置加密DNS

    说真的,DNS这玩意用的也不少,不管是域名解析,还是网络设置,都会涉及到 DNS 解析,但是一直停留在 IP 地址阶段,也就是直接输入 DNS 的 IP 地址即可。 最近重新搭建了最新的 AdGuard Home 平台进行范围广告拦截,想在手机上设置 DNS 却不知如何入手,若是设置 WiFi 网络的

    2024年02月05日
    浏览(78)
  • 如何通过Android平台的API实现5G网络的支持 安卓系统版本和5g网络相关【一】

    前面分享了两篇5G基带相关的移植修改博文。 安卓高通机型的基带移植 修改 编译的相关 增加信号 支持5G等【一】 安卓高通机型的基带移植 修改 编译的相关 增加信号 支持5G等【二】 今天的帖子聊聊安卓版本与5G网络与机型和修改之间相关的话题。众所周知,目前的机型基本

    2024年02月09日
    浏览(63)
  • 工业边缘网关HiWoo Box的4G/5G CPE功能:为现场无线设备提供网络

    随着工业物联网的快速发展,现场设备的无线连接需求越来越迫切。然而,在一些室外或者不方便布网的场景下,为现场的无线设备提供网络仍然是一个挑战。为了满足这一需求,工业边缘网关HiWoo Box引入了4G/5G CPE(Customer Premises Equipment)功能,不仅可以使用4G或5G物联卡实现

    2024年02月15日
    浏览(49)
  • 腾讯云3年轻量应用服务器2核4G5M和2核2G4M详细介绍

    腾讯云轻量应用服务器3年配置,目前可以选择三年的轻量配置为2核2G4M和2核4G5M,2核2G4M和2核4G5M带宽,当然也可以选择选一年,第二年xufei会比较gui,腾讯云百科分享腾讯云轻量应用服务器3年配置表: 目录 腾讯云轻量应用服务器3年配置 1、关于轻量服务器CPU 2、关于轻量服务

    2024年02月12日
    浏览(46)
  • 2023 年腾讯云服务器配置价格表出炉(2核2G/2核4G/4核8G/8核16G、16核32G)

    腾讯云轻量应用服务器为轻量级的云服务器,使用门槛低,按套餐形式购买,轻量应用服务器套餐自带的公网带宽较大,4M、6M、7M、10M、14M及20M套餐可选,如果是云服务器CVM这个带宽价格就要贵很多了。 腾讯云轻量应用服务器配置高价格优惠,性能也很不错,公网带宽4M起步

    2023年04月08日
    浏览(85)
  • 4G/5G卡使用 EC200-CN

    在串口中查看4G卡网口如下为enx020c29a39b6d  输入如下命令启动自动获取3s后按ctrl+c   输入minicom -D /dev/ttyUSB2后先输入: ATE1启动回显。 AT+qnetdevctl=1,1,1播号回复ok表示成功。   查看ip已成功获取  

    2024年02月20日
    浏览(48)
  • [4G/5G/6G专题基础-161]:常见的滤波技术

    滤波(Filtering)是信号处理中的一种基本操作,用于改变信号的特性或者 去除信号中的干扰成分 。滤波器可以看作是一种系统,将输入信号作为输入,经过处理后产生输出信号。 滤波在信号处理中广泛应用,用于 去除噪声 、 平滑信号 、 频率选择 等。 不同的滤波器类型和

    2024年02月13日
    浏览(51)
  • Wi-Fi、4G、5G的物理层技术

    时间轴 通信标准 支持频段 信道宽度 传输速率 是否兼容其他协议标准 1999 802.11a 5GHz 20MHz 54Mbit/s 不兼容 1999 802.11b 2.4GHz 20MHz 11Mbit/s 不兼容 2003 802.11g 2.4GHz 20MHz 54Mbit/s 兼容802.11b 2009 802.11n 2.4G5GHz 20/40MHz 300/450/600Mbit/s 兼容802.11a/b/g 2013 802.11ac 5GHz 80/160MHz 433/867/1730Mbit/s 兼容802.11a/n

    2024年01月21日
    浏览(47)
  • 智慧照明迎来新升级:5G/4G智慧灯杆网关助力节能控制

    近年来,随着智能科技的飞速发展,智慧照明系统已成为城市建设的热门话题。其中,5G/4G智慧灯杆网关作为智慧照明的重要组成部分,正逐渐引起人们的关注。其能够实现智能控制与远程管理,为城市节能减排做出了巨大贡献。 5G/4G智慧灯杆网关智能照明应用 首先,5G/4G智

    2024年01月18日
    浏览(57)
  • 香橙派OrangePi zero H2+ 驱动移远4G/5G模块

    目录 1 安装系统和内核文件: 1.1 下载镜像 1.2 内核头安装  1.2.1 下载内核 1.2.2 将内核头文件导入开发板中 1.2.3 安装内核头 2 安装依赖工具: 2.1 Installing Required Host Utilities 3 驱动步骤:        3.1 下载模块驱动文件 3.2 找到接近内核的文件 3.3 将v5.4.51驱动文件导入开发板中

    2024年02月10日
    浏览(98)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包