Android百度地图——定位SDK(版本v3.1)(一)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android百度地图——定位SDK(版本v3.1)(一)
分类:Android百度地图2013-02-16 21:12 1078人阅读评论(2) 收藏举报androidAndroidANDROIDgpsGPS在wifi3G2G环境下定位百度地图
一、使用百度提供的地图定位服务所需资源:
在百度官网,下载百度地图定位SDK(Android版),在里面找liblocSDK3.so和
locSDK_3.1.jar这两个文件。

下载地址:/map/geosdk-android-download.htm
二、搭建环境:
1、将liblocSDK3.so文件拷贝到libs/armeabi目录下,将locSDK3.1.jar文件拷贝到libs 目录下,并将locSDK3.1.jar导入到工程中。

如下图:
2、修改AndroidManifest.xml文件:
a. 在application标签中声明service组件
1<service
2android:enabled="true"
3android:name="com.baidu.location.f"
4android:process=":remote"/>
b. 声明所需权限
5<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 6<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 7<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
8<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 9<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
10<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
11<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 12<uses-permission android:name="android.permission.INTERNET"/>
13<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
/>
14<uses-permission android:name="android.permission.READ_LOGS"/>
三、具体实现:
1、构建LocationClient类的对象,设置定位参数,并注册实现了BDLocationListener 接口的类的对象为监听器。

15mLocationClient = new LocationClient(this.getApplicationContext());
16
17mBDLocationListener = new MyBDLocationListener();
18mLocationClient.registerLocationListener(mBDLocationListener);
19
20LocationClientOption option = new LocationClientOption();
21
22// 需要地址信息,设置为其他任何值(string类型,且不能为null)时,都表示无地址信息。

23option.setAddrType("all");
24// 设置是否返回POI的电话和地址等详细信息。

默认值为false,即不返回POI的电话和地址信息。

25option.setPoiExtraInfo(true);
26
27// 设置产品线名称。

强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。

28option.setProdName("定位我当前的位置");
29
30// 打开GPS,使用gps前提是用户硬件打开gps。

默认是不打开gps的。

31option.setOpenGps(false);
32
33// 定位的时间间隔,单位:ms
34// 当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。

35// option.setScanSpan(1000);
36
37// 查询范围,默认值为500,即以当前定位位置为中心的半径大小。

38option.setPoiDistance(500);
39// 禁用启用缓存定位数据
40option.disableCache(true);
41
42// 坐标系类型,百度手机地图对外接口中的坐标系默认是bd09ll
43option.setCoorType("bd09ll");
44
45// 设置最多可返回的POI个数,默认值为3。

由于POI查询比较耗费流量,设置最多返回的POI 个数,以便节省流量。

46option.setPoiNumber(3);
47
48// 设置定位方式的优先级。

49// 即使有GPS,而且可用,也仍旧会发起网络请求。

这个选项适合对精确坐标不是特别敏感,但是希望得到位置描述的用户。

50option.setPriority(WorkFirst);
51
52mLocationClient.setLocOption(option);
2、发起请求:
53// 发起定位请求
54 findViewById(R.id.btn_request).setOnClickListener(new
View.OnClickListener() {
55
56@Override
57public void onClick(View v) {
58 mLocationClient.start();
59 }
60 });
62// 发起重新定位
63 findViewById(R.id.btn_location).setOnClickListener(new
View.OnClickListener() {
64
65@Override
66public void onClick(View v) {
67if (mLocationClient != null && mLocationClient.isStarted()){
68 mLocationClient.requestLocation();
69 }
70 }
71 });
72
73// 发起查询请求
74 findViewById(R.id.btn_address).setOnClickListener(new
View.OnClickListener() {
75
76@Override
77public void onClick(View v) {
78if (mLocationClient != null && mLocationClient.isStarted()){
79 mLocationClient.requestPoi();
80 }
81 }
82 });
3、编写BDLocationListener接口的实现类,接收异步返回的定位结果和异步返回
的POI查询结果。

83final class MyBDLocationListener implements BDLocationListener{
84
85@Override
86public void onReceiveLocation(BDLocation location) {
87 Log.e(TAG, "---------onReceiveLocation()---------");
88
89if(location == null){
90 Log.e(TAG, "---------onReceiveLocation------location is NULL----");
91return;
92 }
93
94int type = location.getLocType();
95 Log.i(TAG, "当前定位采用的类型是:type = " + type);
97 String coorType = location.getCoorType();
98 Log.i(TAG, "坐标系类型:coorType = " + coorType);
99
100// 判断是否有定位精度半径
101if(location.hasRadius()){
102// 获取定位精度半径,单位是米
103float accuracy = location.getRadius();
104 Log.i(TAG, "accuracy = " + accuracy);
105 }
106
107if(location.hasAddr()){
108// 获取反地理编码。

只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。

109 String address = location.getAddrStr();
110 Log.i(TAG, "address = " + address);
111 }
112
113 String province = location.getProvince(); // 获取省份信息
114 String city = location.getCity(); // 获取城市信息
115 String district = location.getDistrict(); // 获取区县信息
116
117 Log.i(TAG, "province = " + province);
118 Log.i(TAG, "city = " + city);
119 Log.i(TAG, "district = " + district);
120
121double latitude = location.getLatitude();
122double longitude = location.getLongitude();
123 Log.i(TAG, "latitude = " + latitude);
124 Log.i(TAG, "longitude = " + longitude);
125
126 }
127
128@Override
129public void onReceivePoi(BDLocation poiLocation) {
130
131 Log.e(TAG, "---------onReceivePoi()---------");
132
133if(poiLocation == null){
134 Log.e(TAG, "---------onReceivePoi------location is NULL----"); 135return;
136 }
137
138if(poiLocation.hasPoi()){
139 String poiStr = poiLocation.getPoi();
140 Log.i(TAG, "poiStr = " + poiStr);
141
142 }
143
144if(poiLocation.hasAddr()){
145// 获取反地理编码。

只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。

146 String address = poiLocation.getAddrStr();
147 Log.i(TAG, "address = " + address);
148 }
149 }
150 }
4、定位结束后停止服务:
151if(mLocationClient != null && mLocationClient.isStarted()){
152if(mBDLocationListener != null){
153
mLocationClient.unRegisterLocationListener(mBDLocationListener);
154 }
155
156 mLocationClient.stop();
157 mLocationClient = null;
158 }
四、运行效果图:
点击第一个按钮,Logcat打印的日志如下:
点击第二个按钮,Logcat打印的日志如下:
点击第三个按钮,Logcat打印的日志如下:
点击第三个按钮,Logcat打印的日志如下:
点击第三个按钮,Logcat打印的日志如下:
2、在wifi环境下:
点击第三个按钮,Logcat打印的日志如下:
注:我是在房子里面,也就是说:只能用WIFI或者3G/2G网络粗略的确定我当前的位置信息。

我用3G/2G网络和WIFI都测过了,每次间隔要大于1秒。

通过上面的Logcat打印出的结果,我们大致可以得出这样的结论:在WIFI或者3G/2G网络只能粗略的确定我当前的位置信息。

可能会差很大,也就是说不靠谱。

大家可以自己测测看,呵呵。

完整代码:
159package com.android.baidu.map;
160
161import android.app.Activity;
162import android.os.Bundle;
163import android.util.Log;
164import android.view.View;
165
166import com.baidu.location.BDLocation;
167import com.baidu.location.BDLocationListener;
168import com.baidu.location.LocationClient;
169import com.baidu.location.LocationClientOption;
170
171/**
172 * 获取我当前的位置信息。

173 * 对精确坐标不是特别敏感,但是希望得到位置描述。

174 * @author android_ls
175 *
176 */
177public class BaiduMapLoactionActivity extends Activity {
178
179private static final String TAG = "BaiduMapLoactionActivity";
180
181private LocationClient mLocationClient;
182
183private MyBDLocationListener mBDLocationListener;
184
185@Override
186public void onCreate(Bundle savedInstanceState) {
187super.onCreate(savedInstanceState);
188 setContentView(yout.main);
189
190 mLocationClient = new LocationClient(this.getApplicationContext()); 191
192 mBDLocationListener = new MyBDLocationListener();
193 mLocationClient.registerLocationListener(mBDLocationListener);
194
195 LocationClientOption option = new LocationClientOption();
196
197// 需要地址信息,设置为其他任何值(string类型,且不能为null)时,都表示无地址信息。

198 option.setAddrType("all");
199// 设置是否返回POI的电话和地址等详细信息。

默认值为false,即不返回POI的电话和地址信息。

200 option.setPoiExtraInfo(true);
201
202// 设置产品线名称。

强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。

203 option.setProdName("定位我当前的位置");
204
205// 打开GPS,使用gps前提是用户硬件打开gps。

默认是不打开gps的。

206 option.setOpenGps(false);
207
208// 定位的时间间隔,单位:ms
209// 当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。

210// option.setScanSpan(1000);
211
212// 查询范围,默认值为500,即以当前定位位置为中心的半径大小。

213 option.setPoiDistance(500);
214// 禁用启用缓存定位数据
215 option.disableCache(true);
216
217// 坐标系类型,百度手机地图对外接口中的坐标系默认是bd09ll
218 option.setCoorType("bd09ll");
219
220// 设置最多可返回的POI个数,默认值为3。

由于POI查询比较耗费流量,设置最多返回的POI个数,以便节省流量。

221 option.setPoiNumber(3);
222
223// 设置定位方式的优先级。

224// 即使有GPS,而且可用,也仍旧会发起网络请求。

这个选项适合对精确坐标不是特别敏感,但是希望得到位置描述的用户。

225 option.setPriority(WorkFirst);
226
227 mLocationClient.setLocOption(option);
228
229// 发起定位请求
230 findViewById(R.id.btn_request).setOnClickListener(new
View.OnClickListener() {
231
232@Override
233public void onClick(View v) {
234 mLocationClient.start();
235 }
236 });
237
238// 发起重新定位
239 findViewById(R.id.btn_location).setOnClickListener(new
View.OnClickListener() {
240
241@Override
242public void onClick(View v) {
243if (mLocationClient != null && mLocationClient.isStarted()){ 244 mLocationClient.requestLocation();
245 }
246 }
247 });
248
249// 发起查询请求
250 findViewById(R.id.btn_address).setOnClickListener(new
View.OnClickListener() {
251
252@Override
253public void onClick(View v) {
254if (mLocationClient != null && mLocationClient.isStarted()){ 255 mLocationClient.requestPoi();
256 }
257 }
258 });
259
260 }
261
262final class MyBDLocationListener implements BDLocationListener{
263
264@Override
265public void onReceiveLocation(BDLocation location) {
266 Log.e(TAG, "---------onReceiveLocation()---------");
267
268if(location == null){
269 Log.e(TAG, "---------onReceiveLocation------location is
NULL----");
270return;
271 }
272
273int type = location.getLocType();
274 Log.i(TAG, "当前定位采用的类型是:type = " + type);
275
276 String coorType = location.getCoorType();
277 Log.i(TAG, "坐标系类型:coorType = " + coorType);
278
279// 判断是否有定位精度半径
280if(location.hasRadius()){
281// 获取定位精度半径,单位是米
282float accuracy = location.getRadius();
283 Log.i(TAG, "accuracy = " + accuracy);
284 }
285
286if(location.hasAddr()){
287// 获取反地理编码。

只有使用网络定位的情况下,才能获取当前位置的反地
理编码描述。

288 String address = location.getAddrStr();
289 Log.i(TAG, "address = " + address);
290 }
291
292 String province = location.getProvince(); // 获取省份信息
293 String city = location.getCity(); // 获取城市信息
294 String district = location.getDistrict(); // 获取区县信息
295
296 Log.i(TAG, "province = " + province);
297 Log.i(TAG, "city = " + city);
298 Log.i(TAG, "district = " + district);
299
300double latitude = location.getLatitude();
301double longitude = location.getLongitude();
302 Log.i(TAG, "latitude = " + latitude);
303 Log.i(TAG, "longitude = " + longitude);
304
305 }
306
307@Override
308public void onReceivePoi(BDLocation poiLocation) {
309
310 Log.e(TAG, "---------onReceivePoi()---------");
311
312if(poiLocation == null){
313 Log.e(TAG, "---------onReceivePoi------location is NULL----"); 314return;
315 }
316
317if(poiLocation.hasPoi()){
318 String poiStr = poiLocation.getPoi();
319 Log.i(TAG, "poiStr = " + poiStr);
320
321 }
322
323if(poiLocation.hasAddr()){
324// 获取反地理编码。

只有使用网络定位的情况下,才能获取当前位置的反地理编码描述。

325 String address = poiLocation.getAddrStr();
326 Log.i(TAG, "address = " + address);
327 }
328 }
329 }
330
331@Override
332protected void onDestroy() {
333if(mLocationClient != null && mLocationClient.isStarted()){ 334if(mBDLocationListener != null){
335
mLocationClient.unRegisterLocationListener(mBDLocationListener);
336 }
337
338 mLocationClient.stop();
339 mLocationClient = null;
340 }
341
342super.onDestroy();
343 }
344
345}。

相关文档
最新文档