0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何监测Android网络类型呢?

哆啦安全 来源:虎哥Lovedroid 2024-01-04 09:33 次阅读

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

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

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

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

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

获取TelephonyManager的方法如下:

valtelephonyManager=
context.getSystemService(Context.TELEPHONY_SERVICE)asTelephonyManager

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

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

Android ≥ 12(API ≥ 31)

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

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

//ThethreadExecutorusedtorunthelistener.Thisgovernshowthreadsarecreatedand
//reused.Hereweuseasinglethread.
valexec=Executors.newSingleThreadExecutor()

//Createthecallbackobject
valcallback=object:TelephonyCallback(),TelephonyCallback.DisplayInfoListener{
overridefunonDisplayInfoChanged(telephonyDisplayInfo:TelephonyDisplayInfo){
//TODO:Thisisnext
}
}

//Finally,registerthecallbacksoitcanstartreceivingresults.
telephonyManager.registerTelephonyCallback(exec,callback)

注销监听器,方法如下:

telephonyManager.unregisterTelephonyCallback(callback)

"""

仅限 Android 11 (API 30)

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

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

1b761034-aa94-11ee-8b88-92fbcf53809c.png

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

//(Atthetopofthefile)
@file:Suppress("DEPRECATION")//Suppressedasrequiredtosupportoldversion

//SDK30usesTelephonyManager.listen()tolistenforTelephonyDisplayInfochanges.
//ItrequiresREAD_PHONE_STATEpermission.

@Suppress("OVERRIDE_DEPRECATION")//Suppressedasrequiredtosupportoldversion
//Thisistheobjectthatwillreceivetheresults
valcallback=object:PhoneStateListener(exec){
overridefunonDisplayInfoChanged(telephonyDisplayInfo:TelephonyDisplayInfo){
//TODO:Thisisnext
}
}

//Startlisteningforresults
telephonyManager.listen(callback,PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED)

注销监听使用下面代码:

telephonyManager.listen(callback,0)

Android ≥ 7(API ≥ 24)

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

检查的代码如下:

valnetworkType=telephonyManager.dataNetworkType

这需要READ_PHONE_STATE权限。

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

返回的值:网络类型常量

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

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

valbaseTypeString=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->"EVDOrev0"
TelephonyManager.NETWORK_TYPE_EVDO_A->"EVDOrevA"
TelephonyManager.NETWORK_TYPE_EVDO_B->"EVDOrevB"
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(newradio)5G"
TelephonyManager.NETWORK_TYPE_TD_SCDMA->"TD_SCDMA"
TelephonyManager.NETWORK_TYPE_UMTS->"UMTS"
else->"[Unknown]"
}

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

valoverrideString=when(overrideNetworkType){
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA->"5Gnon-standalone"
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED->"5Gstandalone(advanced)"
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO->"LTEAdvancedPro(5Ge)"
TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA->"LTE(carrieraggregation)"
else->null
}

可能的null处理:

valnetTypeString=overrideString?:baseTypeString

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

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

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

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






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3851

    浏览量

    125643
  • 移动网络
    +关注

    关注

    2

    文章

    433

    浏览量

    32448

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

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于无线传感器网络的移动业务监测系统的研究与设计

    的微型传感器开始在世界范围内出现。由这些微型传感器构成的传感器网络引起了人们的极大关注。这种传感器网络综合了传感器技术、嵌入式计算技术、分布式信息处理技术和通信技术,能够协同地实时监测、感知和采集
    发表于 10-29 10:50

    基于LabVIEW的无线传感器网络监测平台设计

      1 引言  无线传感器网络是由分布在监测区域内的大量传感器节点组成的无线网络,由于其快速展开、抗毁性强、监测精度高、覆盖区域大等特点而产生了广阔的应用前景,由此成为当前信息领域的研
    发表于 11-16 15:46

    自主设计的无线传感器网络监测平台

    1 引言  无线传感器网络是由分布在监测区域内的大量传感器节点组成的无线网络,由于其快速展开、抗毁性强、监测精度高、覆盖区域大等特点而产生了广阔的应用前景,由此成为当前信息领域的研究热
    发表于 04-24 06:07

    CMMB智能网络监测系统设计方案

    ,对于CMMB的发展具有重大意义。因此,有必要设计一款针对CMMB网络的覆盖测试系统。本设计基于高性能单片机STM32和GPRS无线通信方案实现了对测试点CMMB网络覆盖情况的实时监测,并利用GPS
    发表于 07-12 08:01

    怎样去设计一种基于Android的剩余电流实时监测系统

    剩余电流实时监测系统是由哪些部分组成的?怎样去设计一种基于Android的剩余电流实时监测系统?
    发表于 08-27 06:41

    怎样去获取Android的电池电压

    怎样去获取Android的电池电压?怎样去获取Android的电池电流
    发表于 10-09 08:39

    怎样去设计基于STM32和Android的PM2.5监测系统

    基于STM32和Android的PM2.5监测系统粉尘监测系统功能:STM32单片机实时通过ADC采集粉尘传感器数据,并通过蓝牙发送至手机端显示粉尘浓度数值。当粉尘浓度大于设定的阈值时候,单片机通过
    发表于 11-10 06:37

    怎样去配置Android的SDIO部分

    怎样去配置Android的电源部分?怎样去配置Android的SDIO部分
    发表于 02-10 07:00

    如何在android中进行驱动

    如何在android中进行驱动?并输出dev和sys中的界面用程序调用
    发表于 03-02 09:53

    android wifi同步网络时间该怎样去实现

    android wifi时间网络更新不了怎么办?android wifi同步网络时间该怎样去实现
    发表于 03-03 07:09

    android系统WiFi无线网络配置移除过程是怎样的

    android系统WiFi无线网络配置移除过程是怎样的?如何去实现
    发表于 03-03 07:02

    Android中不同类型的更新是怎么实现的?

    我想知道 Android 中不同类型的更新。目前,在 Android 9 + IMX8QM 上工作请您提供以下更新的文件或详细信息,1.全面更新2. 部分更新3.安全更新4.差异化更新5.安卓更新6.无缝更新 如果可能,请提供实
    发表于 03-23 09:12

    深入理解Android网络编程

    深入理解Android网络编程
    发表于 03-19 11:26 1次下载

    基于Android平台的船舶垃圾信息监测系统

    本文着力研究一种基于Android平台的船舶垃圾信息监测系统。以到码头卸载垃圾的船舶为对象,设计出一种能在码头环境下通过手机上的Android应用程序,使船主能实时传输船舶身份信息与垃圾量信息至监控
    发表于 11-03 11:50 12次下载
    基于<b class='flag-5'>Android</b>平台的船舶垃圾信息<b class='flag-5'>监测</b>系统

    基于Android的汽车实时监测系统

    汽车作为代步和运输工具已进入千家万户,实现汽车远程监测是保证人们正常出行的必要条件。本文就实现汽车实时监测和故障诊断,提出了基于Android的汽车实时监测系统,设计面向车主和汽修厂的
    发表于 12-01 14:52 5次下载
    基于<b class='flag-5'>Android</b>的汽车实时<b class='flag-5'>监测</b>系统