Прослушиватель OSMDroid LocationChange

#android #kotlin #osmdroid

#Android #котлин #осмдроид

Вопрос:

Я создаю карту, и у меня есть карта местоположения, которая отлично работает. Однако мне нужно обновить некоторые переменные по мере изменения местоположения. Использую ли я определитель местоположения с осмдроидом? Или есть что-то встроенное или метод, который я могу переопределить? Если мне действительно нужно зарегистрировать список объектов, как мне это сделать?

 private fun createMap() {  val ctx = applicationContext  Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx))   map = findViewByIdlt;Viewgt;(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)   }  

Ответ №1:

Я обнаружил, что ваше последнее известное местоположение хранится в LocationOverlay. Для доступа к этим переменным: mLocationOverlay.myLocationProvider.lastKnownLocation.latitude и то же самое для долготы.

Теперь, когда я знал, где найти свое местоположение, это было так же просто, как создать задание сопрограммы для запуска в любую секунду и обновления переменной deviceLocation.

Я уверен, что может быть лучший способ, зарегистрировав слушателя. Он будет срабатывать только при изменении местоположения. Однако с помощью сопрограмм вы можете контролировать интервал. Придание пользовательскому интерфейсу более предсказуемого вида, если интервал не слишком короткий.

Убедитесь, что у вас есть implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' в ваших зависимостях

 private fun createMap() {  val ctx = applicationContext  Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx))   map = findViewByIdlt;Viewgt;(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() // lt;-----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)  }