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

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

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

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

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

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

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

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

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

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

獲取TelephonyManager的方法如下:

valtelephonyManager=
context.getSystemService(Context.TELEPHONY_SERVICE)asTelephonyManager

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

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

Android ≥ 12(API ≥ 31)

Android 12及更高版本是最簡單的情況,因為有一個專用的監(jiān)聽器,并且不需要權(quán)限。

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

注銷監(jiān)聽器,方法如下:

telephonyManager.unregisterTelephonyCallback(callback)

"""

僅限 Android 11 (API 30)

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

有趣的是,這個方法在一個 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)

注銷監(jiān)聽使用下面代碼:

telephonyManager.listen(callback,0)

Android ≥ 7(API ≥ 24)

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

檢查的代碼如下:

valnetworkType=telephonyManager.dataNetworkType

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

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

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

在上述 Android 11 和 ≥12 的代碼中,會收到一個帶有TelephonyDisplayInfo對象的回調(diào)。該對象包含一個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

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

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

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

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






審核編輯:劉清

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

    關(guān)注

    12

    文章

    3917

    瀏覽量

    127040
  • 移動網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    2

    文章

    443

    瀏覽量

    32794

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    基于LabVIEW的無線傳感器網(wǎng)絡(luò)監(jiān)測平臺設(shè)計

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

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

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

    怎樣去獲取Android的電池電壓

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

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

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

    怎樣去配置Android的SDIO部分

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

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

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

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

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

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

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

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

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

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

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

    基于Android的汽車實時監(jiān)測系統(tǒng)

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

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

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

    怎么判斷霍爾元件的類型?

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

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

    近日,華為在5G的事件在熱搜上可是著實的火了一把??!讓小編想起一款來自億道信息EM-I22K-5G的一款三防平板產(chǎn)品,你知道是什么網(wǎng)絡(luò)類型?
    的頭像 發(fā)表于 02-06 14:03 ?368次閱讀