概述
记录Android百度地图开发过程中的一些细节
正文
1.申请百度地图AK,放Manifest清单文件application节点下
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="百度地图AK">
</meta-data>
2.在Manifest的application节点下注册定位服务
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote">
</service>
3.如需用到地图控件,则还需要在Application类文件中进行地图初始化
override fun onCreate() {
super.onCreate()
//初始化百度地图SDK
SDKInitializer.initialize(this)
SDKInitializer.setCoordType(CoordType.BD09LL)
}
4.定位需要用到的运行时权限在6.0以上系统需要申请,否在会定位到非洲的大海里去
private fun checkPermission() {
val mPermissionList = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE)
ActivityCompat.requestPermissions(this, mPermissionList, 123)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
mLocationClient.restart()//专门用于在6.0以上系统获取到权限后重新启动定位
}
5.定位初始化LocationClient
//定位初始化
val mLocationClient = LocationClient(applicationContext)
mLocationClient.registerLocationListener(myLocationListener)
val option = LocationClientOption()
option.coorType = "bd09ll"
option.scanSpan = 0
option.openGps = true
mLocationClient.locOption = option
mLocationClient.start()//启动定位
6.实现定位监听BDAbstractLocationListener
val myLocationListener = object : BDAbstractLocationListener() {
override fun onReceiveLocation(p0: BDLocation?) {
val lat = p0!!.latitude//纬度
val lng = p0!!.longitude//经度
val radius = p0!!.radius//方向角度
text_map.setText("lat:$lat, long:$lng")
}
}
7.要将定位点在地图上显示则需要初始化地图BaiduMap
//地图初始化
val baiduMap = mapView.map
baiduMap.isMyLocationEnabled = true//开启定位图层
8.根据定位数据在地图上画出定位点MyLocationData
val locationData = MyLocationData.Builder()
.accuracy(radius)
.latitude(lat)
.longitude(lng)
.direction(100f)
.build()
baiduMap.setMyLocationData(locationData)//在地图上画出定位点
baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(MapStatus.Builder().zoom(18.0f).target(LatLng(lat, lng)).build()))//移动到定位点
完整代码
class MapDemoActivity : AppCompatActivity() {
lateinit var mLocationClient: LocationClient
lateinit var baiduMap: BaiduMap
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_map_demo)
//定位初始化
mLocationClient = LocationClient(applicationContext)
mLocationClient.registerLocationListener(myLocationListener)
val option = LocationClientOption()
option.coorType = "bd09ll"
option.scanSpan = 0
option.openGps = true
mLocationClient.locOption = option
mLocationClient.start()
//地图初始化
baiduMap = mapView.map
baiduMap.isMyLocationEnabled = true//开启定位图层
text_map.onClick {
mLocationClient.requestLocation()//重新请求定位
}
if (Build.VERSION.SDK_INT >= 23) {
checkPermission()
}
}
val myLocationListener = object : BDAbstractLocationListener() {
override fun onReceiveLocation(p0: BDLocation?) {
val lat = p0!!.latitude
val lng = p0!!.longitude
val radius = p0!!.radius
text_map.setText("lat:$lat, long:$lng")
val locationData = MyLocationData.Builder()
.accuracy(radius)
.latitude(lat)
.longitude(lng)
.direction(100f)
.build()
baiduMap.setMyLocationData(locationData)
baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(MapStatus.Builder().zoom(18.0f).target(LatLng(lat, lng)).build()))
}
}
override fun onResume() {
super.onResume()
mapView.onResume()
}
override fun onPause() {
super.onPause()
mapView.onPause()
}
override fun onDestroy() {
mLocationClient.stop()//关闭定位
baiduMap.isMyLocationEnabled = false//销毁定位图层
mapView.onDestroy()//关闭地图
super.onDestroy()
}
private fun checkPermission() {
val mPermissionList = arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE)
ActivityCompat.requestPermissions(this, mPermissionList, 123)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
mLocationClient.restart()
}
}
——End——