1. Introduction
Sous Android 12 (niveau d'API 31) ou version ultérieure, les utilisateurs peuvent contrôler le niveau de précision de localisation qu'ils souhaitent accorder à leurs applications. Dans les versions antérieures d'Android, la précision de la localisation est implicitement contrôlée par l'autorisation ACCESS_FINE_LOCATION
ou ACCESS_COARSE_LOCATION
, en fonction de ce que demande l'application.
Cet atelier de programmation fournit des conseils et des bonnes pratiques pour les demandes d'autorisation d'accéder à la position. Les applications concernées sont celles dont le SDK cible est la version 31 ou ultérieure.
Conditions préalables
- Expérience dans le développement pour Android
- Bonne connaissance des activités et des autorisations
- Connaissances préalables sur les demandes d'autorisation des applications
- Connaissances préalables sur les demandes d'autorisation d'accéder à la position
Points abordés
- Comment demander des autorisations d'accéder à la position sur Android S
- Comment mettre en place un flux de demandes de position optimal afin que les utilisateurs puissent accorder à votre appli des autorisations permettant d'accéder à la position précise
Définitions
Position exacte : précision de la position définie par l'autorisation ACCESS_FINE_LOCATION
.
Position approximative : précision de la position définie par l'autorisation ACCESS_COARSE_LOCATION
.
API concernées
2. Demander l'autorisation ACCESS_FINE_LOCATION
Nouvelle UI
Commençons par examiner la nouvelle interface utilisateur pour voir les changements apportés à la précision de la localisation.
Les figures 1a et 1b ci-dessous montrent la boîte de dialogue d'autorisation qui s'affiche lorsque votre application ne dispose ni de l'autorisation ACCESS_FINE_LOCATION
, ni de l'autorisation ACCESS_COARSE_LOCATION
.
Figure 1a : Position exacte sélectionnée. Figure 1b : Position approximative sélectionnée.
La figure 2a ci-dessous montre la boîte de dialogue de mise à niveau des autorisations qui s'affiche lorsque l'autorisation ACCESS_COARSE_LOCATION
a été accordée à votre application lorsqu'elle est en cours d'utilisation. Cette boîte de dialogue s'affiche si l'utilisateur sélectionne "While using the app" (Lorsque vous utilisez l'application) pour la position approximative sur l'écran précédent (figure 1b).
Figure 2a
La figure 2b ci-dessous montre la boîte de dialogue de mise à niveau des autorisations qui s'affiche lorsque l'autorisation ACCESS_COARSE_LOCATION
a été accordée à votre application pour la session en cours uniquement. Cette boîte de dialogue s'affiche si l'utilisateur sélectionne "Only this time" (Uniquement cette fois-ci) sur l'écran précédent (figure 1b).
Figure 2b
3. Mise en œuvre du code
Déclarer des autorisations d'accéder à la position dans le fichier manifeste de votre appli
Pour demander l'autorisation ACCESS_FINE_LOCATION
, le système exige de déclarer à la fois ACCESS_FINE_LOCATION
et ACCESS_COARSE_LOCATION
dans le fichier manifeste de votre application. Dans le cas contraire, le système ignore la requête et n'accorde aucune autorisation.
<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>
Demander l'autorisation 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);
}
Gérer la réponse
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. Demander uniquement l'autorisation ACCESS_COARSE_LOCATION
La figure 4 montre la boîte de dialogue d'autorisation qui s'affiche lorsque votre application demande uniquement l'autorisation ACCESS_COARSE_LOCATION
.
Figure 4
Pour utiliser seulement l'autorisation d'accéder à la position approximative, votre application doit déclarer et gérer uniquement cette autorisation à chaque étape.
5. Paramètres de localisation
La figure 5 ci-dessous présente les nouveaux paramètres d'autorisation d'accéder à la position. Un nouveau bouton permet aux utilisateurs de choisir si l'application peut accéder à la position exacte ou approximative.
Figure 5
6. Pour les applications qui ciblent le SDK version 30 ou antérieure
Les applications qui ciblent le SDK version 30 ou antérieure ne peuvent pas voir les nouvelles options de précision de la position (précise ou approximative).
7. Félicitations !
Vous avez appris comment demander l'autorisation d'accéder à la position dans Android 12 et savez maintenant utiliser de nombreux composants clés de ces autorisations.
Vous pouvez désormais demander des autorisations d'accéder à la position dans différentes situations afin de répondre aux besoins de votre application.
En savoir plus sur la position :