在googleAPI里提供了基站信息的获取类TelephonyManager,通过其方法getCellLocation得到CellLocation即可获取到基站相关信息
但CellLocation是个抽象类,所以在具体使用时需要判断接入的网络制式来用其子类CdmaCellLocation或GsmCellLocation 来强转
CdmaCellLocation对应CDMA网,GsmCellLocation对应GSM网
三大网络运营商的网络制式对应如下:
移动2G 网 --> GSM
移动3G 网 --> TD-SCDMA
电信2G 网 --> CDMA
电信3G 网 --> CDMA2000
联通2G 网 --> GSM
联通3G 网 --> WCDMA
由此可见移动,联通2G 网都可使用GsmCellLocation
电信2G,3G网则使用CdmaCellLocation
那么移动3G和联通3G又当如何
其实经本人亲测,移动3G网也可使用GsmCellLocation,听说是TD-SCDMA衍生于GSM,具体原因咱也不用纠结了,反正能用就是了
而联通的WCDMA据说也可使用GsmCellLocation,那姑且就是这样吧,有条件的童鞋试一试吧。
对于网络制式的判断调用TelephonyManager.getNetworkType()可有多种情况,如下:
NETWORK_TYPE_UNKNOWN
NETWORK_TYPE_GPRS
NETWORK_TYPE_EDGE
NETWORK_TYPE_UMTS
NETWORK_TYPE_HSDPA
NETWORK_TYPE_HSUPA
NETWORK_TYPE_HSPA
NETWORK_TYPE_CDMA
NETWORK_TYPE_EVDO_0
NETWORK_TYPE_EVDO_A
NETWORK_TYPE_EVDO_B
NETWORK_TYPE_1xRTT
NETWORK_TYPE_IDEN
NETWORK_TYPE_LTE
NETWORK_TYPE_EHRPD
通过对网络类型判断后获取对应基站信息代码片段如下:
public static ArrayList<CellIDInfo> getCellIDInfo(Context context) throws Exception{
TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
ArrayList<CellIDInfo> CellID = new ArrayList<CellIDInfo>();
CellIDInfo currentCell = new CellIDInfo();
int type = manager.getNetworkType();
Log.d(TAG, "getCellIDInfo--> NetworkType = " + type);
int phoneType = manager.getPhoneType();
Log.d(TAG, "getCellIDInfo--> phoneType = " + phoneType);
if (type == TelephonyManager.NETWORK_TYPE_GPRS // GSM网
|| type == TelephonyManager.NETWORK_TYPE_EDGE
|| type &#