Demander l'autorisation d'accéder aux appareils Wi-Fi à proximité

Les applications qui ciblent Android 13 (niveau d'API 33) ou version ultérieure et gèrent les connexions Wi-Fi doivent demander l'autorisation d'exécution NEARBY_WIFI_DEVICES. Cette autorisation permet de justifier plus facilement l'accès d'une application aux appareils Wi-Fi à proximité. Dans les versions précédentes d'Android, ces applications devaient déclarer l'autorisation ACCESS_FINE_LOCATION à la place.

L'autorisation fait partie du groupe d'appareils à proximité

L'autorisation NEARBY_WIFI_DEVICES fait partie du groupe d'autorisations Appareils à proximité. Ce groupe, ajouté dans Android 12 (niveau d'API 31), inclut également les autorisations liées au Bluetooth et à la bande ultralarge. Lorsque vous demandez une combinaison d'autorisations de ce groupe d'autorisations, le système affiche une seule boîte de dialogue d'exécution et demande à l'utilisateur d'approuver l'accès de votre application aux appareils à proximité. Dans les paramètres système, l'utilisateur doit activer et désactiver les autorisations Appareils à proximité de manière groupée. Par exemple, les utilisateurs ne peuvent pas désactiver l'accès Wi-Fi, mais laisser l'accès Bluetooth activé pour une application donnée.

Affirmez avec force que votre application ne détermine pas la position physique

Lorsque vous ciblez Android 13 ou une version ultérieure, déterminez si votre application dérive des informations de localisation à partir des API Wi-Fi. Si ce n'est pas le cas, vous devez l'affirmer. Pour effectuer cette assertion, définissez l'attribut usesPermissionFlags sur neverForLocation dans le fichier manifeste de votre application, comme indiqué dans l'extrait de code suivant. Ce processus est semblable à celui que vous suivez lorsque vous assurez que les informations de l'appareil Bluetooth ne sont jamais utilisées pour la localisation:

<manifest ...>
    <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
                     android:usesPermissionFlags="neverForLocation" />
    <application ...>
        ...
    </application>
</manifest>

Les versions précédentes et certaines API nécessitent l'autorisation d'accéder à la position

Plusieurs API Wi-Fi nécessitent l'autorisation ACCESS_FINE_LOCATION, même si votre application cible Android 13 ou version ultérieure. Les méthodes suivantes de la classe WifiManager en sont des exemples:

De plus, comme l'autorisation NEARBY_WIFI_DEVICES n'est disponible que sur Android 13 ou version ultérieure, vous devez conserver toutes les déclarations pour ACCESS_FINE_LOCATION afin d'assurer la rétrocompatibilité dans votre application. Toutefois, tant que votre application ne s'appuie pas sur des informations de localisation précises, vous pouvez définir la version maximale du SDK sur 32, comme indiqué dans l'extrait de code suivant:

<manifest ...>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
                     android:maxSdkVersion="32" />
    <application ...>
        ...
    </application>
</manifest>

Rechercher les API nécessitant l'autorisation

Si votre application cible Android 13 ou une version ultérieure, vous devez déclarer l'autorisation NEARBY_WIFI_DEVICES pour appeler l'une des API Wi-Fi suivantes:

Workflows d'accès Wi-Fi

La figure 1 illustre le workflow d'accès Wi-Fi sur les appareils équipés d'Android 13 ou version ultérieure, pour les applications qui ciblent Android 13 ou version ultérieure. Notez que, tant que vous affirmez que votre application ne détermine pas sa position physique à partir des informations de l'appareil Wi-Fi, vous n'avez plus besoin de déclarer l'autorisation ACCESS_FINE_LOCATION:

Figure 1. Organigramme permettant de déterminer si une application qui cible Android 13 (niveau d'API 33) ou une version ultérieure peut accéder aux informations Wi-Fi.

La figure 2 illustre le workflow d'accès Wi-Fi sur les appareils exécutant la version 12L ou une version antérieure. Notez la dépendance à l'autorisation ACCESS_FINE_LOCATION.

Figure 2 : Organigramme permettant de déterminer si une application qui cible le niveau d'API 32 (12L) ou inférieur peut accéder aux informations Wi-Fi.