Prepárate para 12L, una actualización de funciones para pantallas grandes que se lanzará a principios del próximo año. Pruébala hoy.

Ubicación aproximada

El diálogo solo hace referencia a la ubicación aproximada e incluye 3 botones, uno encima del otro.
Figura 1: Diálogo de permisos del sistema que aparece cuando la app solo solicita ACCESS_COARSE_LOCATION.

Android 12 se basa en cambios recientes de la plataforma en el modelo de permisos de ubicación, por ejemplo, la ubicación en segundo plano y los permisos únicos. Cuando una app se orienta a Android 12, los usuarios pueden solicitar que la app recupere solo información de la ubicación aproximada, incluso cuando esta solicite el permiso de tiempo de ejecución ACCESS_FINE_LOCATION.

Si la app solicita ACCESS_COARSE_LOCATION, pero no ACCESS_FINE_LOCATION, el cambio que se describe en esta página no produce efectos. En la figura 1, se muestra el diálogo para el usuario que aparece cuando la app se orienta a Android 12 y solo solicita ACCESS_COARSE_LOCATION.

Para respetar mejor la privacidad del usuario, te recomendamos que solo solicites ACCESS_COARSE_LOCATION. Puedes cumplir con la mayoría de los casos de uso, incluso cuando tienes acceso solamente a información de la ubicación aproximada.

Si la app se orienta a Android 12 y solicitas el permiso ACCESS_FINE_LOCATION, también debes solicitar el permiso ACCESS_COARSE_LOCATION. Debes incluir ambos en una sola solicitud de tiempo de ejecución. Si intentas solicitar solamente ACCESS_FINE_LOCATION, el sistema ignora la solicitud y registra el siguiente mensaje de error en Logcat: ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.

La elección del usuario entre la ubicación aproximada y la ubicación precisa

El diálogo tiene 2 conjuntos de opciones, uno encima del otro
Figura 2: Diálogo de permisos del sistema que aparece cuando la app se orienta a Android 12 y realiza una sola solicitud de tiempo de ejecución de ACCESS_FINE_LOCATION y ACCESS_COARSE_LOCATION.

Cuando la app solicita ACCESS_FINE_LOCATION y ACCESS_COARSE_LOCATION, el diálogo de permisos del sistema incluye las siguientes opciones nuevas para el usuario:

  • Precisa: Brinda la precisión de la ubicación que proporciona el permiso ACCESS_FINE_LOCATION.
  • Aproximada: Brinda la precisión de la ubicación que proporciona el permiso ACCESS_COARSE_LOCATION.

En la figura 2, se muestra que el diálogo incluye una indicación visual para ambas opciones nuevas, con el fin de permitir que el usuario elija. Después de que el usuario decide la precisión de la ubicación, presiona uno de los tres botones para seleccionar la duración del otorgamiento del permiso. Estos botones son los mismos que aparecen en los diálogos de los permisos de ubicación en dispositivos que ejecutan Android 11 (nivel de API 30).

En Android 12, los usuarios pueden navegar hasta la configuración del sistema a fin de establecer la precisión preferida de la ubicación para cualquier app, independientemente de la versión del SDK de destino de la app. Esto es así incluso cuando la app está instalada en un dispositivo que ejecuta Android 11 o versiones anteriores y luego se actualiza a Android 12. Si el usuario cambia el acceso a la ubicación de la app de precisa a aproximada, ya sea desde el diálogo de permisos o en la configuración del sistema, el sistema reinicia el proceso de la app. Por estos motivos, es especialmente importante que sigas las prácticas recomendadas para solicitar permisos de tiempo de ejecución.

La elección del usuario afecta los otorgamientos de permisos

En la siguiente tabla, se muestran los permisos que el sistema otorga a la app, según las opciones que el usuario elige en el diálogo de tiempo de ejecución de permisos:

Precisa Aproximada
Mientras la app está en uso ACCESS_FINE_LOCATION y
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
Solo esta vez ACCESS_FINE_LOCATION y
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
Deny Sin permisos de ubicación Sin permisos de ubicación

Para determinar qué permisos le otorgó el sistema a la app, verifica el valor que se muestra de la solicitud de permisos. Puedes usar bibliotecas de Jetpack en código similar al siguiente o puedes usar bibliotecas de plataforma, en las que administras por tu cuenta el código de solicitud de permiso.

Kotlin

val locationPermissionRequest = registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ) { permissions ->
        when {
            permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
                // Precise location access granted.
            }
            permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
                // Only approximate location access granted.
            } else -> {
                // No location access granted.
            }
        }
    }

// ...

// Before you perform the actual permission request, check whether your app
// already has the permissions, and whether your app needs to show a permission
// rationale dialog. For more details, see Request permissions.
locationPermissionRequest.launch(arrayOf(
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION))

Java

ActivityResultLauncher<String[]> locationPermissionRequest =
    registerForActivityResult(new ActivityResultContracts
        .RequestMultiplePermissions(), result -> {
            Boolean fineLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_FINE_LOCATION, false);
            Boolean coarseLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_COARSE_LOCATION,false);
            if (fineLocationGranted != null && fineLocationGranted) {
                // Precise location access granted.
            } else if (coarseLocationGranted != null && coarseLocationGranted) {
                // Only approximate location access granted.
            } else {
                // No location access granted.
            }
        }
    );

// ...

// Before you perform the actual permission request, check whether your app
// already has the permissions, and whether your app needs to show a permission
// rationale dialog. For more details, see Request permissions.
locationPermissionRequest.launch(new String[] {
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION
});

La elección del usuario también afecta la ubicación en segundo plano.

Si el sistema le otorga el permiso ACCESS_BACKGROUND_LOCATION a la app, las elecciones del usuario en el diálogo de permisos de ubicación también se aplican a la ubicación en segundo plano.

Por ejemplo, si el usuario le otorga el permiso ACCESS_BACKGROUND_LOCATION a la app, pero brinda acceso solo a la ubicación aproximada en primer plano, la app también tendrá acceso solo a la ubicación aproximada en segundo plano.

Cómo actualizar a ubicación precisa

La ubicación aproximada puede afectar la app si, actualmente, depende del acceso a la ubicación precisa con el permiso ACCESS_FINE_LOCATION.

Antes de solicitarle al usuario que actualice el acceso de la app a ubicación precisa, considera si el caso de uso de la app necesita, en realidad, este nivel de precisión. Si la app necesita sincronizar un dispositivo con otros cercanos mediante Bluetooth o Wi-Fi, considera usar la sincronización de dispositivos complementarios o los permisos de Bluetooth nuevos en lugar de solicitar el permiso ACCESS_FINE_LOCATION.

Para solicitarle al usuario que actualice el acceso a la ubicación de la app de aproximada a precisa, haz lo siguiente:

  1. Si es necesario, explica el motivo por el que la app necesita el permiso.
  2. Vuelve a solicitar juntos los permisos ACCESS_FINE_LOCATION y ACCESS_COARSE_LOCATION. Como el usuario ya permitió que el sistema le otorgara la ubicación aproximada a la app, esta vez, el diálogo del sistema es diferente, como se muestra en la figura 3 y la figura 4:
El diálogo incluye las opciones &quot;Cambiar a ubicación precisa&quot;, &quot;Solo esta vez&quot; y &quot;Rechazar&quot;.
Figura 3: Anteriormente, el usuario seleccionaba Aproximada y Mientras la app está en uso (en el diálogo de la figura 2).
El diálogo incluye las opciones &quot;Solo esta vez&quot; y &quot;Rechazar&quot;.
Figura 4: Anteriormente, el usuario seleccionaba Aproximada y Solo esta vez (en el diálogo de la figura 2).

Cómo probar la manera en que la app controla la ubicación aproximada

A fin de evaluar si necesitas actualizar la app para que admita la precisión de la ubicación que pueda configurar el usuario, completa las pruebas que se describen en esta sección.

Cómo controlar solicitudes de ubicación aproximada desde el diálogo

A fin de verificar la manera en que la app controla la solicitud de un usuario para que esta tenga acceso a la ubicación aproximada desde el diálogo nuevo, haz lo siguiente:

  1. Solicita ACCESS_FINE_LOCATION y ACCESS_COARSE_LOCATION.
  2. En el diálogo que aparece (figura 2), selecciona Aproximada cerca de la parte superior y Mientras la app está en uso o Solo esta vez cerca de la parte inferior.
  3. Verifica si los casos de uso de la app continúan funcionando según lo esperado, incluso cuando solo tenga acceso a la ubicación aproximada.

Cómo controlar el cambio de ubicación a aproximada desde la configuración del sistema

Figura 5: Ahora, la pantalla de permisos de ubicación de una app en la configuración del sistema incluye Usar la ubicación precisa. Esta opción es independiente de la configuración del acceso a la ubicación que aparece más cerca de la parte superior de la pantalla.

A fin de verificar la manera en que la app controla la solicitud de un usuario para cambiar el acceso a la ubicación de precisa a aproximada en la configuración del sistema, haz lo siguiente:

  1. Solicita ACCESS_FINE_LOCATION y ACCESS_COARSE_LOCATION.
  2. En el diálogo que aparece (figura 2), selecciona Precisa cerca de la parte superior y Mientras la app está en uso o Solo esta vez cerca de la parte inferior.
  3. Navega hasta la pantalla de permisos de la app en la configuración del sistema.
  4. En la pantalla de permisos de ubicación, desactiva Usar la ubicación precisa. Esta opción aparece en la figura 5.

    Al igual que con cualquier cambio de permiso, el sistema reinicia el proceso de la app.

  5. Verifica si los casos de uso de la app continúan funcionando según lo esperado, incluso cuando solo tenga acceso a la ubicación aproximada.

Cómo controlar la actualización de la ubicación precisa desde la configuración del sistema.

A fin de verificar la manera en que la app controla la solicitud de un usuario para cambiar el acceso a la ubicación de aproximada a precisa en la configuración del sistema, haz lo siguiente:

  1. Solicita ACCESS_FINE_LOCATION y ACCESS_COARSE_LOCATION.
  2. En el diálogo que aparece (figura 2), selecciona Aproximada cerca de la parte superior y Mientras la app está en uso o Solo esta vez cerca de la parte inferior.
  3. Navega hasta la pantalla de permisos de la app en la configuración del sistema.
  4. En la pantalla de permisos de ubicación, activa Usar la ubicación precisa, como se muestra en la figura 5.

    Como este cambio de permiso se considera una actualización, el sistema no reinicia la app.

  5. Verifica si la app recibe datos de ubicación más precisos en sus casos de uso que se basan en la ubicación.

Cómo verificar los requisitos de ubicación en las dependencias del SDK de la app

Verifica si la app usa algún SDK que dependa del permiso ACCESS_FINE_LOCATION. Consulta este artículo en Medium sobre los comportamientos de las dependencias del SDK.