Android: как контролировать уровень сигнала WiFi - PullRequest
12 голосов
/ 30 июля 2009

Я получаю уведомления при изменении уровня сигнала. Я попытался создать следующий метод и вызвать его в onCreate ():

private void initializeWiFiListener(){
    Log.i(TAG, "executing initializeWiFiListener");

    String connectivity_context = Context.WIFI_SERVICE;
    final WifiManager wifi = (WifiManager)getSystemService(connectivity_context);

    if(!wifi.isWifiEnabled()){
        if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING){
            wifi.setWifiEnabled(true);
        }
    }

    registerReceiver(new BroadcastReceiver(){

        @Override
        public void onReceive(Context context, Intent intent) {
            WifiInfo info = wifi.getConnectionInfo();
            //TODO: implement methods for action handling
        }

    }, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION));
}

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

Спасибо!

Ответы [ 2 ]

12 голосов
/ 31 июля 2009

Сначала убедитесь, что в вашем манифесте есть <uses-permission> для ACCESS_WIFI_STATE.

Во-вторых, я не уверен насчет уведомлений для одного соединения, но чтобы получать уведомления обо всем, что видит радио, вы можете запустить сканирование:

wifi.startScan();

Далее, когда я получил успешные результаты, я использовал WifiManager.SCAN_RESULTS_AVAILABLE_ACTION в IntentFilter.

Затем в приемнике я использую getScanResults() от объекта WifiManager, который также содержит уровень сигнала.

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

Надеюсь, это немного поможет.

0 голосов
/ 16 февраля 2015

Просто бросьте мое решение:

в моем приложении у меня есть

@Override
protected void onResume() {
    super.onResume();
    networkStateReceiver = new NetworkStateReceiver(this);
    this.registerReceiver(networkStateReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
    this.registerReceiver(networkStateReceiver, new IntentFilter("android.net.wifi.SCAN_RESULTS"));
    networkStateReceiver.registerListener(this);
}

И onReceive в моем приемнике выглядит так:

@Override
public void onReceive(Context context, Intent intent) {
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnectedOrConnecting()) {
        switch (networkInfo.getType()) {
            case ConnectivityManager.TYPE_ETHERNET:
                this.networkStateMessage = new NetworkStateMessage(networkInfo);
                break;
            case ConnectivityManager.TYPE_WIFI:
                this.networkStateMessage = new NetworkStateMessage(networkInfo, wifiManager.getConnectionInfo());
                worker.schedule(new Runnable() {
                    @Override
                    public void run() { wifiManager.startScan(); }
                }, 5, TimeUnit.SECONDS);
                break;
            default:
                this.networkStateMessage = null;
                break;
        }
    }
    notifyStateToAll(this.networkStateMessage);
}

Идея заключается в том, чтобы startScan() только каждые 5 секунд, если Wi-Fi является активной сетью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...