1. Introducción
En Android 12 (nivel de API 31) y versiones posteriores, los usuarios cuentan con la opción de controlar la precisión de la ubicación que desean otorgar a sus apps. En versiones anteriores de Android, la precisión de la ubicación se controla, de manera implícita, mediante la app que solicita el permiso ACCESS_FINE_LOCATION
o el permiso ACCESS_COARSE_LOCATION
.
En este codelab, te brindaremos orientación y prácticas recomendadas para las apps cuya versión del SDK de destino es 31 o superior a fin de solicitar permisos de ubicación.
Requisitos previos
- Experiencia con el desarrollo de Android
- Conocimientos sobre la clase Activity y los permisos
- Conocimientos previos sobre cómo solicitar permisos de la app
- Conocimientos previos sobre cómo solicitar permisos de ubicación
Qué aprenderás
- Cómo solicitar permisos de ubicación en Android S
- Cómo implementar un flujo óptimo de solicitudes de ubicación, para que los usuarios puedan otorgar a tu app permisos de ubicación precisa
Condiciones
Ubicación precisa: el nivel de detalle de la ubicación para el permiso ACCESS_FINE_LOCATION
.
Ubicación aproximada: el nivel de detalle de la ubicación para el permiso ACCESS_COARSE_LOCATION
.
APIs que se tratarán
2. Cómo solicitar el permiso ACCESS_FINE_LOCATION
Flujo de IU nueva
Primero, observemos la IU nueva para obtener algunas ideas de los cambios en la precisión de la ubicación.
A continuación, en la Figura 1a y la Figura 1b, se muestra el diálogo de permisos que aparece cuando no se le otorgó a tu app el permiso ACCESS_FINE_LOCATION
ni el permiso ACCESS_COARSE_LOCATION
.
Figura 1a: Se seleccionó la ubicación precisa Figura 1b: Se seleccionó la ubicación aproximada
A continuación, en la Figura 2a, se muestra el diálogo de actualización del permiso que aparece cuando se le otorgó a tu app el permiso ACCESS_COARSE_LOCATION
mientras está en uso. Este diálogo aparece si el usuario selecciona "Cuando se use la app" para la ubicación aproximada en la pantalla anterior (que se muestra en la Figura 1b).
Figura 2a
A continuación, en la Figura 2b, se muestra el diálogo de actualización del permiso que aparece cuando se le otorgó a tu app el permiso ACCESS_COARSE_LOCATION
solo para la sesión actual. Este diálogo aparece si el usuario selecciona "Solo esta vez" en la pantalla anterior (se muestra en la Figura 1b).
Figura 2b
3. Implementación del código
Cómo declarar permisos de ubicación en el manifiesto de tu app
Para solicitar ACCESS_FINE_LOCATION
, el sistema exigirá que tu app declare ACCESS_FINE_LOCATION
y ACCESS_COARSE_LOCATION
en el manifiesto de tu app. De lo contrario, el sistema ignorará la solicitud y no le otorgará a tu app ninguno de los dos permisos.
<manifest ... >
<!-- Required when requesting precise location access on Android 12 (API level 31) and higher. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>
Cómo solicitar el permiso ACCESS_FINE_LOCATION
MyActivity.kt (Kotlin)
when {
ContextCompat.checkSelfPermission(
CONTEXT,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED -> {
// You can use the API that requires the permission.
performAction(...)
}
shouldShowRequestPermissionRationale(...) -> {
// In an educational UI, explain to the user why your app requires this
// permission for a specific feature to behave as expected. In this UI,
// include a "cancel" or "no thanks" button that allows the user to
// continue using your app without granting the permission.
showInContextUI(...)
}
else -> {
// Ask for both the ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permissions.
requestPermissions(CONTEXT,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION),
REQUEST_CODE)
}
}
MyActivity.java (Java)
if (ContextCompat.checkSelfPermission(
CONTEXT, Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED) {
// You can use the API that requires the permission.
performAction(...);
} else if (shouldShowRequestPermissionRationale(...)) {
// In an educational UI, explain to the user why your app requires this
// permission for a specific feature to behave as expected. In this UI,
// include a "cancel" or "no thanks" button that allows the user to
// continue using your app without granting the permission.
showInContextUI(...);
} else {
// Ask for both the ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permissions.
requestPermissions(CONTEXT,
new String[] { Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION },
REQUEST_CODE);
}
Cómo controlar la respuesta
MyActivity.kt (Kotlin)
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<String>, grantResults: IntArray) {
when (requestCode) {
REQUEST_CODE -> {
// If the request is cancelled, the result arrays are empty.
if (grantResults.isNotEmpty()) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// ACCESS_FINE_LOCATION is granted
} else if (grantResults[1] ==
PackageManager.PERMISSION_GRANTED) {
// ACCESS_COARSE_LOCATION is granted
}
} else {
// Explain to the user that the feature is unavailable because
// the feature requires a permission that the user has denied.
// At the same time, respect the user's decision. Don't link to
// system settings in an effort to convince the user to change
// their decision.
}
return
}
// Add other 'when' lines to check for other
// permissions this app might request.
else -> {
// Ignore all other requests.
}
}
}
MyActivity.java (Java)
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
// If the request is cancelled, the result arrays are empty.
if (grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// ACCESS_FINE_LOCATION is granted
} else if (grantResults[1] ==
PackageManager.PERMISSION_GRANTED) {
// ACCESS_COARSE_LOCATION is granted
}
} else {
// Explain to the user that the feature is unavailable because
// the feature requires a permission that the user has denied.
// At the same time, respect the user's decision. Don't link to
// system settings in an effort to convince the user to change
// their decision.
}
return;
}
// Other 'case' lines to check for other
// permissions this app might request.
}
}
4. Cómo solicitar solo el permiso ACCESS_COARSE_LOCATION
En la Figura 4, se muestra el diálogo del permiso que aparece cuando tu app solicita solo el permiso ACCESS_COARSE_LOCATION
.
Figura 4
Para funcionar solo con el permiso de ubicación aproximada, la app debe declarar y controlar solo el permiso de ubicación aproximada en cada paso.
5. Configuración de la ubicación
A continuación, en la Figura 5, se muestra la configuración nueva del permiso de ubicación. Se muestra un botón nuevo de activación para que los usuarios puedan controlar si la app puede acceder a una ubicación precisa o aproximada.
Figura 5
6. Apps que se orientan a SDK versión 30 o anterior
Las opciones nuevas de precisión de la ubicación (precisa/aproximada) no se ven en las app que se orientan a SDK versión 30 o anterior.
7. ¡Felicitaciones!
Aprendiste a solicitar permisos de ubicación en Android 12 y exploraste con éxito muchos componentes clave de los permisos de ubicación.
Ahora, puedes solicitar permisos de ubicación para casos diferentes de uso a fin de satisfacer las necesidades de tu app.
Averigua más sobre la ubicación: