Position approximative

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

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.

7acc5e2fe09d67ca.jpeg a5e9363364fcc9f9.jpeg

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).

2624d89993700ea5.jpeg

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).

a2dfb923b8f3548d.jpeg

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.

9d20729f14673547.jpeg

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.

a9553249c3e2b90c.jpeg

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 :