RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何監(jiān)測(cè)Android網(wǎng)絡(luò)類(lèi)型呢?

哆啦安全 ? 來(lái)源:虎哥Lovedroid ? 2024-01-04 09:33 ? 次閱讀

如何監(jiān)測(cè)Android網(wǎng)絡(luò)類(lèi)型:5G/4G/3G/2G能力

App可以通過(guò)了解所連接的網(wǎng)絡(luò)類(lèi)型來(lái)獲益,例如啟用某些功能需要5G提供的帶寬和低延遲。如果只有2G或3G網(wǎng)絡(luò)可用,加載時(shí)間會(huì)比較慢,因此我們可以對(duì)加載時(shí)間有一定的預(yù)期。

在這里,我們可以利用TelephonyManager類(lèi)來(lái)獲取各種關(guān)于移動(dòng)網(wǎng)絡(luò)狀態(tài)的信息,其中包括網(wǎng)絡(luò)類(lèi)型!不過(guò),使用TelephonyManager相當(dāng)復(fù)雜,因?yàn)椴煌腁ndroid版本有不同的情況需要考慮。

下面我提供了一個(gè)示例應(yīng)用程序,它可以檢測(cè)我們所連接的移動(dòng)網(wǎng)絡(luò)類(lèi)型,不僅僅是5G / 4G / 3G / 2G,還可以獲取到具體的子類(lèi)型。該應(yīng)用使用了TelephonyManager,并結(jié)合了Jetpack Compose、ViewModel和Kotlin Flow的編寫(xiě)方式。

使用TelephonyManager注冊(cè)以接收網(wǎng)絡(luò)信息更新

獲取TelephonyManager的方法如下:

valtelephonyManager=
context.getSystemService(Context.TELEPHONY_SERVICE)asTelephonyManager

...當(dāng)上下文是一個(gè)Context實(shí)例時(shí)。請(qǐng)注意,一些手機(jī)具有多個(gè)SIM卡;如果您想查詢(xún)特定的SIM卡,請(qǐng)調(diào)用TelephonyManager實(shí)例上的.createForSubscriptionId(simCardNumber)。

使用這個(gè)實(shí)例,我們現(xiàn)在可以獲取網(wǎng)絡(luò)信息更新。所使用的過(guò)程取決于Android版本,即用戶(hù)的Android版本,而不是您應(yīng)用的目標(biāo)API級(jí)別。

Android ≥ 12(API ≥ 31)

Android 12及更高版本是最簡(jiǎn)單的情況,因?yàn)橛幸粋€(gè)專(zhuān)用的監(jiān)聽(tīng)器,并且不需要權(quán)限。

要注冊(cè)接收網(wǎng)絡(luò)類(lèi)型信息,我們使用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)

注銷(xiāo)監(jiān)聽(tīng)器,方法如下:

telephonyManager.unregisterTelephonyCallback(callback)

"""

僅限 Android 11 (API 30)

注冊(cè)電話(huà)管理器回調(diào)的原始方法是使用 listen 方法。該方法接受各種類(lèi)型的監(jiān)聽(tīng)器;我們需要的是實(shí)現(xiàn)onDisplayInfoChanged接口的監(jiān)聽(tīng)器。

有趣的是,這個(gè)方法在一個(gè) Android 版本中就出現(xiàn)并消失了:

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

這需要READ_PHONE_STATE權(quán)限。我們將在 UI 代碼中稍后處理?,F(xiàn)在我們將繼續(xù),假定我們已經(jīng)擁有該權(quán)限。

//(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)

注銷(xiāo)監(jiān)聽(tīng)使用下面代碼:

telephonyManager.listen(callback,0)

Android ≥ 7(API ≥ 24)

Android 10及以下沒(méi)有任何監(jiān)聽(tīng)網(wǎng)絡(luò)類(lèi)型變化的方法。要支持較舊的版本,您需要實(shí)施一個(gè)循環(huán),每隔幾秒主動(dòng)檢查。

檢查的代碼如下:

valnetworkType=telephonyManager.dataNetworkType

這需要READ_PHONE_STATE權(quán)限。

請(qǐng)注意,Android 10及以下版本不能支持5G,因?yàn)?G僅在Android 11及以上版本中可用。

返回的值:網(wǎng)絡(luò)類(lèi)型常量

在上述 Android 11 和 ≥12 的代碼中,會(huì)收到一個(gè)帶有TelephonyDisplayInfo對(duì)象的回調(diào)。該對(duì)象包含一個(gè)networkType和一個(gè)overrideNetworkType。而在 Android ≤10 的代碼中,只會(huì)收到一個(gè)networkType。

無(wú)論哪種情況,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會(huì)為某些類(lèi)型的4G和5G連接提供更多信息。以下是選項(xiàng):

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

將其構(gòu)建為一個(gè)Kotlin + Flows + ViewModel + Compose應(yīng)用程序

我在ViewModel中使用了一個(gè)KotlincallbackFlow來(lái)設(shè)置上述監(jiān)聽(tīng)器。如果您以前沒(méi)有遇到過(guò)callbackFlow,那就太棒了:它是一個(gè)流,可用于在外部API上創(chuàng)建一個(gè)監(jiān)聽(tīng)器,當(dāng)有人注冊(cè)時(shí),自動(dòng)移除該監(jiān)聽(tīng)器。

我使用.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), null)將callbackFlow從冷可觀察對(duì)象轉(zhuǎn)換為共享熱可觀察對(duì)象。這樣,如果有多個(gè)消費(fèi)者注冊(cè),就不會(huì)創(chuàng)建多個(gè)DisplayInfoListeners或PhoneStateListeners。WhileSubscribed(5000)部分確??捎^察對(duì)象在所有消費(fèi)者消失后仍保持存在一段時(shí)間,以防它們即將重新出現(xiàn)。(例如,在屏幕旋轉(zhuǎn)的情況下會(huì)發(fā)生這種情況)。

在Composable中,我使用collectAsStateWithLifecycle()來(lái)確保監(jiān)聽(tīng)器僅在應(yīng)用程序位于前臺(tái)時(shí)處于活動(dòng)狀態(tài)。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3935

    瀏覽量

    127337
  • 移動(dòng)網(wǎng)絡(luò)

    關(guān)注

    2

    文章

    444

    瀏覽量

    32849

原文標(biāo)題:如何監(jiān)測(cè)Android網(wǎng)絡(luò)類(lèi)型:5G/4G/3G/2G能力

文章出處:【微信號(hào):哆啦安全,微信公眾號(hào):哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于無(wú)線(xiàn)傳感器網(wǎng)絡(luò)的移動(dòng)業(yè)務(wù)監(jiān)測(cè)系統(tǒng)的研究與設(shè)計(jì)

    的微型傳感器開(kāi)始在世界范圍內(nèi)出現(xiàn)。由這些微型傳感器構(gòu)成的傳感器網(wǎng)絡(luò)引起了人們的極大關(guān)注。這種傳感器網(wǎng)絡(luò)綜合了傳感器技術(shù)、嵌入式計(jì)算技術(shù)、分布式信息處理技術(shù)和通信技術(shù),能夠協(xié)同地實(shí)時(shí)監(jiān)測(cè)、感知和采集
    發(fā)表于 10-29 10:50

    基于LabVIEW的無(wú)線(xiàn)傳感器網(wǎng)絡(luò)監(jiān)測(cè)平臺(tái)設(shè)計(jì)

      1 引言  無(wú)線(xiàn)傳感器網(wǎng)絡(luò)是由分布在監(jiān)測(cè)區(qū)域內(nèi)的大量傳感器節(jié)點(diǎn)組成的無(wú)線(xiàn)網(wǎng)絡(luò),由于其快速展開(kāi)、抗毀性強(qiáng)、監(jiān)測(cè)精度高、覆蓋區(qū)域大等特點(diǎn)而產(chǎn)生了廣闊的應(yīng)用前景,由此成為當(dāng)前信息領(lǐng)域的研
    發(fā)表于 11-16 15:46

    怎樣去設(shè)計(jì)一種基于Android的剩余電流實(shí)時(shí)監(jiān)測(cè)系統(tǒng)

    剩余電流實(shí)時(shí)監(jiān)測(cè)系統(tǒng)是由哪些部分組成的?怎樣去設(shè)計(jì)一種基于Android的剩余電流實(shí)時(shí)監(jiān)測(cè)系統(tǒng)?
    發(fā)表于 08-27 06:41

    怎樣去獲取Android的電池電壓

    怎樣去獲取Android的電池電壓?怎樣去獲取Android的電池電流?
    發(fā)表于 10-09 08:39

    怎樣去設(shè)計(jì)基于STM32和Android的PM2.5監(jiān)測(cè)系統(tǒng)

    基于STM32和Android的PM2.5監(jiān)測(cè)系統(tǒng)粉塵監(jiān)測(cè)系統(tǒng)功能:STM32單片機(jī)實(shí)時(shí)通過(guò)ADC采集粉塵傳感器數(shù)據(jù),并通過(guò)藍(lán)牙發(fā)送至手機(jī)端顯示粉塵濃度數(shù)值。當(dāng)粉塵濃度大于設(shè)定的閾值時(shí)候,單片機(jī)通過(guò)
    發(fā)表于 11-10 06:37

    怎樣去配置Android的SDIO部分

    怎樣去配置Android的電源部分?怎樣去配置Android的SDIO部分?
    發(fā)表于 02-10 07:00

    android wifi同步網(wǎng)絡(luò)時(shí)間該怎樣去實(shí)現(xiàn)

    android wifi時(shí)間網(wǎng)絡(luò)更新不了怎么辦?android wifi同步網(wǎng)絡(luò)時(shí)間該怎樣去實(shí)現(xiàn)?
    發(fā)表于 03-03 07:09

    android系統(tǒng)WiFi無(wú)線(xiàn)網(wǎng)絡(luò)配置移除過(guò)程是怎樣的

    android系統(tǒng)WiFi無(wú)線(xiàn)網(wǎng)絡(luò)配置移除過(guò)程是怎樣的?如何去實(shí)現(xiàn)?
    發(fā)表于 03-03 07:02

    Android中不同類(lèi)型的更新是怎么實(shí)現(xiàn)的?

    我想知道 Android 中不同類(lèi)型的更新。目前,在 Android 9 + IMX8QM 上工作請(qǐng)您提供以下更新的文件或詳細(xì)信息,1.全面更新2. 部分更新3.安全更新4.差異化更新5.安卓更新6.無(wú)縫更新 如果可能,請(qǐng)?zhí)峁?shí)
    發(fā)表于 03-23 09:12

    深入理解Android網(wǎng)絡(luò)編程

    深入理解Android網(wǎng)絡(luò)編程
    發(fā)表于 03-19 11:26 ?1次下載

    基于Android平臺(tái)的船舶垃圾信息監(jiān)測(cè)系統(tǒng)

    本文著力研究一種基于Android平臺(tái)的船舶垃圾信息監(jiān)測(cè)系統(tǒng)。以到碼頭卸載垃圾的船舶為對(duì)象,設(shè)計(jì)出一種能在碼頭環(huán)境下通過(guò)手機(jī)上的Android應(yīng)用程序,使船主能實(shí)時(shí)傳輸船舶身份信息與垃圾量信息至監(jiān)控
    發(fā)表于 11-03 11:50 ?12次下載
    基于<b class='flag-5'>Android</b>平臺(tái)的船舶垃圾信息<b class='flag-5'>監(jiān)測(cè)</b>系統(tǒng)

    基于Android的汽車(chē)實(shí)時(shí)監(jiān)測(cè)系統(tǒng)

    汽車(chē)作為代步和運(yùn)輸工具已進(jìn)入千家萬(wàn)戶(hù),實(shí)現(xiàn)汽車(chē)遠(yuǎn)程監(jiān)測(cè)是保證人們正常出行的必要條件。本文就實(shí)現(xiàn)汽車(chē)實(shí)時(shí)監(jiān)測(cè)和故障診斷,提出了基于Android的汽車(chē)實(shí)時(shí)監(jiān)測(cè)系統(tǒng),設(shè)計(jì)面向車(chē)主和汽修廠的
    發(fā)表于 12-01 14:52 ?5次下載
    基于<b class='flag-5'>Android</b>的汽車(chē)實(shí)時(shí)<b class='flag-5'>監(jiān)測(cè)</b>系統(tǒng)

    粉塵監(jiān)測(cè)(基于STM32和Android的PM2.5監(jiān)測(cè)系統(tǒng))

    基于STM32和Android的PM2.5監(jiān)測(cè)系統(tǒng)粉塵監(jiān)測(cè)系統(tǒng)功能:STM32單片機(jī)實(shí)時(shí)通過(guò)ADC采集粉塵傳感器數(shù)據(jù),并通過(guò)藍(lán)牙發(fā)送至手機(jī)端顯示粉塵濃度數(shù)值。當(dāng)粉塵濃度大于設(shè)定的閾值時(shí)候,單片機(jī)通過(guò)
    發(fā)表于 11-05 17:06 ?19次下載
    粉塵<b class='flag-5'>監(jiān)測(cè)</b>(基于STM32和<b class='flag-5'>Android</b>的PM2.5<b class='flag-5'>監(jiān)測(cè)</b>系統(tǒng))

    怎么判斷霍爾元件的類(lèi)型?

    怎么判斷霍爾元件的類(lèi)型? 霍爾元件是一種常用的傳感器元件,用于測(cè)量電流、磁場(chǎng)、位置等物理量。根據(jù)其工作原理和性質(zhì)的不同,可以將霍爾元件分為多種類(lèi)型。本文將詳細(xì)介紹并解釋這些類(lèi)型,以幫
    的頭像 發(fā)表于 12-18 14:56 ?1677次閱讀

    華為5G沸沸揚(yáng)揚(yáng)!那你知道三防平板網(wǎng)絡(luò)是什么類(lèi)型!

    近日,華為在5G的事件在熱搜上可是著實(shí)的火了一把??!讓小編想起一款來(lái)自?xún)|道信息EM-I22K-5G的一款三防平板產(chǎn)品,你知道是什么網(wǎng)絡(luò)類(lèi)型?
    的頭像 發(fā)表于 02-06 14:03 ?392次閱讀
    RM新时代网站-首页