web-dev-qa-db-fra.com

Comment obtenir les réseaux wifi disponibles et les afficher dans une liste dans android

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); 
            }

       }
}
27
jigar

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.

40
user149408

Après Android 6.0

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" />

Comment demander l'autorisation à l'exécution

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);
        }
    }
}

Que se passera-t-il si vous n'avez pas l'autorisation ci-dessus lors de l'exécution?

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

Comment scanner et lire les réseaux wifi? (Compréhension approfondie)

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

Liens pertinents

Le résultat de l'analyse renvoie une liste vide dans Android 6.

9
Rohit Singh
  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);

        }

  }
6
MissFiona