Implementação de Hotspot Wi-Fi e Conexão em Android via Código

Este artigo demontsra como configurar e gerenciar um hotspot Wi-Fi em dispositivos Android usando código, além de como conectar-se a redes Wi-Fi existentes.

Criação de Hotspot Wi-Fi

O código a seguir permite criar um ponto de acesso Wi-Fi programaticamenet. É importante notar que a funcionalidade de hotspot e a conexão Wi-Fi padrão não podem estar ativas simultaneamente. Portanto, ao habilitar o hotspot, o Wi-Fi será desativado.

package com.example.android.hotspotmanager;

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.lang.reflect.Method;

public class HotspotActivity extends Activity {

    private WifiManager wifiManager;
    private Button toggleHotspotButton;
    private boolean isHotspotEnabled = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hotspot); // Certifique-se que R.layout.activity_hotspot existe

        wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        toggleHotspotButton = findViewById(R.id.button_toggle_hotspot); // Certifique-se que R.id.button_toggle_hotspot existe

        toggleHotspotButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isHotspotEnabled = !isHotspotEnabled;
                if (setWifiApEnabled(isHotspotEnabled)) {
                    Toast.makeText(HotspotActivity.this, isHotspotEnabled ? "Hotspot ativado" : "Hotspot desativado", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(HotspotActivity.this, "Falha ao " + (isHotspotEnabled ? "ativar" : "desativar") + " o hotspot", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    /**
     * Habilita ou desabilita o hotspot Wi-Fi.
     * @param enabled true para habilitar, false para desabilitar.
     * @return true se a operação foi bem-sucedida, false caso contrário.
     */
    public boolean setWifiApEnabled(boolean enabled) {
        // Se estiver habilitando o hotspot, desabilita o Wi-Fi primeiro.
        if (enabled) {
            if (wifiManager.isWifiEnabled()) {
                wifiManager.setWifiEnabled(false);
            }
        }

        try {
            // Configuração do hotspot
            WifiConfiguration apConfig = new WifiConfiguration();
            apConfig.SSID = "\"MeuHotspot\""; // Nome da rede
            apConfig.preSharedKey = "\"senha123\""; // Senha do hotspot
            apConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
            apConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            apConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            apConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
            apConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
            apConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
            apConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
            apConfig.hiddenSSID = false; // Pode ser definido como true se desejar ocultar o SSID

            // Utiliza reflexão para chamar o método setWifiApEnabled, que não é público.
            Method method = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
            boolean success = (Boolean) method.invoke(wifiManager, apConfig, enabled);
            return success;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

Conexão a Redes Wi-Fi

O processo de conexão a uma rede Wi-Fi envolve a busca por redes disponíveis, a verfiicação se a rede atende aos critérios desejados e, em seguida, o estabelecimento da conexão.

package com.example.android.wificonnector;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class WifiScanActivity extends Activity {

    private List<scanresult> scanResults;
    private WifiManager wifiManager;
    private List<string> matchingNetworksSsid;
    private WifiScanReceiver wifiScanReceiver;
    private boolean isConnected = false;
    private Button scanButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wifi_scan); // Certifique-se que R.layout.activity_wifi_scan existe

        initUI();
    }

    private void initUI() {
        scanButton = findViewById(R.id.button_scan_wifi); // Certifique-se que R.id.button_scan_wifi existe
        wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        wifiScanReceiver = new WifiScanReceiver();

        scanButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (wifiManager.isWifiEnabled()) {
                    wifiManager.startScan();
                    Toast.makeText(WifiScanActivity.this, "Iniciando varredura...", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(WifiScanActivity.this, "Wi-Fi está desativado.", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        registerReceiver(wifiScanReceiver, intentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(wifiScanReceiver);
    }

    private class WifiScanReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            scanResults = wifiManager.getScanResults();
            if (scanResults == null || scanResults.isEmpty() || isConnected) {
                return;
            }
            processScanResults(scanResults);
        }
    }

    private void processScanResults(List<scanresult> results) {
        matchingNetworksSsid = new ArrayList<>();
        for (ScanResult result : results) {
            System.out.println("Rede encontrada: " + result.SSID);
            // Filtra redes que contêm "MeuHotspot" no nome (SSID)
            if (result.SSID != null && result.SSID.contains("MeuHotspot")) {
                matchingNetworksSsid.add(result.SSID);
            }
        }
        
        // Tenta conectar se encontrar redes correspondentes
        if (!matchingNetworksSsid.isEmpty()) {
            connectToNetwork(matchingNetworksSsid.get(0));
        }
    }

    private void connectToNetwork(String ssid) {
        WifiConfiguration wifiConfig = createWifiConfiguration(ssid);
        if (wifiConfig != null) {
            int networkId = wifiManager.addNetwork(wifiConfig);
            if (networkId != -1) {
                boolean enabled = wifiManager.enableNetwork(networkId, true);
                isConnected = enabled;
                System.out.println("Conexão à rede " + ssid + " bem-sucedida? " + enabled);
                Toast.makeText(this, "Tentando conectar a " + ssid, Toast.LENGTH_SHORT).show();
            } else {
                 System.out.println("Falha ao adicionar rede " + ssid);
            }
        }
    }

    private WifiConfiguration createWifiConfiguration(String ssid) {
        WifiConfiguration wifiConfiguration = new WifiConfiguration();
        wifiConfiguration.SSID = String.format("\"%s\"", ssid); // SSID deve estar entre aspas
        wifiConfiguration.preSharedKey = String.format("\"%s\"", "senha123"); // Senha deve estar entre aspas
        wifiConfiguration.hiddenSSID = false; // Define se a rede está oculta
        wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
        
        // Configurações de segurança WPA/WPA2 PSK
        wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
        wifiConfiguration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
        wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
        wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
        wifiConfiguration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
        wifiConfiguration.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // Para WPA2
        
        return wifiConfiguration;
    }
}
</scanresult></string></scanresult>

Tags: android Wi-Fi Hotspot redes programação

Publicado em 7-4 19:27