还剩10页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
移动联通电信获取基站数据库的方案在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电信2G3G网则使用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.public static ArrayListCellIDInfo getCellIDInfoContext context throws Exception{
2.
3. TelephonyManager manager = TelephonyManager context.getSystemServiceContext.TELEPHONY_SERVICE;
4.
5. ArrayListCellIDInfo CellID = new ArrayListCellIDInfo;
6. CellIDInfo currentCell = new CellIDInfo;
7.
8. int type = manager.getNetworkType;
9. Log.dTAG getCellIDInfo-- NetworkType = + type;
10. int phoneType = manager.getPhoneType;
11. Log.dTAG getCellIDInfo-- phoneType = + phoneType;
12.
13. if type == TelephonyManager.NETWORK_TYPE_GPRS // GSM网
14. || type == TelephonyManager.NETWORK_TYPE_EDGE
15. || type == TelephonyManager.NETWORK_TYPE_HSDPA
16. {
17. GsmCellLocation gsm = GsmCellLocation manager.getCellLocation;
18. if gsm == null
19. {
20. Log.eTAG GsmCellLocation is null!!!;
21. return null;
22. }
23.
24.
25. int lac = gsm.getLac;
26. String mcc = manager.getNetworkOperator.substring0 3;
27. String mnc = manager.getNetworkOperator.substring3 5;
28. int cid = 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.addcurrentCell;
38.
39. // 获得邻近基站信息
40. ListNeighboringCellInfo list = manager.getNeighboringCellInfo;
41. int size = list.size;
42. for int i = 0; i size; i++ {
43.
44. CellIDInfo info = new CellIDInfo;
45. info.cellId = list.geti.getCid;
46. info.mobileCountryCode = mcc;
47. info.mobileNetworkCode = mnc;
48. info.locationAreaCode = lac;
49.
50. CellID.addinfo;
51. }
52.
53. }else if type == TelephonyManager.NETWORK_TYPE_CDMA // 电信cdma网
54. || type == TelephonyManager.NETWORK_TYPE_1xRTT
55. || type == TelephonyManager.NETWORK_TYPE_EVDO_0
56. || type == TelephonyManager.NETWORK_TYPE_EVDO_A
57. {
58.
59. CdmaCellLocation cdma = CdmaCellLocation manager.getCellLocation;
60. if cdma == null
61. {
62. Log.eTAG CdmaCellLocation is null!!!;
63. return null;
64. }
65.
66. int lac = cdma.getNetworkId;
67. String mcc = manager.getNetworkOperator.substring0 3;
68. String mnc = String.valueOfcdma.getSystemId;
69. int cid = 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.addcurrentCell;
79.
80. // 获得邻近基站信息
81. ListNeighboringCellInfo list = manager.getNeighboringCellInfo;
82. int size = list.size;
83. for int i = 0; i size; i++ {
84.
85. CellIDInfo info = new CellIDInfo;
86. info.cellId = list.geti.getCid;
87. info.mobileCountryCode = mcc;
88. info.mobileNetworkCode = mnc;
89. info.locationAreaCode = lac;
90.
91. CellID.addinfo;
92. }
93. }
94.
95. return CellID;
96.
97. } 从GOOGLE的API文档里总共有14钟网络类型,这里只罗列了其中7种,其他的主要是本人也不太清楚其对应到的网络制式是怎样的所以部分童鞋的SIM卡网络制式不在这7种之内,自己根据实际情况看看它是归类于GSM还是CDMA在添进去就可以了网络上多数教程是讲GSM网获取基站的,而忽略了C网的基站这里我们可以比较一下GSM和CDMA在获取基站信息时的不同之处GSM:intlac=gsm.getLac;Stringmcc=manager.getNetworkOperator.substring03;Stringmnc=manager.getNetworkOperator.substring35;intcid=gsm.getCid;CDMA:intlac=cdma.getNetworkId;Stringmcc=manager.getNetworkOperator.substring03;Stringmnc=String.valueOfcdma.getSystemId;intcid=cdma.getBaseStationId;在获取区域码LAC时GSM使用的是GsmCellLocation.getLacCDMA则用CdmaCellLocation.getNetworkId来代替在获取基站ID时GSM使用的是GsmCellLocation.getCidCDMA则用CdmaCellLocation.getBaseStationId来代替前面获取到的都是单个基站的信息,后面再获取周围邻近基站信息以辅助通过基站定位的精准性TelephonyManager.getNeighboringCellInfo,将其也放入基站信息LIST表中最后通过google提供的gear接口获取经纬度,代码如下Html代码
1.public static Location callGearListCellIDInfo cellID {
2. if cellID == null || cellID.size == 0
3. return null;
4.
5. DefaultHttpClient client = new DefaultHttpClient;
6. HttpPost post = new HttpPosthttp://www.google.com/loc/json;
7. JSONObject holder = new JSONObject;
8.
9. try {
10. holder.putversion
1.
1.0;
11. holder.puthost maps.google.com;
12. holder.puthome_mobile_country_code cellID.get
0.mobileCountryCode;
13. holder.puthome_mobile_network_code cellID.get
0.mobileNetworkCode;
14. holder.putradio_type cellID.get
0.radioType;
15. holder.putrequest_address true;
16. if
460.equalscellID.get
0.mobileCountryCode
17. holder.putaddress_language zh_CN;
18. else
19. holder.putaddress_language en_US;
20.
21. JSONObject datacurrent_data;
22.
23. JSONArray array = new JSONArray;
24.
25. current_data = new JSONObject;
26. current_data.putcell_id cellID.get
0.cellId;
27. current_data.putlocation_area_code cellID.get
0.locationAreaCode;
28. current_data.putmobile_country_code cellID.get
0.mobileCountryCode;
29. current_data.putmobile_network_code cellID.get
0.mobileNetworkCode;
30. current_data.putage 0;
31. current_data.putsignal_strength -60;
32. current_data.puttiming_advance 5555;
33. array.putcurrent_data;
34.
35. if cellID.size 2 {
36. for int i = 1; i cellID.size; i++ {
37. data = new JSONObject;
38. data.putcell_id cellID.geti.cellId;
39. data.putlocation_area_code cellID.geti.locationAreaCode;
40. data.putmobile_country_code cellID.geti.mobileCountryCode;
41. data.putmobile_network_code cellID.geti.mobileNetworkCode;
42. data.putage 0;
43. array.putdata;
44. }
45. }
46.
47.
48.
49.
50. holder.putcell_towers array;
51.
52. StringEntity se = new StringEntityholder.toString;
53. Log.eLocation send holder.toString;
54. post.setEntityse;
55. HttpResponse resp = client.executepost;
56.
57. HttpEntity entity = resp.getEntity;
58.
59. BufferedReader br = new BufferedReader
60. new InputStreamReaderentity.getContent;
61. StringBuffer sb = new StringBuffer;
62. String result = br.readLine;
63. while result != null {
64. Log.eLocaiton reseive-- result;
65. sb.appendresult;
66. result = br.readLine;
67. }
68.
69. data = new JSONObjectsb.toString;
70.
71. data = JSONObject data.getlocation;
72.
73. Location loc = new LocationLocationManager.NETWORK_PROVIDER;
74. loc.setLatitudeDouble data.getlatitude;
75. loc.setLongitudeDouble data.getlongitude;
76. loc.setAccuracyFloat.parseFloatdata.getaccuracy.toString;
77. loc.setTime System.currentTimeMillis;//AppUtil.getUTCTime;
78. return loc;
79. } catch JSONException e {
80. e.printStackTrace;
81. return null;
82. } catch UnsupportedEncodingException e {
83. e.printStackTrace;
84. } catch ClientProtocolException e {
85. e.printStackTrace;
86. } catch IOException e {
87. e.printStackTrace;
88. }
89.
90. return null;
91. } 大家注意看这行holder.putradio_typecellID.get
0.radioType;GSM就用gsmCDMA就用cdma这个千万别搞混了,不然就获取不到信息了值得一提的是C网获取基站再定位那偏差不是一般的大,是恨大,将近1千米了,大概是C网基站较少的缘故吧最后通过经纬度获取地理位置信息,代码如下Java代码
1.public static String getAddressLocation itude throws Exception {
2. String resultString = ;
3.
4. /** 这里采用get方法,直接将参数加到URL上 */
5. String urlString = String.formathttp://maps.google.cn/maps/geokey=abcdefgq=%s%s itude.getLatitude itude.getLongitude;
6. Log.iURL urlString;
7.
8. /** 新建HttpClient */
9. HttpClient client = new DefaultHttpClient;
10. /** 采用GET方法 */
11. HttpGet get = new HttpGeturlString;
12. try {
13. /** 发起GET请求并获得返回数据 */
14. HttpResponse response = client.executeget;
15. HttpEntity entity = response.getEntity;
16. BufferedReader buffReader = new BufferedReadernew InputStreamReaderentity.getContent;
17. StringBuffer strBuff = new StringBuffer;
18. String result = null;
19. while result = buffReader.readLine != null {
20. strBuff.appendresult;
21. }
22. resultString = strBuff.toString;
23.
24. Log.eresultAdress--- resultString;
25.
26. /** 解析JSON数据,获得物理地址 */
27. if resultString != null resultString.length 0 {
28. JSONObject jsonobject = new JSONObjectresultString;
29. JSONArray jsonArray = new JSONArrayjsonobject.getPlacemark.toString;
30. resultString = ;
31. for int i = 0; i jsonArray.length; i++ {
32. resultString = jsonArray.getJSONObjecti.getStringaddress;
33. }
34. }
35. } catch Exception e {
36. throw new Exception获取物理位置出现错误: + e.getMessage;
37. } finally {
38. get.abort;
39. client = null;
40. }
41.
42. return resultString;
43. } 在获取地理位置的这个location事实上应该传入纠偏后的location,本文暂不做此处理,所以得到的地理信息位置是偶偏差的,大家注意最后附上截图PS:需要基站数据的可以联系:QQ:742631333。