Android信號(hào)相關(guān)
最近項(xiàng)目需要收集手機(jī)的信號(hào)铐姚,網(wǎng)上也沒(méi)找到比較靠譜的文章肛捍,自己做個(gè)小結(jié)吧。
首先之众,國(guó)內(nèi)現(xiàn)在共存多種手機(jī)制式:
? ? ? ? 中國(guó)移動(dòng) ? ? ? ? ? ? ? ? ? ? ? ? ? ? 中國(guó)聯(lián)通 ? ? ? ? ? ? ? ? ? ? ? 中國(guó)電信
2G ? ?GSM ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? GSM ? ? ? ? ? ? ? ? ? ? ? ? ? ? CDMA1X
3G ? ?TD-SCDMA ? ? ? ? ? ? ? ? ? ? ? ? WCDMA ? ? ? ? ? ? ? ? ? ? ? CDMA3G
4G? ? LTE-TDD/LTE-FDD ? ? ? ? ? ? LTE-TDD/LTE-FDD ? ? ?LTE-TDD/LTE-FDD
從制式上來(lái)看,主要不同在于2G和3G上棺禾,所以API的調(diào)用也會(huì)不同,通過(guò)查閱官方文檔膘婶,下面列出主要的API
通過(guò) Context.getSystemService(Context.TELEPHONY_SERVICE) 可以獲取到 TelephonyManager類缺前,這個(gè)類顧名思義是對(duì)信號(hào)進(jìn)行管理的類悬襟,這個(gè)類中有個(gè)方法 getAllCellInfo()衅码,就可以獲取到當(dāng)前手機(jī)所有信號(hào)的合集脊岳。這里需要特別注意的是逝段,由于官方API的缺陷逸绎,如果當(dāng)前手機(jī)是GSM制式的手機(jī)(也就是國(guó)內(nèi)的移動(dòng)和聯(lián)通)惹恃,那么getAllCellInfo()就會(huì)返回一個(gè)null棺牧,這個(gè)就沒(méi)辦法了巫糙,親測(cè)CDMA手機(jī)沒(méi)問(wèn)題颊乘。
需要注意的是参淹,這個(gè)方法要在API>17的版本才能使用乏悄,所以使用之前需要對(duì)版本進(jìn)行判斷浙值。
獲取到集合后就可以對(duì)集合中的信號(hào)類進(jìn)行判斷了檩小,其中包含了CellInfoGsm开呐,CellInfoCdma规求,CellInfoWcdma,CellInfoLte四個(gè)大類筐付。
下面看看每個(gè)類中的方法
CellInfoGsm,我們需要關(guān)注兩個(gè)方法 getCellIdentity() 和 getCellSignalStrength()阻肿。getCellIdentity()是獲取手機(jī)當(dāng)前所在基站相關(guān)信息的類瓦戚,包括LAC,CID等丛塌,這個(gè)搞通信的人應(yīng)該都懂较解。而?getCellSignalStrength()是獲取手機(jī)信號(hào)強(qiáng)度相關(guān)的類畜疾,包括dbm印衔,RSRP等啡捶。
CellInfoCdma奸焙,CellInfoWcdma,CellInfoLte和CellInfoGsm一樣可以獲取到這兩個(gè)方法届慈,只是名字不同罷了忿偷,具體就不贅述,根據(jù)自己的需要獲取就好臊泌。
上面說(shuō)到getAllCellInfo()在GSM手機(jī)上會(huì)返回null,所以不能用這個(gè)方法渠概,解決辦法就是在早期的官方文檔中提供了另外的類,GsmCellLocation和CdmaCellLocation播揪,同樣可以獲取到相關(guān)的信息贮喧,但是對(duì)于3G和4G目前看來(lái)就只能使用getAllCellInfo()了猪狈,不知道后面官方會(huì)不會(huì)對(duì)bug進(jìn)行修正箱沦。