安卓:如何监测WiFi信号强度

13

我希望在信号强度发生变化时能够收到通知。我尝试创建了以下方法,并在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

首先,请确保您的清单中有使用<uses-permission>ACCESS_WIFI_STATE

其次,我不确定如何针对单个连接进行通知,但是要获取无线电看到的所有内容的通知,您可以启动扫描:

wifi.startScan();

接下来,当我收到成功的结果后,我在IntentFilter中使用了WifiManager.SCAN_RESULTS_AVAILABLE_ACTION

然后,在接收器中,我使用了WifiManager对象中的getScanResults()方法,该方法还包含信号强度。

要停止扫描,只需调用unregisterRecever()(因此您需要将其保留以供引用)。 我自己没有测试过我的扫描代码是否可以修改为仅检查当前连接,但我知道我得到了大量结果-- Wi-Fi信号频繁且变化迅速。 我想,要监视单个连接,您也可以仅筛选扫描结果并查找设备当前连接的连接。

希望这能有所帮助。


3
请问您能否稍微详细阐述一下您的回答? - Vervatovskis

0

分享我的解决方案:

在我的应用程序中,我有

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

如果 WiFi 是活动网络,则每 5 秒才执行一次 startScan()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接