Android手机信号提取
Android信号相关
最近项目需要收集手机的信号,网上也没找到比较靠谱的文章,自己做个小结吧。
首先,国内现在共存多种手机制式:
中国移动 中国联通 中国电信
2G GSM GSM CDMA1X
3G TD-SCDMA WCDMA CDMA3G
4G LTE-TDD/LTE-FDD LTE-TDD/LTE-FDD LTE-TDD/LTE-FDD
从制式上来看,主要不同在于2G和3G上,所以API的调用也会不同,通过查阅官方文档,下面列出主要的API
通过 Context.getSystemService(Context.TELEPHONY_SERVICE) 可以获取到 TelephonyManager类,这个类顾名思义是对信号进行管理的类,这个类中有个方法 getAllCellInfo(),就可以获取到当前手机所有信号的合集。这里需要特别注意的是,由于官方API的缺陷,如果当前手机是GSM制式的手机(也就是国内的移动和联通),那么getAllCellInfo()就会返回一个null,这个就没办法了,亲测CDMA手机没问题。
需要注意的是,这个方法要在API>17的版本才能使用,所以使用之前需要对版本进行判断。
获取到集合后就可以对集合中的信号类进行判断了,其中包含了CellInfoGsm,CellInfoCdma,CellInfoWcdma,CellInfoLte四个大类。
下面看看每个类中的方法
CellInfoGsm,我们需要关注两个方法 getCellIdentity() 和 getCellSignalStrength()。getCellIdentity()是获取手机当前所在基站相关信息的类,包括LAC,CID等,这个搞通信的人应该都懂。而 getCellSignalStrength()是获取手机信号强度相关的类,包括dbm,RSRP等。
CellInfoCdma,CellInfoWcdma,CellInfoLte和CellInfoGsm一样可以获取到这两个方法,只是名字不同罢了,具体就不赘述,根据自己的需要获取就好。
上面说到getAllCellInfo()在GSM手机上会返回null,所以不能用这个方法,解决办法就是在早期的官方文档中提供了另外的类,GsmCellLocation和CdmaCellLocation,同样可以获取到相关的信息,但是对于3G和4G目前看来就只能使用getAllCellInfo()了,不知道后面官方会不会对bug进行修正。