Получить местоположение в Android (проблемы с обратным вызовом)

#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)