开发项目经常用到百度地图sdk,
先在百度地图开发平台,注册账户,创建应用,获取AK
然后根据需要下载sdk,配置Android Studio
具体的接入过程,可以直接查阅官方文档Android地图SDK | 百度地图API SDK (baidu.com)
目录
准备工作
MyApplication的onCreate中初始化
fun initBaiduMap(){
// 是否同意隐私政策,默认为false
SDKInitializer.setAgreePrivacy(instance, true)
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
SDKInitializer.initialize(instance)
//自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
//包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
SDKInitializer.setCoordType(CoordType.BD09LL)
}
Activity中,具体使用,onCreate中先申请权限
private fun requestLocationPermission() {
requestPermission(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
), REQUEST_PERMISSION_LOCATION
)
}
申请权限成功之后开启定位
/**
* 开启定位
*/
private fun startBaiduMapLocationClient() {
if (mLocationClient != null && mLocationClient!!.isStarted) {
return
}
LocationClient.setAgreePrivacy(true)//同意隐私协议
binding.mapView.map.isMyLocationEnabled = true
binding.mapView.showZoomControls(false)//设置是否显示放大缩小按钮
binding.mapView.map.uiSettings.isRotateGesturesEnabled = false//设置地图不能旋转
mLocationClient = LocationClient(this)//声明LocationClient类
mLocationClient?.registerLocationListener(MyLocationListener())//注册监听
mLocationClient?.locOption = LocationClientOption().also {
it.openGps = true//允许GPS
it.coorType = "bd09ll"//坐标类型,和MyApplication中的设置成一样,两边都设置一下
it.setScanSpan(1000)//心跳频率1s,这个设置了之后,地图会每隔设定时间自动定位
it.setIsNeedAddress(true)//是否需要地址信息
it.setIsNeedLocationDescribe(true)//是否需要位置描述信息
it.setIsNeedLocationPoiList(false)//获得周边POI信息
}
mLocationClient?.start()
//地图上线段(测量记录)点击事件监听
binding.mapView.map.setOnPolylineClickListener(object : OnPolylineClickListener{
override fun onPolylineClick(polyline: Polyline?): Boolean {
Log.e(MyConstant.TAG, "setOnPolylineClickListener polyline")
showPolylineDialog(polyline)
return true
}
})
//点击Marker的监听事件
binding.mapView.map.setOnMarkerClickListener(object : OnMarkerClickListener{
override fun onMarkerClick(marker: Marker?): Boolean {
Log.e(MyConstant.TAG, "setOnMarkerClickListener marker")
showMarkerInfoWindow(marker)
return true
}
})
//滑动地图的监听事件
binding.mapView.map.setOnMapTouchListener(object : OnMapTouchListener{
override fun onTouch(p0: MotionEvent?) {
}
})
}
获取到定位的监听事件
inner class MyLocationListener : BDAbstractLocationListener() {
override fun onReceiveLocation(location: BDLocation?) {
//mapView 销毁后不在处理新接收的位置
if (location == null) {
return
}
//更新了定位信息
realLocation = location
drawLocationMark(LatLng(location.latitude,location.longitude))
}
}
另外Activity的生命周期中,也要对mLocationClient做处理
override fun onRestart() {
super.onRestart()
requestLocationPermission()
}
override fun onStart() {
super.onStart()
mLocationClient?.start()
}
override fun onStop() {
super.onStop()
mLocationClient?.stop()
}
override fun onDestroy() {
super.onDestroy()
mLocationClient?.stop()
mLocationClient = null
}
下面就是在地图上写写画画了。
定位信息
每次onReceiveLocation监听到新的定位信息,调用,可显示设备的当前定位,这个定位是不需要clear的,地图自动变更
/**
* 这个是画的是定位位置
*/
private fun drawLocationMark(point: LatLng){
val bitmap = BitmapDescriptorFactory
.fromResource(R.mipmap.icon_location)
val locData = MyLocat