Android – Como buscar redes Wi-fi e se conectar programaticamente (Wi-Fi Scan)

Android-WiFi

Nesta publicação vamos mostrar como realizar uma busca de redes Wi-Fi (wirelles) e um exemplo simples de como se conectar.

Permissões Necessárias:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

Abaixo criei uma classe para gerenciar o adaptador Wi-Fi, nela vamos ter um Listener que vai notificar nossa tela quando a busca foi terminada, e um método statico para iniciar a consulta.


/**
 * @author Guilherme Biff Zarelli (http://helpdev.com.br)
 */
public class WiFi extends BroadcastReceiver {

    /**
     * Listener responsável para notificar a consulta
     *
     */
    public static interface WiFiListener {

        public void onResultScan(Context arg0, Intent arg1, List results);
    }

    public static WiFi startScanWIFI(Context context, WiFiListener wiFiListener) {
        WiFi wifi = new WiFi();
        wifi.wiFiListener = wiFiListener;

        //Registra o broadcast para scaniar as redes wi-fi
        context.registerReceiver(wifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

        wifi.wifiManager = wifi.getWifiManager(context);

        //Se o wi-fi estiver desabilitado, envia um comando para habilitar e retorna null para tratar.
        if (wifi.wifiManager.isWifiEnabled() == false) {
            Toast.makeText(context, "Habilitando Wi-Fi...", Toast.LENGTH_LONG).show();
            wifi.wifiManager.setWifiEnabled(true);
            return null;
        }

        //Inicia o rastramento
        wifi.wifiManager.startScan();

        return wifi;
    }
    private WifiManager wifiManager;
    private WiFiListener wiFiListener;

    private WiFi() {
    }

    /**
     * Pega o adaptador Wirelles
     *
     * @param context
     * @return
     */
    public WifiManager getWifiManager(Context context) {
        if (wifiManager == null) {
            wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        }
        return wifiManager;
    }

    /**
     * Método responsavel em receber o broadcast do scan wi-fi
     *
     */
    @Override
    public void onReceive(Context arg0, Intent arg1) {
        List results = wifiManager.getScanResults();

        // Se tiver listener, envia os dados.
        if (wiFiListener != null) {
            wiFiListener.onResultScan(arg0, arg1, results);
        }

        //Cancela o Broadcast e desregistra.
        clearAbortBroadcast();
        arg0.unregisterReceiver(this);
    }
}

Agora que nosso gerenciador já está feito, vamos criar uma MainActivity e realizar a busca também criei um OnItemClickListener no ListView para simular uma conexão de rede Wi-Fi para testes.

/**
 *
 * @author Guilherme Biff Zarelli (http://helpdev.com.br)
 */
public class MainActivity extends Activity implements OnClickListener, WiFi.WiFiListener, AdapterView.OnItemClickListener {

    private WiFi wiFi;
    private ListView list;
    private ArrayAdapter adapter;
    private ArrayList itens;
    private List scans;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.botao).setOnClickListener(this);
        list = (ListView) findViewById(R.id.list);

        itens = new ArrayList();
        adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, itens);
        list.setAdapter(adapter);
        list.setOnItemClickListener(this);

    }

    /**
     * Ação do botão
     *
     */
    public void onClick(View view) {
        Toast.makeText(this, "Buscando....", Toast.LENGTH_LONG).show();
        //Inicia a Busca...
        wiFi = WiFi.startScanWIFI(this, this);
    }

    /**
     * Exemplo de conexão Wi-Fi
     *
     * Ao clicar em um item crio um WifiConfiguration com os dados do item e
     * realizo a conexão Wi-Fi.
     *
     */
    public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {

        //Configuro uma rede baseada nos dados encontrados.
        WifiConfiguration wifiConfiguration = new WifiConfiguration();
        wifiConfiguration.BSSID = scans.get(arg2).BSSID;
        wifiConfiguration.SSID = "\"" + scans.get(arg2).SSID + "\"";
        wifiConfiguration.preSharedKey = "\"15975346\"";

        //Conecto na nova rede criada.
        WifiManager wifiManager = wiFi.getWifiManager(this);
        int netId = wifiManager.addNetwork(wifiConfiguration);
        wifiManager.saveConfiguration();
        wifiManager.disconnect();
        wifiManager.enableNetwork(netId, true);
        wifiManager.reconnect();
    }

    /**
     * Retorno da busca...
     *
     */
    public void onResultScan(Context arg0, Intent arg1, List results) {
        scans = results;
        itens.clear();
        for (ScanResult scanResult : results) {
            itens.add(scanResult.SSID + " - " + scanResult.BSSID);
        }
        adapter.notifyDataSetChanged();
    }
}

Projeto em anexo: (DropBox)

Help DEV – Analista desenvolvedor Java / Android

http://helpdev.com.br/zarelli

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>