美文网首页
Android 百度地图

Android 百度地图

作者: 折剑游侠 | 来源:发表于2020-05-26 16:14 被阅读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
    

    相关文章

      网友评论

          本文标题:Android 百度地图

          本文链接:https://www.haomeiwen.com/subject/dyrvahtx.html