#android #kotlin #location
#Android #kotlin #Расположение
Вопрос:
Я пытаюсь получить новое местоположение пользователя. Это код, который у меня есть до сих пор:
private fun getNewLocation() {
Log.d(TAG, "getNewLocation: started")
locationRequest = LocationRequest()
locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
locationRequest.interval = 0
locationRequest.fastestInterval = 0
locationRequest.numUpdates = 1
fusedLocationProviderClient.requestLocationUpdates(
locationRequest,
locationCallback,
Looper.myLooper()
)
Log.d(TAG, "getNewLocation: finished")
}
private val locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
Log.d(TAG, "locationCallback: onLocationResult started")
val newLocation = locationResult.lastLocation
Log.d(TAG, "locationCallback: before setting new data latitude = $latitude, longitude = $longitude")
// set new location
latitude = newLocation.latitude.toString()
longitude = newLocation.longitude.toString()
locationName = getLocationName(newLocation.latitude, newLocation.longitude)
Log.d(TAG, "getLastLocation: new location were set latitude = $latitude, longitude = $longitude")
requestAPI()
}
}
По какой-то причине, когда я тестирую его на физическом устройстве getNewLocation()
, он не вызывается onLocationResult
, поэтому мои журналы выглядят так:
D/MainActivity: getNewLocation: started
D/MainActivity: getNewLocation: finished
Вместо:
D/MainActivity: getNewLocation: started
D/MainActivity: getNewLocation: finished
D/MainActivity: locationCallback: onLocationResult started
D/MainActivity: locationCallback: latitude = 64.49273, longitude = 40.596625
Я также пытался установить newLocation
locationCallback
вот так:
val newLocation = locationResult.locations[0]
Но у меня тот же результат, поскольку проблема на самом деле в том, что getNewLocation()
не вызывает onLocationResult
Может кто-нибудь, пожалуйста, помочь мне понять причину, по которой это происходит таким образом, и как я могу это исправить?
Спасибо!
Ответ №1:
вы должны проверить настройки местоположения, прежде чем запрашивать новое местоположение
private suspend fun checkSettings(locationRequest: LocationRequest) {
val settingsRequest = LocationSettingsRequest.Builder()
.addLocationRequest(locationRequest)
.build()
try {
LocationServices
.getSettingsClient(this)
.checkLocationSettings(settingsRequest)
.await()
// location is turned on
} catch (e: ResolvableApiException) {
// location is turned off. Prompt the user to enable it
e.startResolutionForResult(this, CODE)
}
}
Кроме того, если вы используете последнюю версию play-services-location, есть простой способ получить новое местоположение
LocationServices
.getFusedLocationProviderClient(this)
.getCurrentLocation(LocationRequest.PRIORITY_HIGH_ACCURACY, null)