但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 == TelephonyManager.NETWORK_TYPE_HSDPA) { GsmCellLocation gsm = ((GsmCellLocation) manager.getCellLocation()); if (gsm == null) { Log.e(TAG, "GsmCellLocation is null!!!"); return null; } int lac = gsm.getLac(); String mcc = manager.getNetworkOperator().substring(0, 3); String mnc = manager.getNetworkOperator().substring(3, 5); int cid = gsm.getCid(); currentCell.cellId = gsm.getCid(); currentCell.mobileCountryCode = mcc; currentCell.mobileNetworkCode = mnc; currentCell.locationAreaCode = lac; currentCell.radioType = "gsm"; CellID.add(currentCell); // 获得邻近基站信息 List<NeighboringCellInfo> list = manager.getNeighboringCellInfo(); int size = list.size(); for (int i = 0; i < size; i++) { CellIDInfo info = new CellIDInfo(); info.cellId = list.get(i).getCid(); info.mobileCountryCode = mcc; info.mobileNetworkCode = mnc; info.locationAreaCode = lac; CellID.add(info); } }else if (type == TelephonyManager.NETWORK_TYPE_CDMA // 电信cdma网 || type == TelephonyManager.NETWORK_TYPE_1xRTT || type == TelephonyManager.NETWORK_TYPE_EVDO_0 || type == TelephonyManager.NETWORK_TYPE_EVDO_A) { CdmaCellLocation cdma = (CdmaCellLocation) manager.getCellLocation(); if (cdma == null) { Log.e(TAG, "CdmaCellLocation is null!!!"); return null; } int lac = cdma.getNetworkId(); String mcc = manager.getNetworkOperator().substring(0, 3); String mnc = String.valueOf(cdma.getSystemId()); int cid = cdma.getBaseStationId(); currentCell.cellId = cid; currentCell.mobileCountryCode = mcc; currentCell.mobileNetworkCode = mnc; currentCell.locationAreaCode = lac; currentCell.radioType = "cdma"; CellID.add(currentCell); // 获得邻近基站信息 List<NeighboringCellInfo> list = manager.getNeighboringCellInfo(); int size = list.size(); for (int i = 0; i < size; i++) { CellIDInfo info = new CellIDInfo(); info.cellId = list.get(i).getCid(); info.mobileCountryCode = mcc; info.mobileNetworkCode = mnc; info.locationAreaCode = lac; CellID.add(info); } } return CellID; }
从GOOGLE的API文档里总共有14钟网络类型,这里只罗列了其中7种,其他的主要是本人也不太清楚其对应到的网络制式是怎样的