Este grupo de expertos despúes de varios días de trabajo y recopilación de de información, dimos con la solución, esperamos que te resulte útil en tu trabajo.
Solución:
En 2019 la mejor solución oficial en Kotlin
Google API Client / FusedLocationApi están obsoletos y Location Manager no es útil en absoluto.
Por lo tanto, Google prefiere el proveedor de ubicación fusionada mediante las API de ubicación de los servicios de Google Play “FusedLocationProviderClient” se utiliza para obtener la ubicación y su mejor manera de ahorrar batería y precisión
Aquí hay un código de muestra en kotlin para obtener la última ubicación conocida / ubicación única (equivalente a la ubicación actual)
// declare a global variable of FusedLocationProviderClient
private lateinit var fusedLocationClient: FusedLocationProviderClient
// in onCreate() initialize FusedLocationProviderClient
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context!!)
/**
* call this method for receive location
* get location and give callback when successfully retrieve
* function itself check location permission before access related methods
*
*/
fun getLastKnownLocation()
fusedLocationClient.lastLocation
.addOnSuccessListener location->
if (location != null)
// use your location object
// get latitude , longitude and other info from this
Si su aplicación puede rastrear continuamente la ubicación, entonces debe recibir Recibir actualizaciones de ubicación
Verifique la muestra para eso en kotlin
// declare a global variable FusedLocationProviderClient
private lateinit var fusedLocationClient: FusedLocationProviderClient
// in onCreate() initialize FusedLocationProviderClient
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context!!)
// globally declare LocationRequest
private lateinit var locationRequest: LocationRequest
// globally declare LocationCallback
private lateinit var locationCallback: LocationCallback
/**
* call this method in onCreate
* onLocationResult call when location is changed
*/
private fun getLocationUpdates()
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context!!)
locationRequest = LocationRequest()
locationRequest.interval = 50000
locationRequest.fastestInterval = 50000
locationRequest.smallestDisplacement = 170f // 170 m = 0.1 mile
locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY //set according to your app function
locationCallback = object : LocationCallback()
override fun onLocationResult(locationResult: LocationResult?)
locationResult ?: return
if (locationResult.locations.isNotEmpty())
// get latest location
val location =
locationResult.lastLocation
// use your location object
// get latitude , longitude and other info from this
//start location updates
private fun startLocationUpdates()
fusedLocationClient.requestLocationUpdates(
locationRequest,
locationCallback,
null /* Looper */
)
// stop location updates
private fun stopLocationUpdates()
fusedLocationClient.removeLocationUpdates(locationCallback)
// stop receiving location update when activity not visible/foreground
override fun onPause()
super.onPause()
stopLocationUpdates()
// start receiving location update when activity visible/foreground
override fun onResume()
super.onResume()
startLocationUpdates()
Asegúrese de tener cuidado con el permiso de Mainfaist y el permiso de tiempo de ejecución para la ubicación
y para Gradle agregue esto
implementation 'com.google.android.gms:play-services-location:17.0.0'
Para más detalles, siga estos documentos oficiales.
https://developer.android.com/training/location/retrieve-current
https://developer.android.com/training/location/receive-location-updates
https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient
Cuando GetUserLocation
devoluciones, locationManager
sale de su alcance y presumiblemente se destruye, evitando onLocationChanged
de ser llamado y proporcionar actualizaciones.
Además, has definido mylocation
dentro de GetUserLocation
por lo que también sale de su alcance y mata aún más cualquier posibilidad de que reciba una actualización.
No has mostrado dónde y cómo el exterior mylocation
se declara (fuera de GetUserLocation
), pero como sea que se declare, está siendo ensombrecido por el que está dentro de GetUserLocation
. Entonces no obtienes mucho.
A continuación, se muestra un ejemplo de cómo podría hacerlo. (La variable thetext
se define dentro del diseño xml y se accede con las extensiones de Kotlin).
// in the android manifest
// allow these through Appliation Manager if necessary
// inside a basic activity
private var locationManager : LocationManager? = null
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
// Create persistent LocationManager reference
locationManager = getSystemService(LOCATION_SERVICE) as LocationManager?
fab.setOnClickListener view ->
try
// Request location updates
locationManager?.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0L, 0f, locationListener)
catch(ex: SecurityException)
Log.d("myTag", "Security Exception, no location available")
//define the listener
private val locationListener: LocationListener = object : LocationListener
override fun onLocationChanged(location: Location)
thetext.text = ("" + location.longitude + ":" + location.latitude)
override fun onStatusChanged(provider: String, status: Int, extras: Bundle)
override fun onProviderEnabled(provider: String)
override fun onProviderDisabled(provider: String)
Sé que es tarde, pero ahora Google ha simplificado su uso. En el sitio del desarrollador, dice que necesita crear un Cliente:
private lateinit var fusedLocationClient: FusedLocationProviderClient
Luego onCreate obtiene el proveedor:
override fun onCreate(savedInstanceState: Bundle?)
// ...
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
Y finalmente, para obtener su última ubicación, simplemente llame a:
//Don't forget to ask for permissions for ACCESS_COARSE_LOCATION
//and ACCESS_FINE_LOCATION
@SuppressLint("MissingPermission")
private fun obtieneLocalizacion()
fusedLocationClient.lastLocation
.addOnSuccessListener location: Location? ->
latitude = location?.latitude
longitude = location?.longitude
* Probado con esta implementación para la ubicación (configuración en el archivo gradle de su aplicación)
implementation 'com.google.android.gms:play-services-location:15.0.1'
Para obtener más información, consulte este enlace:
Obtener la última ubicación