Android 百度地图

2020-05-26  本文已影响0人  折剑游侠

记录一下百度地图sdk定位功能

LocationUtils

object LocationUtils {
    private var locationClient: LocationClient? = null

    /**
     * 开启定位
     */
    fun start(activity: FragmentActivity, locationListener: LocationListener) {
        activity.andPermission(
            arrayOf(
                Permission.ACCESS_FINE_LOCATION,
                Permission.ACCESS_COARSE_LOCATION
            )
        ) {
            onGranted {
                initLocationOption(activity, locationListener)
            }
            onDenied {
                ToastUtils.showShort("定位功能需开启定位权限")
            }
        }
    }

    /**
     * 关闭定位
     */
    fun stop() {
        locationClient?.stop()
    }

    /**
     * 经纬度获取地址
     */
    fun latLng2Address(latLng: LatLng, reverseGeoCodeListener: ReverseGeoCodeListener) {
        val geoCoder = GeoCoder.newInstance()
        geoCoder.setOnGetGeoCodeResultListener(object : OnGetGeoCoderResultListener {
            override fun onGetGeoCodeResult(geoCodeResult: GeoCodeResult) {}

            override fun onGetReverseGeoCodeResult(reverseGeoCodeResult: ReverseGeoCodeResult) {
                reverseGeoCodeListener(reverseGeoCodeResult.address)
            }

        })
        geoCoder.reverseGeoCode(ReverseGeoCodeOption().location(latLng))
    }

    /**
     * 初始化定位参数配置
     */
    private fun initLocationOption(
        activity: FragmentActivity,
        locationListener: LocationListener
    ) { //定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动
        locationClient = LocationClient(activity)
        //声明LocationClient类实例并配置定位参数
        val locationOption = LocationClientOption()
        val myLocationListener = CustomLocationListener(locationListener)
        //注册监听函数
        locationClient?.registerLocationListener(myLocationListener)
        //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
        locationOption.locationMode = LocationClientOption.LocationMode.Hight_Accuracy
        //可选,默认gcj02,设置返回的定位结果坐标系,如果配合百度地图使用,建议设置为bd09ll;
        locationOption.setCoorType("bd09ll")
        //可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
        locationOption.setScanSpan(1000)
        //可选,设置是否需要地址信息,默认不需要
        locationOption.setIsNeedAddress(true)
        //可选,设置是否需要地址描述
        locationOption.setIsNeedLocationDescribe(true)
        //可选,设置是否需要设备方向结果
        locationOption.setNeedDeviceDirect(false)
        //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
        locationOption.isLocationNotify = true
        //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
        locationOption.setIgnoreKillProcess(true)
        //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
        locationOption.setIsNeedLocationDescribe(true)
        //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
        locationOption.setIsNeedLocationPoiList(true)
        //可选,默认false,设置是否收集CRASH信息,默认收集
        locationOption.SetIgnoreCacheException(false)
        //可选,默认false,设置是否开启Gps定位
        locationOption.isOpenGps = true
        //可选,默认false,设置定位时是否需要海拔信息,默认不需要,除基础定位版本都可用
        locationOption.setIsNeedAltitude(false)
        //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者,该模式下开发者无需再关心定位间隔是多少,定位SDK本身发现位置变化就会及时回调给开发者
        locationOption.setOpenAutoNotifyMode()
        //设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者
        locationOption.setOpenAutoNotifyMode(3000, 1, LocationClientOption.LOC_SENSITIVITY_HIGHT)
        //需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
        locationClient?.locOption = locationOption
        //开始定位
        locationClient?.start()
    }

    /**
     * 实现定位回调
     */
    class CustomLocationListener(private val locationListener: LocationListener) :
        BDAbstractLocationListener() {
        override fun onReceiveLocation(location: BDLocation) { //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
            //以下只列举部分获取经纬度相关(常用)的结果信息
            //更多结果信息获取说明,请参照类参考中BDLocation类中的说明
            //获取纬度信息
            val latitude = location.latitude
            //获取经度信息
            val longitude = location.longitude
            //获取定位精度,默认值为0.0f
            val radius = location.radius
            //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
            val coorType = location.coorType
            //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
            val errorCode = location.locType
            //回调
            locationListener(location)
        }
    }
}

Alias.kt

internal typealias LocationListener = (BDLocation) -> Unit

internal typealias ReverseGeoCodeListener = (String) -> Unit
上一篇下一篇

猜你喜欢

热点阅读