1.配置百度地图开发环境
1.1.下载开发包
1.2配置Demo
1.3配置自己的开发环境:按照开发指南进行配置
2.获取安全码
(开发版sha1,和发布版SHA1值和包名)
开发版SHA1值获取:http://blog.csdn.net/qq_29269233/article/details/53725865
发布版SHA1值获取(其中自己的签名文件为生成apk所在的目录,需要先将自己的项目打包生成apk):
http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=112007(发布版)
Android 签名证书的sha1值:
包名:需要使用百度地图的应用的包名
注意:自己在写项目的时候用百度地图的时候,开发版和发布版的sha1都配置了,运行的很不错,第二次在写定位的时候,自己懒了点就漏配置了一个sha1值,而且官方文档上也写明了非必填项,结果就出bug了,获取位置经纬度的时候我打印的log,第一次打印正确,第二个log就错误,改了好久一直没找到原因,最后自己去配置之前漏的sha1值就没问题了,以后还是老老实实都配置吧
3.通过获取的sha1和包名获取key
4.创建应用加载百度地图(Hello BaiduMap)
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/hellobaidumap
初始化
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
5.监听key是否正确,通过广播去验证
//5.监听key
private void registerSDKCheckRecerver() {
mReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action=intent.getAction();
if (SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR.equals(action)){
showToast("网络错误");
}else if(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR.equals(action)){
showToast("key验证失败");
}
}
};
IntentFilter filter=new IntentFilter();
//监听网络错误
filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
//监听百度地图sdk的key是否正确
filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
//注册广播
registerReceiver(mReceiver,filter);
}
6.MapView与BaiduMap*(重点)*
/**
* Created by luuuzi on 2017/9/26.
*/
public class BaseActivity extends Activity {
private String tag="BaseActivity";
public MapView mMapView;
BaiduMap baiduMap;
//地图状态发生改变
public MapStatusUpdate mMapStatusUpdate;
//坐标对象(举例:腾讯大厦坐标:22.5460778801,113.9410619639)
//参数1:纬度,参数2:经度
public LatLng tencentPos = new LatLng(22.5460778801, 113.9410619639);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//tag = "HelloBaiduMapActivity";
//到这一步就会显示出地图,是已天安门为中心
mMapView = (MapView) findViewById(R.id.bmapView);
//这个方法是给地图设置参数的
baidumapTest();
}
private void baidumapTest() {
//获取地图控制器,可以获取好多事件监听
baiduMap = mMapView.getMap();
// 1.隐藏缩放按钮,比例尺
//mMapView.showZoomControls(false);//隐藏缩放按钮,默认为显示
//mMapView.showScaleControl(false);//隐藏比例尺按钮,默认是显示的
//通过控制器
float maxZoomLevel = baiduMap.getMaxZoomLevel();//获取地图的最大缩放级别
float minZoomLevel = baiduMap.getMinZoomLevel();//获取地图的最小缩放级别
// 2.获取最小(3),最大缩放级别(22)
Log.i(tag, "地图最大缩放级别" + maxZoomLevel + ";地图最小缩放级别:" + minZoomLevel);
//09-26 11:46:29.401: I/HelloBaiduMapActivity(30819): 地图最大缩放级别22.0;地图最小缩放级别:3.0
// 3.设置地图中心点
//newLatLng,通过经纬度设置中心位置,参数1():维度,参数2:经度
mMapStatusUpdate = MapStatusUpdateFactory.newLatLng(tencentPos);
baiduMap.setMapStatus(mMapStatusUpdate);
//
// 4.设置地图缩放为15
//zoomBy()是增量,zoomTo()是绝对值
mMapStatusUpdate = MapStatusUpdateFactory.zoomTo(15);
baiduMap.setMapStatus(mMapStatusUpdate);
// 6.获取地图UI控制器:隐藏指南针
UiSettings uiSetting=baiduMap.getUiSettings();
//不显示指南针
uiSetting.setCompassEnabled(false);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
//自定义的toast
public void showToast(CharSequence text){
ToastUtils.showToast(this,text);
}
}
比例尺
mMapView.showZoomControls(false);//隐藏缩放按钮,默认为显示
mMapView.showScaleControl(false);//隐藏比例尺按钮,默认是显示的
2.获取最小(3),最大缩放级别(22)
//通过控制器
float maxZoomLevel=baiduMap.getMaxZoomLevel();//获取地图的最大缩放级别
float minZoomLevel=baiduMap.getMinZoomLevel();//获取地图的最小缩放级别
// 2.获取最小(3),最大缩放级别(22)
Log.i(tag,"地图最大缩放级别"+maxZoomLevel+";地图最小缩放级别:"+minZoomLevel);
//09-26 11:46:29.401: I/HelloBaiduMapActivity(30819): 地图最大缩放级别22.0;地图最小缩放级别:3.0
3.设置地图中心点
//坐标对象(腾讯大厦坐标:22.5460778801,113.9410619639)
//参数1:纬度,参数2:经度
private LatLng tencentPos=new LatLng(22.5460778801,113.9410619639);
//newLatLng,通过经纬度设置中心位置,参数1():维度,参数2:经度
mMapStatusUpdate= MapStatusUpdateFactory.newLatLng(tencentPos);
baiduMap.setMapStatus(mMapStatusUpdate);
4.设置地图缩放为15
//zoomBy()是增量,zoomTo()是绝对值
mMapStatusUpdate= MapStatusUpdateFactory.zoomTo(15);
baiduMap.setMapStatus(mMapStatusUpdate);
5.更新地图状态
1)缩小
2)放大
3)旋转(0~360),每次在原来的基础上在旋转30度
4)俯、仰(0~45),每次在原来的基础上在俯视-5度
5)移动
@Override
public void onClick(View view) {
MapStatusUpdate mapstatusupdate=null;
switch (view.getId()) {
case R.id.btn1:
// 1)缩小
mapstatusupdate=MapStatusUpdateFactory.zoomOut();
break;
case R.id.btn2:
// 2)放大
mapstatusupdate=MapStatusUpdateFactory.zoomIn();
break;
case R.id.btn3:
// 3)旋转(0~360),每次在原来的基础上在旋转30度
//3.1先拿到原来的角度
MapStatus currentMapStatus=baiduMap.getMapStatus();
//原来的角度+30度
float rotate=currentMapStatus.rotate+30;
//创建一个地图状态,给该状态中添加角度
MapStatus mapStatus=new MapStatus.Builder().rotate(rotate).build();
mapstatusupdate=MapStatusUpdateFactory.newMapStatus(mapStatus);
break;
case R.id.btn4:
// 4)俯、仰(0~45),每次在原来的基础上在俯视-5度(只支持负数,正数没有效果)
MapStatus currentMapStatus4=baiduMap.getMapStatus();
float overlook=currentMapStatus4.overlook-5;
MapStatus mapStatus4=new MapStatus.Builder().overlook(overlook).build();
mapstatusupdate=MapStatusUpdateFactory.newMapStatus(mapStatus4);
break;
case R.id.btn5:
// 5)移动
mapstatusupdate=MapStatusUpdateFactory.newLatLng(tencentPos);
//让其缓慢移动,以动画的方式更新地图动态,动画耗时2s,
baiduMap.animateMapStatus(mapstatusupdate,2000);
}
baiduMap.setMapStatus(mapstatusupdate);
}
6.获取地图UI控制器:隐藏指南针
UiSettings uiSetting=baiduMap.getUiSettings();
//不显示指南针
uiSetting.setCompassEnabled(false);
Demo:https://github.com/luuuzi007/BaiduMpa
定位功能的实现
项目需要获取经纬度,直接去看文档发现不难,记录一下吧(隔的时间有点久都忘了自己怎么写的)
/**
* 百度地图定位管理器
*/
public LocationClient mLocationClient = null;
private MyLocationListener myListener = new MyLocationListener();
/**
* 百度地图初始化,和配置参数
*/
private void initBaiduMap() {
mLocationClient = new LocationClient(getApplicationContext());
//声明LocationClient类
mLocationClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选,设置定位模式,默认高精度
//LocationMode.Hight_Accuracy:高精度;
//LocationMode. Battery_Saving:低功耗;
//LocationMode. Device_Sensors:仅使用设备;
option.setCoorType("bd09ll");
//可选,设置返回经纬度坐标类型,默认gcj02
//gcj02:国测局坐标;
//bd09ll:百度经纬度坐标;
//bd09:百度墨卡托坐标;
//海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标
option.setScanSpan(1000);
//可选,设置发起定位请求的间隔,int类型,单位ms
//如果设置为0,则代表单次定位,即仅定位一次,默认为0
//如果设置非0,需设置1000ms以上才有效
option.setOpenGps(true);
//可选,设置是否使用gps,默认false
//使用高精度和仅用设备两种定位模式的,参数必须设置为true
option.setLocationNotify(true);
//可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
option.setIgnoreKillProcess(false);
//可选,定位SDK内部是一个service,并放到了独立进程。
//设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
//option.setIgnoreCacheException(false);
//可选,设置是否收集Crash信息,默认收集,即参数为false
//option.setWifiValidTime(5*60*1000);
//可选,7.2版本新增能力
//如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位
option.setEnableSimulateGps(false);
//可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
mLocationClient.setLocOption(option);
//mLocationClient为第二步初始化过的LocationClient对象
//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
//更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明
}
/**
* 百度地图获取经度,纬度 ,接口实现
*/
public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
//以下只列举部分获取经纬度相关(常用)的结果信息
//更多结果信息获取说明,请参照类参考中BDLocation类中的说明
double latitude = location.getLatitude(); //获取纬度信息
double longitude = location.getLongitude(); //获取经度信息
//存储获取的数据
latitude_str = String.valueOf(latitude);
longitude_str = String.valueOf(longitude);
float radius = location.getRadius(); //获取定位精度,默认值为0.0f
//Log.i(tag, "百度地图定位:经度:" + longitude + ",纬度:" + latitude);
String coorType = location.getCoorType();
//获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
int errorCode = location.getLocType();
//获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
}
}
启动定位
//启动百度定位
mLocationClient.start();
关闭定位
//关闭定位
mLocationClient.stop();