移动联通电信获取基站数据库的方案在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_UNKNOWNNETWORK_TYPE_GPRSNETWORK_TYPE_EDGENETWORK_TYPE_UMTSNETWORK_TYPE_HSDPANETWORK_TYPE_HSUPANETWORK_TYPE_HSPANETWORK_TYPE_CDMANETWORK_TYPE_EVDO_0NETWORK_TYPE_EVDO_ANETWORK_TYPE_EVDO_BNETWORK_TYPE_1xRTTNETWORK_TYPE_IDENNETWORK_TYPE_LTENETWORK_TYPE_EHRPD通过对网络类型判断后获取对应基站信息代码片段如下:Html代码1.publicstaticArrayListCellIDInfogetCellIDInfo(Contextcontext)throwsException{2.3.TelephonyManagermanager=(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);4.5.ArrayListCellIDInfoCellID=newArrayListCellIDInfo();6.CellIDInfocurrentCell=newCellIDInfo();7.8.inttype=manager.getNetworkType();9.Log.d(TAG,getCellIDInfo--NetworkType=+type);10.intphoneType=manager.getPhoneType();11.Log.d(TAG,getCellIDInfo--phoneType=+phoneType);12.13.if(type==TelephonyManager.NETWORK_TYPE_GPRS//GSM网14.||type==TelephonyManager.NETWORK_TYPE_EDGE15.||type==TelephonyManager.NETWORK_TYPE_HSDPA)16.{17.GsmCellLocationgsm=((GsmCellLocation)manager.getCellLocation());18.if(gsm==null)19.{20.Log.e(TAG,GsmCellLocationisnull!!!);21.returnnull;22.}23.24.25.intlac=gsm.getLac();26.Stringmcc=manager.getNetworkOperator().substring(0,3);27.Stringmnc=manager.getNetworkOperator().substring(3,5);28.intcid=gsm.getCid();29.30.currentCell.cellId=gsm.getCid();31.currentCell.mobileCountryCode=mcc;32.currentCell.mobileNetworkCode=mnc;33.currentCell.locationAreaCode=lac;34.35.currentCell.radioType=gsm;36.37.CellID.add(currentCell);38.39.//获得邻近基站信息40.ListNeighboringCellInfolist=manager.getNeighboringCellInfo();41.intsize=list.size();42.for(inti=0;isize;i++){43.44.CellIDInfoinfo=newCellIDInfo();45.info.cellId=list.get(i).getCid();46.info.mobileCountryCode=mcc;47.info.mobileNetworkCode=mnc;48.info.locationAreaCode=lac;49.50.CellID.add(info);51.}52.53.}elseif(type==TelephonyManager.NETWORK_TYPE_CDMA//电信cdma网54.||type==TelephonyManager.NETWORK_TYPE_1xRTT55.||type==TelephonyManager.NETWORK_TYPE_EVDO_056.||type==TelephonyManager.NETWORK_TYPE_EVDO_A)57.{58.59.CdmaCellLocationcdma=(CdmaCellLocation)manager.getCellLocation();60.if(cdma==null)61.{62.Log.e(TAG,CdmaCellLocationisnull!!!);63.returnnull;64.}65.66.intlac=cdma.getNetworkId();67.Stringmcc=manager.getNetworkOperator().substring(0,3);68.Stringmnc=String.valueOf(cdma.getSystemId());69.intcid=cdma.getBaseStationId();70.71.currentCell.cellId=cid;72.currentCell.mobileCountryCode=mcc;73.currentCell.mobileNetworkCode=mnc;74.currentCell.locationAreaCode=lac;75.76.currentCell.radioType=cdma;77.78.CellID.add(currentCell);79.80.//获得邻近基站信息81.ListNeighboringCellInfolist=manager.getNeighboringCellInfo();82.intsize=list.size();83.for(inti=0;isize;i++){84.85.CellIDInfoinfo=newCellIDInfo();86.info.cellId=list.get(i).getCid();87.info.mobileCountryCode=mcc;88.info.mobileNetworkCode=mnc;89.info.locationAreaCode=lac;90.91.CellID.add(info);92.}93.}94.95.returnCellID;96.97.}从GOOGLE的API文档里总共有14钟网络类型,这里只罗列了其中7种,其他的主要是本人也不太清楚其对应到的网络制式是怎样的所以部分童鞋的SIM卡网络制式不在这7种之内,自己根据实际情况看看它是归类于GSM还是CDMA在添进去就可以了网络上多数教程是讲GSM网获取基站的,而忽略了C网的基站这里我们可以比较一下GSM和CDMA在获取基站信息时的不同之处GSM:intlac=gsm.getLac();Stringmcc=manager.getNetworkOperator().substring(0,3);Stringmnc=manager.getNetworkOperator().substring(3,5);intcid=gsm.getCid();CDMA:intlac=cdma.getNetworkId();Stringmcc=manager.getNetworkOperator().substring(0,3);Stringmnc=String.valueOf(cdma.getSystemId());intcid=cdma.getBaseStationId();在获取区域码LAC时GSM使用的是GsmCellLocation.getLac(),CDMA则用CdmaCellLocation.getNetworkId()来代替在获取基站ID时GSM使用的是GsmCellLocation.getCid(),CDMA则用CdmaCellLocation.getBaseStationId()来代替前面获取到的都是单个基站的信息,后面再获取周围邻近基站信息以辅助通过基站定位的精准性TelephonyManager.getNeighboringCellInfo(),将其也放入基站信息LIST表中最后通过google提供的gear接口获取经纬度,代码如下:Html代码1.publicstaticLocationcallGear(ListCellIDInfocellID){2.if(cellID==null||cellID.size()==0)3.returnnull;4.5.DefaultHttpClientclient=newDefaultHttpClient();6.HttpPostpost=newHttpPost();7.JSONObjectholder=newJSONObject();8.9.try{10.holder.put(version,1.1.0);11.holder.put(host,maps.google.com);12.holder.put(home_mobile_country_code,cellID.get(0).mobileCountryCode);13.holder.put(home_mobile_network_code,cellID.get(0).mobileNetworkCode);14.holder.put(radio_type,cellID.get(0).radioType);15.holder.put(request_address,true);16.if(460.equals(cellID.get(0).mobileCountryCode))17.holder.put(address_language,zh_CN);18.else19.holder.put(address_language,en_US);20.21.JSONObjectdata,current_data;22.23.JSONArrayarray=newJSONArray();24.25.current_data=newJSONObject();26.current_data