java - 广播接收器多久获得一次 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 分钟内扫描一次。
解决方案
推荐阅读
- angular - Angular 6 反应形式,同步跨字段验证
- spring-boot - 审计时插入空值
- r - 当 R 中的 MyData$Columnx == MyData[,x] 时,为什么 MyData[,x] 的行为方式与 MyData$Columnx 不同?
- tensorflow - 保存模型以供服务,但“ValueError:必须同时提供标签和日志”。尝试导出模型时
- rxjs - rxjs 将 http 数据与 websocket 更新合并
- java - 仅当非空或零时,Java bean 才验证范围
- javascript - 在 es6 模板字符串中传递对象
- forms - 德尔福。程序正在编译。但形式没有任何反应
- python - 在索引是日期时迭代数据框
- sql - Postgres级联删除与触发器