Android GSM+CDMA基站定位

但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种,其他的主要是本人也不太清楚其对应到的网络制式是怎样的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/psfxz.html