问题 Android:如何监控WiFi信号强度


当信号强度发生变化时,我会收到通知。我尝试创建以下方法并在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));
}

如果有人能检查方法是否写得正确,我将不胜感激。我试图运行应用程序,但没有收到任何通知,我不确定是否因为信号强度在我运行调试的地方可能是不变的,或者是因为缺少某些东西。

谢谢!


2202
2017-07-30 14:18


起源



答案:


首先,确保你有 <uses-permission> 对于 ACCESS_WIFI_STATE 在你的清单中。

其次,我不确定单个连接的通知,但是为了获得收音机看到的所有内容的通知,您可以开始扫描:

wifi.startScan();

接下来,当我收到成功的结果时,我用了 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION 在里面 IntentFilter

然后,在接收器中,我使用 getScanResults() 来自 WifiManager 对象,它还包含信号强度。

要以此方式停止,您只需致电 unregisterRecever() (所以你要保留它以供参考)。我没有测试自己,看看我的扫描代码是否可以修改,只是检查当前的连接,但我知道我有很多结果 - Wi-Fi信号经常和快速变化。我想,为了监控单个连接,您还可以过滤扫描结果并查找设备当前连接的扫描结果。

希望这会有帮助。


12
2017-07-31 15:31



你能答应一下吗? - Vervatovskis


答案:


首先,确保你有 <uses-permission> 对于 ACCESS_WIFI_STATE 在你的清单中。

其次,我不确定单个连接的通知,但是为了获得收音机看到的所有内容的通知,您可以开始扫描:

wifi.startScan();

接下来,当我收到成功的结果时,我用了 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION 在里面 IntentFilter

然后,在接收器中,我使用 getScanResults() 来自 WifiManager 对象,它还包含信号强度。

要以此方式停止,您只需致电 unregisterRecever() (所以你要保留它以供参考)。我没有测试自己,看看我的扫描代码是否可以修改,只是检查当前的连接,但我知道我有很多结果 - Wi-Fi信号经常和快速变化。我想,为了监控单个连接,您还可以过滤扫描结果并查找设备当前连接的扫描结果。

希望这会有帮助。


12
2017-07-31 15:31



你能答应一下吗? - Vervatovskis


只是放弃我的解决方案:

在我的应用程序中我有

@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() 如果wifi是活动网络,则每5秒钟一次。


0
2018-02-16 09:25