Vous pouvez utiliser les fonctionnalités de recherche Wi-Fi fournies par le l'API WifiManager pour obtenir la liste des Points d'accès Wi-Fi visibles depuis l'appareil
Processus de recherche de réseaux Wi-Fi
Le processus d'analyse comporte trois étapes:
Enregistrer un écouteur de diffusion pour
SCAN_RESULTS_AVAILABLE_ACTION
qui est appelée lorsque les requêtes d'analyse sont terminées, en fournissant l'état de réussite/d'échec. Pour les appareils équipés d'Android 10 (niveau d'API 29) ou version ultérieure, sera envoyée pour toute recherche Wi-Fi complète effectuée sur l'appareil par la plateforme ou d’autres applications. Les applis peuvent écouter passivement toutes les recherches les lectures complètes sur l'appareil à l'aide de la diffusion sans émettre de scan vous-même.Demandez une analyse avec
WifiManager.startScan()
Assurez-vous de vérifier l'état renvoyé 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 en peu de temps.
- L'appareil est inactif et la recherche est désactivée.
- Le matériel Wi-Fi signale un échec de la recherche.
Obtenir les résultats d'analyse avec
WifiManager.getScanResults()
Les résultats d'analyse renvoyés sont les derniers résultats mis à jour, provenir d'une analyse précédente si l'analyse en cours n'est pas terminée ou a réussi. Cela signifie que vous pouvez obtenir des résultats d'analyse plus anciens si vous appelez cette méthode avant de recevoirSCAN_RESULTS_AVAILABLE_ACTION
annonce.
Le code suivant fournit un exemple d'implémentation de 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 le la fréquence autorisée pour les recherches de réseaux Wi-Fi.
Pour améliorer les performances du réseau, la sécurité et l'autonomie de la batterie, Android 9 (API niveau 28) a renforcé les exigences d'autorisation et limité davantage la fréquence Recherches de réseaux Wi-Fi.
Autorisations
Android 8.0 et Android 8.1:
Un appel réussi vers
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
Sur les appareils équipés d'Android 8.0 (niveau d'API 26) ou version ultérieure, vous pouvez également
utilisez la
CompanionDeviceManager
d'effectuer une analyse des appareils associés à proximité pour le compte de votre application sans
sans autorisation d'accéder à la position. Pour en savoir plus sur cette option, consultez
Appareil associé
association.
Android 9:
Un appel réussi vers
WifiManager.startScan()
nécessite que toutes les conditions suivantes soient remplies:
- Votre application dispose des
ACCESS_FINE_LOCATION
ouACCESS_COARSE_LOCATION
l'autorisation. - Votre application dispose des
CHANGE_WIFI_STATE
l'autorisation. - 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 vers
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
contient le
ACCESS_FINE_LOCATION
l'autorisation. - Si votre application cible un SDK antérieur à Android 10 (niveau d'API 29), elle
contient le
ACCESS_COARSE_LOCATION
ouACCESS_FINE_LOCATION
l'autorisation. - Votre application dispose du
CHANGE_WIFI_STATE
l'autorisation. - Les services de localisation sont activés sur l'appareil (sous Paramètres > Emplacement).
Pour réussir l'appel
WifiManager.getScanResults()
,
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 antérieur à Android 10 (niveau d'API 29), elle
dispose de l'autorisation
ACCESS_COARSE_LOCATION
ouACCESS_FINE_LOCATION
. - Votre application dispose des
ACCESS_WIFI_STATE
l'autorisation. - Les services de localisation sont activés sur l'appareil (sous Paramètres > Emplacement).
Si l'application appelante ne répond pas à toutes ces exigences, l'appel échoue avec
Un SecurityException
.
Limitation
Les limites suivantes s'appliquent à la fréquence des analyses via
WifiManager.startScan()
Android 8.0 et Android 8.1:
Chaque application en arrière-plan ne peut être analysée qu'une seule fois toutes les 30 minutes.
Android 9:
Chaque application de premier plan peut être analysée quatre fois en deux minutes. Cela permet en rafale en peu de temps.
Toutes les applications en arrière-plan combinées peuvent effectuer une analyse une seule fois sur une période de 30 minutes.
Android 10 ou version ultérieure :
Les mêmes limites de limitation d'Android 9 s'appliquent. Une nouvelle option pour les développeurs pour désactiver la limitation des tests en local (sous Options pour les développeurs > Mise en réseau > limitation de la recherche Wi-Fi).