android電訊廠商和網路類型分析
一些需求需要擷取電訊廠商和網路類型,下面對電訊廠商和網路類型做分析。
先拋出一些廢話的定義:
GSM:全球移動通訊系統Global System of Mobile communication就是眾所周知的GSM,是當前應用最為廣泛的行動電話標準。
CDMA:碼分多址(CDMA)是在數字技術的分支--擴頻通訊技術上發展起來的一種嶄新而成熟的無線通訊技術。
可見,這兩者是技術標準,和網路類型及制式無關。
進入正題。
1.擷取話機類型
這個可以通過方法TelephonyManager#getPhoneType來獲得,下面是傳回型別。
/** * Returns a constant indicating the device phone type. This * indicates the type of radio used to transmit voice calls. * * @see #PHONE_TYPE_NONE * @see #PHONE_TYPE_GSM * @see #PHONE_TYPE_CDMA * @see #PHONE_TYPE_SIP */
常用話機類型就是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版本低的裝置,不包含一些類型的定義,所以最好在自己的類中重新定義這些網路類型變數