天天看點

android 7.1 營運商和網絡類型分析

一些需求需要擷取營運商和網絡類型,下面對營運商和網絡類型做分析。

先抛出一些廢話的定義:

GSM:全球移動通訊系統Global System of Mobile communication就是衆所周知的GSM,是目前應用最為廣泛的行動電話标準。

CDMA:碼分多址(CDMA)是在數字技術的分支--擴頻通信技術上發展起來的一種嶄新而成熟的無線通信技術。

可見,這兩者是 技術标準,和網絡類型及制式無關。

1.擷取話機類型 這個可以通過方法TelephonyManager#getPhoneType來獲得,下面是傳回類型。

常用話機類型就是GSM類型和CDMA類型,SIP是和VOIP相關的東西,平時不常遇到。

2.擷取營運商 TelephonyManager#getSimOperator用于擷取SIM卡營運商ID,比如移動是46002 TelephonyManager#getSimOperatorName方法擷取營運商名字,比如移動是CMCC TelephonyManager#getSimCountryIso擷取SIM卡國家,比如中國是cn TelephonyManager#getSimState擷取SIM卡狀态

3.擷取網絡類型 重點來了。 TelephonyManager#getNetworkType方法擷取網絡類型。

想要确切的顯示出手機目前的網絡,比如“聯通3G”,需要的就是這個。

在網上找了一些代碼,看見一些代碼在一些網絡類型後面标明:“移動2G”,我隻想說“呵呵”。

原因就是,從單一的網絡類型是無法判斷這點的。

回到正題,開始分析傳回值。

1)NETWORK_TYPE_GPRS GPRS是一種制式,相當于2.5G,它獨立于話機類型而存在,雖然移動是GSM話機,聯通是CDMA話機,但是他們都可以有這種制式,

拿移動2G舉例,我所在城市是EDGE網絡。但是在之前,移動和聯通可能有同時使用GPRS的時候,

同時也不排除部分地區移動仍然部署了GPRS的可能性,是以比較不贊同在代碼後面标“移動2G”的這位前輩。

2)NETWORK_TYPE_EDGE EDGE應該算是2.75G。據我所知,聯通好像沒有更新2G網絡到這個制式。而移動目前是在用這個。

3)NETWORK_TYPE_UMTS UMTS定義是一種3G行動電話技術,使用WCDMA作為底層标準,WCDMA向下相容GSM網絡。

目前中國也就隻有聯通了,這個确實可以唯一判斷營運商及其網絡類型。

4)NETWORK_TYPE_CDMA CDMA的定義是一種技術标準,有其2代、2.5代、3代技術。被認為是3代移動技術的首選,包含的标準有

WCDMA、CDMA2000、TD-SCDMA。這裡CDMA指代CDMA2代技術标準的制式,中國電信在用。

5)NETWORK_TYPE_1xRTT 在CDMA2000中,通常被認為是2.5G或2.75G,速率隻有其他3G的幾分之一,電信可能使用。

6)NETWORK_TYPE_EVDO_0、NETWORK_TYPE_EVDO_A、NETWORK_TYPE_EVDO_B 兩者都是CDMA2000标準中的版本,屬于3G,電信可能使用。

7)NETWORK_TYPE_HSDPA 一種通信協定,建立在WCDMA上,相當于3.5G,聯通可能使用。

8)NETWORK_TYPE_LTE 對應準4G,各個營運商都可能使用。

9)NETWORK_TYPE_GSM 這個值是隐藏的,值為16,暫時不知道什麼卡會出現。猜想應該是對應GSM标準的最早期制式,沒有驗證。

10)NETWORK_TYPE_TD_SCDMA 也是隐藏的,值為17,使用移動3G時是這個值。

結論:判斷哪個營運商那種網絡不應該隻根據NetworkType判斷。

營運商單獨擷取,而NetworkType可以進一步知道是2G還是3G。

其他中國不存在的制式就先不判斷了。

4.關于android版本相容 對于android版本低的裝置,不包含一些類型的定義,是以最好在自己的類中重新定義這些網絡類型變量