#android #kotlin #location #android-location #fusedlocationproviderclient
#Android #котлин #Расположение #android-местоположение #fusedlocationproviderclient
Вопрос:
Я пытаюсь получить местоположение устройства Android. Я следовал этим инструкциям по использованию fusedLocationClient.
Я не могу назначить переменные снаружи .addSuccessListener
.
Я скажу, что журналы вне прослушивателя вызываются перед журналами внутри прослушивателя событий, поэтому я должен пытаться назначить переменные перед вызовом прослушивателя. Это имеет смысл, потому что слушатели являются асинхронными.
override fun onMapReady() {
var loc: Location = Location("")
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
fusedLocationClient.lastLocation
.addOnSuccessListener { location : Location ->
loc = location
Log.i("Lat, Long",loc.latitude.toString() ", " loc.longitude.toString()) // this correctly logs the latitude and longitude
}
Log.i("Lat, Long",loc.latitude.toString() " " loc.longitude.toString()) // this logs latitude and longitude as (0.0,0.0)
}
Я попытался ввести инициализацию onCreate()
fusedLocationClient и использовать fusedLocationClient как частную собственность:
private fusedLocationClient: FusedLocationProviderClient
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_display_map)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
fusedLocationClient.lastLocation
.addOnSuccessListener { location : Location ->
loc = location
Log.e(loc.latitude.toString(), loc.longitude.toString())
}
}
Я также пробовал это в onResume, но все равно не повезло.
Ответ №1:
Создайте loc
свойство как делегированное свойство:
var loc: Location? by Delegates.observable(null as? Location){
_, _, newLoc ->
// log
}
Этот делегат помогает вам отслеживать любые изменения в свойстве