Zane'Blog

Android之百度地图系列教程三:定位

如果你很在意别人的评价,要么是你站得不够高,要么你是在做淘宝

添加权限

1
2
3
4
5
6
7
8
9
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

添加百度定位回调service

1
2
3
4
5
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>

封装后的百度定位类BaiduLocation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package io.github.zane.carinteraction;
import android.content.Context;
import android.util.Log;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
/**
* Created by Zane on 2017/7/17.
*/
public class BaiduLocation {
/**
* 经度
*
*/
public static double mylongitude = -1.0;
/**
* 纬度
*
*/
public static double mylatitude = -1.0;
/**
* 城市
*/
public static String myCity = null;
/**
* 街道
*/
public static String myCityadd = null;
/**
* 回调经纬度方法
*
* @param myLocationListener
*/
public static void setMyLocationListener(MyLocationListener myLocationListener) {
BaiduLocation.myLocationListener = myLocationListener;
}
public static MyLocationListener myLocationListener;
/**
* 回调经纬度的接口定义
*
* @author Administrator
*
*/
public static interface MyLocationListener {
public void myLocatin(double mylongitude, double mylatitude, String city, String street);
};
/**
* 获取当前经纬度
*
* @param context
*/
public static void getLocation(Context context) {
final LocationClient locationClient = new LocationClient(context);
// 设置定位条件
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 是否打开GPS
option.setCoorType("bd09ll"); // 设置返回值的坐标类型。
option.setPriority(LocationClientOption.NetWorkFirst); // 设置定位优先级
option.setProdName("CarInteraction"); // 设置产品线名称。强烈建议您使用自定义的产品线名称,方便我们以后为您提供更高效准确的定位服务。
option.setScanSpan(5000); // 设置定时定位的时间间隔。单位毫秒
option.setAddrType("all");// 显示所有信息,街道
locationClient.setLocOption(option);
// 注册位置监听器
locationClient.registerLocationListener(new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
// TODO Auto-generated method stub
if (location == null) {
return;
}
Log.d("baidulocation", "baidulocation1");
// sb.append("Time : ");
// sb.append(location.getTime());
// sb.append("\nError code : ");
// sb.append(location.getLocType());
// sb.append("\nLatitude : ");
// sb.append(location.getLatitude());
// sb.append("\nLontitude : ");
// sb.append(location.getLongitude());
// sb.append("\nRadius : ");
// sb.append(location.getRadius());
// if (location.getLocType() == BDLocation.TypeGpsLocation){
// sb.append("\nSpeed : ");
// sb.append(location.getSpeed());
// sb.append("\nSatellite : ");
// sb.append(location.getSatelliteNumber());
// } else
if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
// sb.append("\nAddress : ");
// sb.append(location.getAddrStr());
String district = location.getAddress().district;
myCityadd = location.getAddrStr();
myCity = location.getCity();
mylongitude = location.getLongitude();
mylatitude = location.getLatitude();
Log.d("baidulocation", mylongitude+"\n"+mylatitude+"\n"+ myCity+"\n"+district);
// 经纬度
if (myLocationListener != null) {
myLocationListener.myLocatin(mylongitude, mylatitude, myCity, district);
//TODO 停止实时定位
// locationClient.stop();
}
}
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
});
locationClient.start();
/*
* 当所设的整数值大于等于1000(ms)时,定位SDK内部使用定时定位模式。调用requestLocation(
* )后,每隔设定的时间,定位SDK就会进行一次定位。如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,
* 返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。
* 定时定位时,调用一次requestLocation,会定时监听到定位结果。
*/
locationClient.requestLocation();
Log.d("baidulocation", "baidulocation");
}
}

使用封装类进行定位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
BaiduLocation.getLocation(this);
BaiduLocation.setMyLocationListener(new BaiduLocation.MyLocationListener(){
@Override
public void myLocatin(double mylongitude, double mylatitude, String city, String street) {
mBaiduMap.clear();
LatLng ll = new LatLng(mylatitude, mylongitude);
// 按照经纬度确定地图位置
if (ifFrist) {
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
// 移动到某经纬度
mBaiduMap.animateMapStatus(update);
update = MapStatusUpdateFactory.zoomBy(8f);
// 放大
mBaiduMap.animateMapStatus(update);
ifFrist = false;
}
// 显示个人位置图标
MyLocationData.Builder builder = new MyLocationData.Builder();
builder.latitude(mylatitude);
builder.longitude(mylongitude);
MyLocationData data = builder.build();
mBaiduMap.setMyLocationData(data);
MarkerOptions ooA = new MarkerOptions().position(ll).icon(BitmapDescriptorFactory.fromResource(R.mipmap.pin_icon)).zIndex(9).draggable(true);
mBaiduMap.addOverlay(ooA);
}
});
坚持原创技术分享,您的支持将鼓励我继续创作!