首页 > 解决方案 > 广播接收器多久获得一次 wifi 扫描更新?

问题描述

目标:定期获取 wifi 扫描结果(我可以选择时间段)。

问题:我正在尝试获取 wifi 扫描结果。我正在使用这段代码。根据我在使用SCAN_RESULTS_AVAILABLE_ACTION常量注册接收器时的理解,我说的是:“当接入点扫描结果广播可用时通知我”。

我搜索并发现startScan()这是我正在寻找的方法,但不幸的是......

公共布尔 startScan ()

此方法在 API 级别 28 中已弃用。应用程序触发扫描请求的功能将在未来版本中删除。

问题:是否有替代方法startScan()或其他方法在我需要时触发扫描?如何知道 wifi 扫描更新的频率?

 wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

        // Check if wifi is enabled. Enables it otherwise.
        if (!wifiManager.isWifiEnabled()) {
            //Toast.makeText(getApplicationContext(), "WiFi is disabled. Let's enable it.", Toast.LENGTH_SHORT).show();
            // CHANGE_WIFI_STATE permission allow this
            wifiManager.setWifiEnabled(true);
        }

        wifiScanReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                localMaxSignalStrength = 1;
                results = wifiManager.getScanResults();

                for (int i = 0; i < results.size(); i++) {

                    ScanResult el = results.get(i);
                    int signalLevel = wifiManager.calculateSignalLevel(el.level, 5);

                    if (signalLevel > localMaxSignalStrength){
                        localMaxSignalStrength = signalLevel;
                    }

                    Toast.makeText(getApplicationContext(), "SSID:" + el.SSID + "frequency" + el.frequency + "lev:" + signalLevel, Toast.LENGTH_SHORT).show();
                }
                unregisterReceiver(this);

            }
        };

        registerReceiver(wifiScanReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

编辑 1

更好地阅读有关广播接收器的文档,我发现如果您不调用取消注册接收器,您将继续接收您注册的广播消息。

要停止接收广播,请调用 unregisterReceiver(android.content.BroadcastReceiver)。当您不再需要接收器或上下文不再有效时,请务必取消注册接收器。

我试图取消注释unregisterReceiver(this);,似乎现在我不断收到 Wifi 扫描结果。

编辑 2 (09/2018)

我在上面写的,特别是我不断收到扫描结果的事实对于Android 4.2.2 (JellyBean)是正确的。由于我已经在Android 7.0 (Nougat)上进行了测试,因此我注意到(没有取消注册接收器)我没有像以前的操作系统版本那样以连续的方式接收 wifi 扫描结果,但速度很慢(几分钟之间扫描)。

在这种情况下,我被迫使用WifiManager'startScan()方法(注意:API 28 已弃用)。无论如何,这种方法有一些限制,如下所述。

以下限制适用于使用 WifiManager.startScan() 的扫描频率。

安卓 8.0 和安卓 8.1:

每个后台应用程序可以在 30 分钟内扫描一次。

Android 9 及更高版本:

每个前台应用程序可以在 2 分钟内扫描四次。这允许在短时间内进行一次扫描。

所有后台应用程序组合可以在 30 分钟内扫描一次。

标签: javaandroid

解决方案


推荐阅读