#android #kotlin #osmdroid
#Android #kotlin #osmdroid
Вопрос:
У меня есть очень простое приложение для Android в Kotlin.
Я пытаюсь центрировать карту по текущему местоположению устройства, но myLocationOverlay.myLocation
всегда null
получается.
Я делаю что-то не так? Я яростно гуглил, но, похоже, ничего не работает.
Спасибо!
class MainActivity : AppCompatActivity() {
private lateinit var map: MapView
private lateinit var mapController: IMapController
private lateinit var myLocationOverlay: MyLocationNewOverlay
override fun onCreate(savedInstanceState: Bundle?) {
// Load and set layout
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Create MapView
map = findViewById(R.id.map)
// Set tile source display settings
map.setTileSource(TileSourceFactory.MAPNIK)
map.setMultiTouchControls(true)
map.zoomController.setVisibility(CustomZoomButtonsController.Visibility.NEVER)
// Create MapController and set starting location
mapController = map.controller
// Create location overlay
myLocationOverlay = MyLocationNewOverlay(GpsMyLocationProvider(this), map)
myLocationOverlay.enableMyLocation()
myLocationOverlay.enableFollowLocation()
myLocationOverlay.isDrawAccuracyEnabled = true
myLocationOverlay.runOnFirstFix{runOnUiThread {
mapController.animateTo(myLocationOverlay.myLocation)
mapController.setZoom(9.5)
}}
map.overlays.add(myLocationOverlay)
// Set user agent
Configuration.getInstance().userAgentValue = "RossMaps"
println(myLocationOverlay.myLocation)
println("Create done")
}
override fun onResume() {
super.onResume()
map.onResume()
}
override fun onPause() {
super.onPause()
map.onPause()
}
}
Ответ №1:
Итак, я нашел решение. Сначала мне нужно было запросить разрешение для ACCESS_FINE_LOCATION . Следующий код работает для меня при добавлении в начало onCreate
функции:
// Request Location permission
if (ContextCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION
) == PERMISSION_GRANTED) {
println("Location Permission GRANTED")
} else {
println("Location Permission DENIED")
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
1
)
}
При первом запуске приложения в эмуляторе AVD появляется всплывающее окно с запросом разрешений на местоположение.