很多应用都有获取自己位置的功能,比如QQ,微信等等都能获取到自己的位置
一、核心类简介
1.SDKInitializer:初始化SDK配置
2.MapView:地图数据显示
3.BaiduMap:控制地图状态
二、原理
Ⅰ.前期准备
jar包、库文件引入,key值获取
Ⅱ.地图显示
private BaiduMap baiduMap;
private MapView mapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initSDK();
setContentView(R.layout.common);
init();
}
private void init() {
// BaiduMap 管理具体的某一个MapView 操作:旋转、缩放、移动
mapView = (MapView) findViewById(R.id.mapview);
// mapView.showScaleControl(false);// 设置比例尺是否显示 默认是true
// mapView.showZoomControls(false);// 设置缩放按钮是否显示 默认是true
baiduMap = mapView.getMap();
// 改变当前地图的状态
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomTo(15);// 设置缩放到15级,默认是12级
baiduMap.setMapStatus(mapStatusUpdate);
// 设置中心点 默认是天安门
MapStatusUpdate mapStatusUpdatePoint = MapStatusUpdateFactory
.newLatLng(null);
baiduMap.setMapStatus(mapStatusUpdatePoint);
}
private void initSDK() {
// 初始化地图引擎 校验KEY
SDKInitializer.initialize(getApplicationContext());// 必须传递全局Context
//创建广播,返回地图打开状态
IntentFilter filter = new IntentFilter();
filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
registerReceiver(new SDKBroadCast(), filter);
}
class SDKBroadCast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String result = intent.getAction();
// 网络错误广播
if (result.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
Toast.makeText(getApplicationContext(), "无网络", Toast.LENGTH_SHORT).show();
}
// KEY 校验失败
else if (result.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
Toast.makeText(getApplicationContext(), "校验失败", Toast.LENGTH_SHORT).show();
}
}
}
/**
* MapView的生命周期与activity一致
*/
@Override
protected void onResume() {
mapView.onResume();
super.onResume();
}
/**
* MapView的生命周期与activity一致
*/
@Override
protected void onPause() {
mapView.onPause();
super.onPause();
}
/**
* MapView的生命周期与activity一致
*/
@Override
protected void onDestroy() {
mapView.onDestroy();
super.onDestroy();
}
1.首先初始化地图引擎和校验key值;并且注册一个广播接收者,接收校验结果和网络情况等
2.生成MapView(本质是百度提供的一个布局文件),通过findViewById返回即可
3.通过mapView得到地图状态控制器BaiduMap
4.通过MapStatusUpdate设置地图的状态
5.把设置的状态传递给baiduMap.setMapStatus()显示出地图
注意:
SDKInitializer校验一定要尽早,否则会出现校验信息还没返回就请求数据的情况
MapView的声明周期要和activity一样,否则会有异常抛出
Ⅲ.设置我的位置
private void locate() {
LocationClient mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
mLocationClient.setLocOption(option);
baiduMap.setMyLocationEnabled(true);// 打开定位图层
//设置我的位置图标
icon = BitmapDescriptorFactory
.fromResource(R.drawable.icon_geo);
MyLocationConfiguration config = new MyLocationConfiguration(
MyLocationConfiguration.LocationMode.NORMAL, true, icon);
baiduMap.setMyLocationConfigeration(config);
}
class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation result) {
//得到我的位置数据
MyLocationData dada = new MyLocationData.Builder()
.latitude(result.getLatitude())// 设置纬度
.longitude(result.getLongitude())// 设置经度
.build();
baiduMap.setMyLocationData(dada);// 显示定位信息 只有打开定位图层 才有效果
}
}
1.创建LocationClient对象(专门用于位置显示类)
2.设置位置监听器DBLocationListener
3.通过LocationClientOption设置一些显示的数据
4.通过控制器baiduMap把设置的数据呈现在地图上
三、小结
位置的显示在很多app上应用都很广泛,此外地图还有一些其他的内容
1.图层设置:卫星图,交通图,普通图
2.覆盖物:文字,Marker,泡泡显示等等
3.搜索的设置:
兴趣点:在一个范围内搜索位置
路线:驾车,公交,步行
对于每一个内容百度都给出了相应的api来实现,用法都是大同小异的
刚开始接触地图的时候有点蒙逼,不过反复看了看代码,自己也敲了敲发现原来步骤都是固定的