OSMDroid LocationChange 监听器

OSMDroid LocationChange Listener

我正在创建地图并且我有一个工作正常的 locationOverlay。但是,随着位置的变化,我需要更新一些变量。 我是否将 LocationListener 与 OSMDroid 一起使用?或者有什么内置的东西或我可以覆盖的方法吗? 如果我必须注册一个 locationListener,我该怎么做?

private fun createMap() {
        val ctx = applicationContext
        Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx))

        map = findViewById<View>(R.id.map) as MapView
        map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE)
        map.getOverlays().add(CopyrightOverlay(this))
        mapController = MapController(map)
        mLocationOverlay = MyLocationNewOverlay(GpsMyLocationProvider(this), map)
        mLocationOverlay.enableMyLocation()
        mLocationOverlay.runOnFirstFix {
            runOnUiThread {
                mapController.zoomTo(14)
                mapController.setCenter(mLocationOverlay.myLocation)
                mapController.animateTo(mLocationOverlay.myLocation)
            }
        }

        map.overlays.add(mLocationOverlay)

    }

我发现您最后的已知位置存储在 LocationOverlay 中。要访问这些变量:mLocationOverlay.myLocationProvider.lastKnownLocation.latitude 经度也一样。

现在我知道从哪里获取我的位置,这就像每秒创建 运行 协程作业并更新 deviceLocation 变量一样简单。

我相信注册监听器可能是更好的方法。它只会在位置更改时触发。但是,使用协同程序,您可以控制间隔。只要间隔不太短,就可以让 UI 看起来更可预测。

确保你的依赖项中有 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0'

private fun createMap() {
    val ctx = applicationContext
    Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx))

    map = findViewById<View>(R.id.map) as MapView
    map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE)
    map.getOverlays().add(CopyrightOverlay(this))
    mapController = MapController(map)
    mapController.animateTo(GeoPoint(DEFAULT_GEOPOINT), DEFAULT_ZOOM, 2)
    mLocationOverlay = MyLocationNewOverlay(GpsMyLocationProvider(this), map)
    mLocationOverlay.enableMyLocation()
    mLocationOverlay.runOnFirstFix {
        runOnUiThread {
            mapController.animateTo(mLocationOverlay.myLocation, 14.0, 1000)
            handleNewLocation()
            startLocationUpdates() // <-----Entry Point
        }
    }
    map.overlays.add(mLocationOverlay)
}

private fun startLocationUpdates() {
    val updateDeviceLocationJob = locationUpdateJob(1000L)
    updateDeviceLocationJob.start()
}


private fun locationUpdateJob(timeInterval: Long): Job {
    return CoroutineScope(Dispatchers.Default).launch {
        while (isActive) {
            handleNewLocation()
            delay(timeInterval)
        }
    }
}

private fun handleNewLocation() {
        deviceGoePoint = LatLng(mLocationOverlay.myLocationProvider.lastKnownLocation.latitude,
            mLocationOverlay.myLocationProvider.lastKnownLocation.longitude)
    }