第一步,初始化LocationClient类
public LocationClient locationClient = null;
public BDLocationListener myListener = new MyLocationListener();
public void onCreate() {
locationClient = new LocationClient(getApplicationContext()); //声明LocationClient类
locationClient.registerLocationListener( myListener ); //注册监听函数
}
第二步,配置定位SDK参数
设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。
高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;
低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位);
仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位。
LocationClientOption类,用来做相应的设置。
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系 返回国测局经纬度坐标系:gcj02 返回百度墨卡托坐标系 :bd09 返回百度经纬度坐标系 :bd09ll
option.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
locationClient.setLocOption(option);
第三步,实现BDLocationListener接口
BDLocationListener接口有1个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
LatLng latLng = new LatLng(location.getLatitude(),
location.getLongitude());
}
}
第四步,开始定位
locationClient.start();
最后贴上完整代码:
public class MainActivity extends AppCompatActivity {
//定位SDK核心类
private LocationClient locationClient;
//定位监听
public MyLocationListenner myListener = new MyLocationListenner();
//百度地图控件
private MapView mapView;
//百度地图对象
private BaiduMap baiduMap;
// 是否首次定位
boolean isFirst = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//该方法注意要在setContentView之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
/**
* 地图初始化
*/
//获取百度地图控件
mapView = (MapView) findViewById(R.id.baiduMapView);
//获取百度地图对象
baiduMap = mapView.getMap();
// 开启定位图层
baiduMap.setMyLocationEnabled(true);
/**
* 定位初始化
*/
//声明定位SDK核心类
locationClient = new LocationClient(this);
//注册监听
locationClient.registerLocationListener(myListener);
//定位配置信息
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);//定位请求时间间隔
locationClient.setLocOption(option);
//开启定位
locationClient.start();
}
/**
* 定位SDK监听函数
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mapView == null) {
return;
}
//MyLocationData定位数据
//MyLocationData.Builder定位数据建造器
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius()) //定位精度
.direction(100) //此处设置开发者获取到的方向信息,顺时针0-360
.latitude(location.getLatitude()) //百度纬度坐标
.longitude(location.getLongitude()).build(); //百度经度坐标
baiduMap.setMyLocationData(locData);//设置定位数据, 只有先允许定位图层后设置数据才会生效
if (isFirst) {
isFirst = false;
LatLng latLng = new LatLng(location.getLatitude(),
location.getLongitude());
//定义地图状态
//MapStatus.Builder地图状态构造器
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(latLng) //设置地图中心点,为我们的位置
.zoom(18.0f); //设置地图缩放级别
//animateMapStatus以动画方式更新地图状态,动画耗时 300 ms
// MapStatusUpdateFactory.newMapStatus设置地图新状态
baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
@Override
protected void onPause() {
mapView.onPause();
super.onPause();
}
@Override
protected void onResume() {
mapView.onResume();
super.onResume();
}
@Override
protected void onDestroy() {
// 退出时销毁定位
locationClient.stop();
// 关闭定位图层
baiduMap.setMyLocationEnabled(false);
mapView.onDestroy();
mapView = null;
super.onDestroy();
}
}
效果如图:
注意:如果你的地图出现一片蓝色,原因是没开启权限的话,坐标为(0,0),经度0和纬度0的交点,大致位于非洲西部的几内亚湾,位于海上,所以是蓝色。设置targetVersion>=23,那么运行到6.0及以上设备时,默认所有权限都不开启,必须动态requestPermission,这里需要位置权限,默认没开启导致此结果,当然你也可以把targetVersion设置在22。