Cómo obtener la última ubicación conocida

Con las APIs de ubicación de los Servicios de Google Play, tu app puede solicitar la ubicación más reciente del dispositivo del usuario. En la mayoría de los casos, te interesará la ubicación actual del usuario, que suele equivaler a la ubicación más reciente del dispositivo.

Usa específicamente el proveedor de ubicación combinada para obtener la ubicación más reciente del dispositivo. Este proveedor es una de las API de ubicación de los Servicios de Google Play. Administra la tecnología de ubicación subyacente y es una API simple que te permite especificar requisitos (como precisión alta o poca energía) a nivel general. También optimiza el uso de la batería del dispositivo.

Nota: Cuando se ejecuta tu app en segundo plano, el acceso a la ubicación debería ser fundamental para la funcionalidad principal de la app y se debería divulgar a los usuarios.

En esta lección, se muestra cómo realizar una solicitud única de la ubicación de un dispositivo mediante el método getLastLocation() en el proveedor de ubicación combinada.

Cómo configurar los Servicios de Google Play

Para acceder al proveedor de ubicación combinada, el proyecto de desarrollo de tu app debe incluir los Servicios de Google Play. Descarga e instala el componente de los Servicios de Google Play mediante el SDK Manager y agrega la biblioteca a tu proyecto. Para obtener más detalles, consulta la guía de configuración de los Servicios de Google Play.

Cómo especificar permisos de apps

Las apps cuyas funciones usan servicios de ubicación deben solicitar permisos de ubicación, según los casos prácticos de cada función.

Cómo crear un cliente de servicios de ubicación

En el método onCreate() de tu actividad, crea una instancia del cliente de proveedor de ubicación combinada, como se muestra en el siguiente fragmento de código:

Kotlin

private lateinit var fusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

Java

private FusedLocationProviderClient fusedLocationClient;

// ..

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}

Cómo conocer la ubicación más reciente

Una vez que hayas creado el cliente de servicios de ubicación, podrás obtener la ubicación más reciente del dispositivo de un usuario. Cuando se conecte tu app, podrás usar el método getLastLocation() del proveedor de ubicación combinada para obtener la ubicación del dispositivo. Se determina la precisión de la ubicación que muestra esta llamada por la configuración de permisos que estableciste en el manifiesto de tu app, como se describe en la guía Cómo solicitar permisos de ubicación.

Para solicitar la ubicación más reciente, llama al método getLastLocation(). En el siguiente fragmento de código, se muestra la solicitud y un manejo simple de la respuesta:

Kotlin

fusedLocationClient.lastLocation
        .addOnSuccessListener { location : Location? ->
            // Got last known location. In some rare situations this can be null.
        }

Java

fusedLocationClient.getLastLocation()
        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {
                // Got last known location. In some rare situations this can be null.
                if (location != null) {
                    // Logic to handle location object
                }
            }
        });

El método getLastLocation() muestra un elemento Task que puedes usar para obtener un objeto Location con las coordenadas de latitud y longitud de una ubicación geográfica. El objeto de ubicación puede ser null en las siguientes situaciones:

  • La ubicación está desactivada en la configuración del dispositivo. El resultado podría ser null incluso si ya se había obtenido la ubicación más reciente, porque, cuando se inhabilita la ubicación, también se borra la caché.
  • El dispositivo nunca registró su ubicación, que podría ser el caso de un dispositivo nuevo o un dispositivo en el que se restableció la configuración de fábrica.
  • Se reiniciaron los Servicios de Google Play en el dispositivo, y ningún cliente de proveedor de ubicación combinada activo solicitó la ubicación después de que se reiniciaron los servicios. Para evitar esta situación, puedes crear un nuevo cliente y solicitar actualizaciones de ubicación por tu cuenta. Para obtener más información, consulta Cómo recibir actualizaciones de ubicación.

Elige la mejor estimación de ubicación

FusedLocationProviderClient proporciona varios métodos para recuperar información sobre la ubicación del dispositivo. Elige una de las siguientes opciones, según el caso de uso de tu app:

  • getLastLocation() obtiene una estimación de la ubicación más rápido y minimiza el uso de batería que se puede atribuir a tu app. Sin embargo, la información de ubicación podría estar desactualizada si ningún otro cliente usó de manera activa la ubicación recientemente.
  • getCurrentLocation() obtiene una ubicación más actualizada y precisa, y de manera más coherente. Sin embargo, este método puede generar en el dispositivo un cálculo activo de la ubicación.

    Esta es la forma recomendada de obtener una ubicación nueva, siempre que sea posible, y es más segura que otras alternativas, como iniciar y administrar actualizaciones de ubicación por tu cuenta con requestLocationUpdates(). Si tu app llama a requestLocationUpdates(), a veces puede consumir grandes cantidades de energía si la ubicación no está disponible o si la solicitud no se detiene correctamente después de obtener una ubicación nueva.

Recursos adicionales

Para obtener más información sobre cómo recuperar la ubicación actual en Android, consulta los siguientes materiales:

Ejemplos

  • App de ejemplo para demostrar las prácticas recomendadas mientras se recupera la ubicación actual.