目标:定期获取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(牛轧糖)上进行了测试,所以我注意到(没有注销接收器)我没有像以前的操作系统那样连续接收wifi扫描结果版本,但速度很慢(两次扫描之间的分钟数)。
在这种情况下,我被迫使用WifiManager
的{{1}}方法(注意:API 28不推荐使用)。无论如何,此方法有一些限制,如下所述。
以下限制适用于使用的扫描频率 WifiManager.startScan()。
Android 8.0和Android 8.1:
每个后台应用程序可以在30分钟内扫描一次。
Android 9及更高版本:
每个前台应用程序可以在2分钟内扫描四次。这个 可以在短时间内进行扫描。
所有后台应用程序组合在一起可以在30分钟内扫描一次。