Saltar al contenido

Obtener ubicación android Kotlin

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *