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

Mediante las API 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 por lo general equivale 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 un alto nivel. También optimiza el uso de la batería del dispositivo.

Nota: En Android 8.0 (API nivel 26) y versiones posteriores, si una app se ejecuta en segundo plano cuando solicita la ubicación actual, el dispositivo calcula la ubicación solo unas pocas veces por hora. Si deseas obtener información sobre cómo adaptar tu app a estos límites de cálculo, consulta Límites de ubicación en segundo plano.

En esta lección, se muestra cómo realizar una solicitud simple de la ubicación del dispositivo usando 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 aplicación 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 Android sobre la configuración de los Servicios de Google Play.

Cómo especificar permisos de apps

Las apps que usan los servicios de ubicación deben solicitar permisos de ubicación. Android ofrece los siguientes permisos de ubicación:

Para acceder a la ubicación del dispositivo, solicita el permiso ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION. El permiso que elijas determinará la precisión de la ubicación que muestre la API. Si especificas ACCESS_COARSE_LOCATION,la API muestra una ubicación con una precisión aproximada equivalente a una manzana.

Si tu app se orienta a Android 10 (API nivel 29) o versiones posteriores y necesita acceder a la ubicación el dispositivo mientras está en segundo plano, también debes declarar el permiso ACCESS_BACKGROUND_LOCATION. Para obtener más información, consulta la guía sobre cómo recibir actualizaciones de ubicación periódicas.

Para esta lección, solo se requiere la ubicación aproximada. Solicita este permiso con el elemento uses-permission en el manifiesto de tu app, como se muestra en el siguiente fragmento de código:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.google.android.gms.location.sample.basiclocationsample" >

      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    </manifest>
    

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

En el método onCreate() de tu actividad, crea una instancia de 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. La precisión de la ubicación que muestra esta llamada es determinada por la configuración de permisos que estableciste en el manifiesto de tu app, como se describe en la sección Cómo especificar permisos de apps de este documento.

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 una 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 restauró 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 tú mismo. Para obtener más información, consulta Cómo recibir actualizaciones de ubicación.