Vous pouvez utiliser les fonctionnalités de recherche Wi-Fi fournies par l' API WifiManager pour obtenir la liste des points d'accès Wi-Fi visibles depuis l'appareil.
Processus d'analyse Wi-Fi
Le processus d'analyse comporte trois étapes :
Enregistrez un écouteur de diffusion pour
SCAN_RESULTS_AVAILABLE_ACTION, qui est appelé lorsque les requêtes d'analyse sont terminées, en indiquant leur état de réussite/échec. Pour les appareils exécutant Android 10 (niveau d'API 29) ou version ultérieure, cette diffusion sera envoyée pour toute analyse Wi-Fi complète effectuée sur l'appareil par la plate-forme ou d'autres applications. Les applications peuvent écouter passivement toutes les analyses terminées sur l'appareil en utilisant la diffusion sans effectuer leur propre analyse.Demandez une analyse à l'aide de
WifiManager.startScan(). Veillez à vérifier l'état de retour de la méthode, car l'appel peut échouer pour l'une des raisons suivantes :- Les requêtes d'analyse peuvent être limitées en raison d'un trop grand nombre d'analyses sur une courte période.
- L'appareil est inactif et l'analyse est désactivée.
- Le matériel Wi-Fi signale un échec d'analyse.
Obtenez les résultats de l'analyse à l'aide de
WifiManager.getScanResults(). Les résultats d'analyse renvoyés sont les plus récents, qui peuvent provenir d'une analyse précédente si votre analyse actuelle n'est pas terminée ou n'a pas réussi. Cela signifie que vous pouvez obtenir des résultats d'analyse plus anciens si vous appelez cette méthode avant de recevoir une diffusion réussieSCAN_RESULTS_AVAILABLE_ACTION.
Le code suivant montre comment implémenter ces étapes :
Kotlin
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager val wifiScanReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false) if (success) { scanSuccess() } else { scanFailure() } } } val intentFilter = IntentFilter() intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) context.registerReceiver(wifiScanReceiver, intentFilter) val success = wifiManager.startScan() if (!success) { // scan failure handling scanFailure() } .... private fun scanSuccess() { val results = wifiManager.scanResults ... use new scan results ... } private fun scanFailure() { // handle failure: new scan did NOT succeed // consider using old scan results: these are the OLD results! val results = wifiManager.scanResults ... potentially use older scan results ... }
Java
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() { @Override public void onReceive(Context c, Intent intent) { boolean success = intent.getBooleanExtra( WifiManager.EXTRA_RESULTS_UPDATED, false); if (success) { scanSuccess(); } else { // scan failure handling scanFailure(); } } }; IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); context.registerReceiver(wifiScanReceiver, intentFilter); boolean success = wifiManager.startScan(); if (!success) { // scan failure handling scanFailure(); } .... private void scanSuccess() { List<ScanResult> results = wifiManager.getScanResults(); ... use new scan results ... } private void scanFailure() { // handle failure: new scan did NOT succeed // consider using old scan results: these are the OLD results! List<ScanResult> results = wifiManager.getScanResults(); ... potentially use older scan results ... }
Restrictions
Android 8.0 (niveau d'API 26) a introduit des restrictions concernant les autorisations et la fréquence autorisée des analyses Wi-Fi.
Pour améliorer les performances du réseau, la sécurité et l'autonomie de la batterie, Android 9 (niveau d'API 28) a renforcé les exigences en matière d'autorisations et a limité davantage la fréquence des analyses Wi-Fi.
Autorisations
Android 8.0 et Android 8.1 :
Un appel réussi à
WifiManager.getScanResults()
nécessite l'une des autorisations suivantes :
Si l'application appelante ne dispose d'aucune de ces autorisations, l'appel échoue avec une
SecurityException.
Vous pouvez également utiliser
CompanionDeviceManager
sur les appareils exécutant Android 8.0 (niveau d'API 26) ou version ultérieure pour effectuer une analyse des appareils associés à proximité au nom de votre application sans
nécessiter l'autorisation d'accéder à la position. Pour en savoir plus sur cette option, consultez
Association d'un appareil associé.
Android 9 :
Un appel réussi à
WifiManager.startScan()
nécessite que toutes les conditions suivantes soient remplies :
- Votre application dispose de l'autorisation
ACCESS_FINE_LOCATIONouACCESS_COARSE_LOCATION. - Votre application dispose de l'
CHANGE_WIFI_STATEautorisation. - Les services de localisation sont activés sur l'appareil (sous Paramètres > Localisation).
Android 10 (niveau d'API 29) ou version ultérieure :
Un appel réussi à
WifiManager.startScan()
nécessite que toutes les conditions suivantes soient remplies :
- Si votre application cible le SDK Android 10 (niveau d'API 29) ou une version ultérieure, elle
dispose de l'
ACCESS_FINE_LOCATIONautorisation. - Si votre application cible un SDK inférieur à Android 10 (niveau d'API 29), elle
dispose de l'
ACCESS_COARSE_LOCATIONouACCESS_FINE_LOCATIONautorisation. - Votre application dispose de l'
CHANGE_WIFI_STATEautorisation. - Les services de localisation sont activés sur l'appareil (sous Paramètres > Localisation).
Pour appeler
WifiManager.getScanResults(),
avec succès, assurez-vous que toutes les conditions suivantes sont remplies :
- Si votre application cible le SDK Android 10 (niveau d'API 29) ou une version ultérieure, elle dispose de l'autorisation
ACCESS_FINE_LOCATION. - Si votre application cible un SDK inférieur à Android 10 (niveau d'API 29), elle dispose de l'autorisation
ACCESS_COARSE_LOCATIONouACCESS_FINE_LOCATION. - Votre application dispose de l'
ACCESS_WIFI_STATEautorisation. - Les services de localisation sont activés sur l'appareil (sous Paramètres > Localisation).
Si l'application appelante ne répond pas à toutes ces exigences, l'appel échoue avec
a SecurityException.
Limitations
Les limites suivantes s'appliquent à la fréquence des analyses à l'aide de
WifiManager.startScan().
Android 8.0 et Android 8.1 :
Chaque application en arrière-plan peut effectuer une analyse toutes les 30 minutes.
Android 9 :
Chaque application au premier plan peut effectuer quatre analyses toutes les deux minutes. Cela permet d'effectuer une série d'analyses sur une courte période.
Toutes les applications en arrière-plan combinées peuvent effectuer une analyse toutes les 30 minutes.
Android 10 ou version ultérieure :
Les mêmes limites de limitation qu'Android 9 s'appliquent. Une nouvelle option pour les développeurs permet de désactiver la limitation pour les tests locaux (sous Options pour les développeurs > Réseau > Limitation de l'analyse Wi-Fi).