色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    3937

    瀏覽量

    127481
  • 移動網絡
    +關注

    關注

    2

    文章

    444

    瀏覽量

    32881

原文標題:如何監測Android網絡類型:5G/4G/3G/2G能力

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

收藏 人收藏

    評論

    相關推薦

    基于無線傳感器網絡的移動業務監測系統的研究與設計

    的微型傳感器開始在世界范圍內出現。由這些微型傳感器構成的傳感器網絡引起了人們的極大關注。這種傳感器網絡綜合了傳感器技術、嵌入式計算技術、分布式信息處理技術和通信技術,能夠協同地實時監測、感知和采集
    發表于 10-29 10:50

    基于LabVIEW的無線傳感器網絡監測平臺設計

      1 引言  無線傳感器網絡是由分布在監測區域內的大量傳感器節點組成的無線網絡,由于其快速展開、抗毀性強、監測精度高、覆蓋區域大等特點而產生了廣闊的應用前景,由此成為當前信息領域的研
    發表于 11-16 15:46

    怎樣去設計一種基于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 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>系統

    粉塵監測(基于STM32和Android的PM2.5監測系統)

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

    怎么判斷霍爾元件的類型

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

    華為5G沸沸揚揚!那你知道三防平板網絡是什么類型

    近日,華為在5G的事件在熱搜上可是著實的火了一把啊!讓小編想起一款來自億道信息EM-I22K-5G的一款三防平板產品,你知道是什么網絡類型
    的頭像 發表于 02-06 14:03 ?407次閱讀
    主站蜘蛛池模板: 亚洲a视频在线观看| 亚洲精品天堂自在久久77| 国产亚洲精品线视频在线| 99视频在线免费看| 一个人免费完整观看日本| 亚洲AV无码国产精品色在线看| 色噜噜噜噜亚洲第一| 视频成人永久免费视频| 女张腿男人桶羞羞漫画| 老女老肥熟国产在线视频| 精品亚洲大全| 极品少妇高潮啪啪AV无码| 国产亚洲精品精品国产亚洲综合| 国产成人久久AV免费看澳门| 高清国产mv视频在线观看| 超碰在线视频97| 被送到黑人性奴俱乐部| 丰满女朋友在线观看中文| 国产一卡 二卡三卡四卡无卡乱码视频| 精品粉嫩BBWBBZBBW| 麻豆国产成人AV在线| 久久综合久久鬼| 久久一本岛在免费线观看2020| 国产在线观看成人免费视频| 久久亚洲AV无码精品午色夜麻豆| 欧美精品专区第1页| 日本xxxxxxxxx老师59| 日韩人妻无码精品久久中文字幕 | 亚洲欧美成人综合| 亚洲一区二区免费看| 亚洲中字幕永久在线观看| 一区在线观看在线| gay吊粗大双龙| YELLOW免费观看完整视频| 多男同时插一个女人8p| 换脸国产AV一区二区三区| 欧美成人3d动漫专区| 亚洲AV无码专区国产精品99| 91次元黄色观看| yellow高清免费观看日本| 国产色精品久久人妻无码看片|