Как использовать SUPPLICANT_STATE_CHANGED_ACTION WiFi BroadcastReceiver - Android - PullRequest
3 голосов
/ 13 января 2012

Я хочу показать процесс подключения на экране, когда мое устройство подключается к сети Wi-Fi. SUPPLICANT_STATE_CHANGED_ACTION предоставляется WifiManager, но я не знаю, как его использовать. Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 2 ]

7 голосов
/ 30 ноября 2014

Вы действительно можете использовать транслируемые намерения для SUPPLICANT_STATE_CHANGED_ACTION:

Приложению требуется разрешение в файле манифеста:

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

Затем зарегистрируйтесь для трансляции системы:

    MyWifiStateReceiver handler = new MyWifiStateReceiver();
    context.registerReceiver(handler, new IntentFilter(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION));

registerReceiver() нужен экземпляр класса, реализующий BroadcastReceiver в качестве первого аргумента. В этом коде вы можете воздействовать на изменения состояния Wi-Fi, переопределяя метод onReceive. Например

public class MyWifiStateReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        if (intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION))
        {
            SupplicantState state = (SupplicantState) intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
            switch(state)
            {
                case COMPLETED:
                case DISCONNECTED:
                    ...
            }
        }
    }
}

Для возможных значений состояния Wi-Fi, см. http://developer.android.com/reference/android/net/wifi/SupplicantState.html

3 голосов
/ 13 сентября 2012

Я не знаю метода обратного вызова, который позволяет узнать, когда статус Wi-Fi изменился. Я опросил информацию, используя обработчик, работающий в фоновом режиме.

Добавьте обработчик в ваш класс.

private WifiStatusHandler wifiStatusHandler = new WifiStatusHandler();

Начните с вызова

wifiStatusHandler.start();

Код, который я использовал ниже.

/**
 * Checks for wifi status updates.
 */
private class WifiStatusHandler extends Handler {
    private boolean running = false;

    public void handleMessage(Message message) {
        if (running) {
            //check wifi status here
            WifiManager wifiMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
            int curWifiState = wifiMgr.getWifiState();
            SupplicantState info = wifiMgr.getConnectionInfo().getSupplicantState();
            WifiInfo curWifi = wifiMgr.getConnectionInfo();
            Log.i(TAG,"WIFI STATE = " + info.toString());
            //update the TextView etc.
            sleep();
        }
    }

    private void sleep() {
        removeMessages(0);
        sendMessageDelayed(obtainMessage(0), REFRESH_DELAY);
    }

    public synchronized void start() {
        running = true;
        removeMessages(0);
        sendMessageDelayed(obtainMessage(0), 0);
    }

    public synchronized void stop() {
        running = false;
    }
}
...