Android:如何监控 WiFi 信号强度

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1206891/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 02:47:02  来源:igfitidea点击:

Android: How to monitor WiFi signal strength

androidnetworking

提问by Niko Gamulin

I would receive notifications when signal strength changes. I tried to create the following method and call it in the onCreate():

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

I would appreciate if anyone could check if the method is written correctly. I tried to run the app, but haven't received any notifications and am not sure whether it is because the signal strength might be constant in the place I run debug or it is because something is missing.

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

Thanks!

谢谢!

采纳答案by lilbyrdie

First, make sure you have <uses-permission>for ACCESS_WIFI_STATEin your manifest.

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

Second, I'm not sure about notifications for a single connection, but to get notifications of everything the radio is seeing, you can start a scan:

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

wifi.startScan();

Next, when I've received successful results, I used WifiManager.SCAN_RESULTS_AVAILABLE_ACTIONin the IntentFilter.

接下来,当我收到成功的结果时,我WifiManager.SCAN_RESULTS_AVAILABLE_ACTIONIntentFilter.

Then, in the receiver, I use getScanResults()from the WifiManagerobject, which also contains the signal strength.

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

For stopping it this way, you simply call to unregisterRecever()(so you'll want to keep it around for referencing). I haven't tested myself to see if my scanning code can be modified to just check the current connection, but I do know I got plenty of results -- Wi-Fi signals change frequently and quickly. I suppose for monitoring a single connection, you can also just filter the scan results and look for the one the device is currently connected to.

要以这种方式停止它,您只需调用unregisterRecever()(因此您需要保留它以供参考)。我还没有测试过自己是否可以修改我的扫描代码以仅检查当前连接,但我知道我得到了很多结果——Wi-Fi 信号频繁且快速地变化。我想为了监视单个连接,您还可以过滤扫描结果并查找设备当前连接到的那个。

I hope this helps a little.

希望这会有帮助。

回答by sschrass

Just to drop my solution:

只是为了放弃我的解决方案:

in my App I have

在我的应用程序中,我有

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

And the onReceive in my Receiver looks like:

我的接收器中的 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);
}

The idea is the to startScan()only every 5 seconds if the wifi is the active network.

startScan()如果 wifi 是活动网络,这个想法是每 5 秒一次。