Amis, je veux trouver tous les réseaux WiFi disponibles et les afficher dans une liste que j'ai essayée comme ci-dessous. Mais ça ne marche pas. J'ai édité mon code, et maintenant j'ai le résultat mais avec tout le résultat dont je n'ai pas besoin. Je n'ai besoin que des noms de réseau wifi dans ma liste.
public class MainActivity extends Activity {
TextView mainText;
WifiManager mainWifi;
WifiReceiver receiverWifi;
List<ScanResult> wifiList;
StringBuilder sb = new StringBuilder();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainText = (TextView) findViewById(R.id.tv1);
mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if (mainWifi.isWifiEnabled() == false)
{
// If wifi disabled then enable it
Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled",
Toast.LENGTH_LONG).show();
mainWifi.setWifiEnabled(true);
}
receiverWifi = new WifiReceiver();
registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
mainWifi.startScan();
mainText.setText("Starting Scan...");
}
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 0, 0, "Refresh");
return super.onCreateOptionsMenu(menu);
}
public boolean onMenuItemSelected(int featureId, MenuItem item) {
mainWifi.startScan();
mainText.setText("Starting Scan");
return super.onMenuItemSelected(featureId, item);
}
protected void onPause() {
unregisterReceiver(receiverWifi);
super.onPause();
}
protected void onResume() {
registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
super.onResume();
}
// Broadcast receiver class called its receive method
// when number of wifi connections changed
class WifiReceiver extends BroadcastReceiver {
// This method call when number of wifi connections changed
public void onReceive(Context c, Intent intent) {
sb = new StringBuilder();
wifiList = mainWifi.getScanResults();
sb.append("\n Number Of Wifi connections :"+wifiList.size()+"\n\n");
for(int i = 0; i < wifiList.size(); i++){
sb.append(new Integer(i+1).toString() + ". ");
sb.append((wifiList.get(i)).toString());
sb.append("\n\n");
}
mainText.setText(sb);
}
}
}
Vous devez créer un BroadcastReceiver
pour écouter les résultats de l'analyse Wifi:
private final BroadcastReceiver mWifiScanReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent intent) {
if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
List<ScanResult> mScanResults = mWifiManager.getScanResults();
// add your logic here
}
}
}
Dans onCreate()
vous affecteriez mWifiManager
et lancer une analyse:
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
registerReceiver(mWifiScanReceiver,
new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
mWifiManager.startScan();
getScanResults()
renverra des données uniquement si vous disposez des autorisations appropriées. Pour cela, ajoutez l'une des deux lignes suivantes à votre AndroidManifest.xml
:
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
Notez également que dans l'API 23+, les autorisations doivent être demandées lors de l'exécution. (Pour un environnement de laboratoire, vous pouvez également accorder des autorisations manuellement dans les paramètres à la place - moins de codage requis, mais non recommandé pour une application d'utilisateur final.)
Notez que le code qui gère vos résultats d'analyse s'exécuterait chaque fois qu'un nouveau résultat d'analyse est disponible, mettant à jour le résultat.
Si votre Android est 6.0 ou supérieure , votre application doit demander l'autorisation suivante au moment de l'exécution (soit le suivant).
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
Ajoutez simplement ce code dans la méthode onResume de votre activité
@Override
public void onResume()
{
super.onResume();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
if(checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
{
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 87);
}
}
}
Wifi.getScanResults () renverra 0 résultats.
Beaucoup de gens, dont moi, ont rencontré ce problème dans les téléphones Nexus 5 et l'ont appelé un "bug".
La numérisation peut être demandée par
wifiManager.startScan();
boolean startScan () retourne vrai ou faux immédiatement en fonction du fait que l'analyse a réussi ou non.
Cependant, il démarre un événement asynchrone qui envoie une intention ( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION ) à la fin de l'analyse. Étant donné que les résultats de l'analyse (résultat d'événement asynchrone) ne seront pas disponibles immédiatement, vous devrez enregistrer votre activité auprès d'un BroadcastReceiver.
Voici l'extrait de code pour lire ces résultats (de manière asynchrone) à l'aide de BroadcastReceiver.
public class WifiScanReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION))
{
List<ScanResult> scanResults = wifimanager.getScanResults();
// Write your logic to show in the list
}
}
}
Vous pouvez voir cette démo sur BroadcastReceiver
Le résultat de l'analyse renvoie une liste vide dans Android 6.
class WifiReceiver extends BroadcastReceiver {
public void onReceive(Context c, Intent intent) {
sb = new StringBuilder();
wifiList = mainWifi.getScanResults();
for (int i = 0; i < wifiList.size(); i++){
sb.append(new Integer(i+1).toString() + ".");
sb.append((wifiList.get(i)).SSID);
sb.append("\n");
}
mainText.setText(sb);
}
}