Java 广播接收器多久更新一次wifi扫描?
目标:定期获取wifi扫描结果(我可以选择时间段) 问题:我正在尝试获取wifi扫描结果。我正在使用这段代码。 从我使用Java 广播接收器多久更新一次wifi扫描?,java,android,Java,Android,目标:定期获取wifi扫描结果(我可以选择时间段) 问题:我正在尝试获取wifi扫描结果。我正在使用这段代码。 从我使用SCAN\u RESULTS\u AVAILABLE\u ACTION常量注册接收器时的理解来看,我的意思是:“当接入点扫描结果广播可用时,通知我” 我搜索了一下,发现startScan()就是我一直在寻找的方法,但不幸的是 公共布尔起始扫描() 此方法在API级别28中被弃用。 在未来的版本中,应用程序触发扫描请求的功能将被删除 问题:是否有一种方法可以替代startScan
SCAN\u RESULTS\u AVAILABLE\u ACTION
常量注册接收器时的理解来看,我的意思是:“当接入点扫描结果广播可用时,通知我”
我搜索了一下,发现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));
wifiManager=(wifiManager)getApplicationContext().getSystemService(Context.WIFI_服务);
//检查wifi是否已启用。以其他方式启用它。
如果(!wifiManager.isWifiEnabled()){
//Toast.makeText(getApplicationContext(),“WiFi已禁用。让我们启用它。”,Toast.LENGTH_SHORT).show();
//更改\u WIFI\u状态权限允许此操作
wifiManager.setWifiEnabled(true);
}
wifiScanReceiver=新广播接收器(){
@凌驾
公共void onReceive(上下文、意图){
localMaxSignalStrength=1;
results=wifiManager.getScanResults();
对于(int i=0;i本地最大信号强度){
localMaxSignalStrength=信号电平;
}
Toast.makeText(getApplicationContext(),“SSID:+el.SSID+“frequency”+el.frequency+“lev:+signalLevel,Toast.LENGTH_SHORT).show();
}
未注册接收人(本);
}
};
registerReceiver(wifiScanReceiver,新的IntentFilter(WifiManager.SCAN\u RESULTS\u AVAILABLE\u ACTION));
编辑1
通过更好地阅读有关广播接收器的文档,我发现如果您不调用unregister Receiver,您将继续接收您注册的广播消息
要停止接收广播,请拨打
unregisterReceiver(android.content.BroadcastReceiver)。一定要
当不再需要接收器或上下文不可用时,取消注册接收器
不再有效
我试图取消注释取消注册接收者(此)
现在我似乎继续收到Wifi扫描结果
编辑2(2018年9月)
我上面写的,尤其是我不断地收到扫描结果的事实,对于Android 4.2.2(JellyBean)来说是正确的。自从我在安卓7.0(Nougat)上进行测试以来,我注意到(没有注销接收器),我没有像以前的操作系统版本那样连续接收wifi扫描结果,但速度非常慢(扫描间隔几分钟)
在这种情况下,我被迫使用WifiManager
的startScan()
方法(注意:在API 28中已弃用)。无论如何,该方法有一些限制,如下所述
以下限制适用于使用
WifiManager.startScan()
安卓8.0和安卓8.1:
每个后台应用程序可以在30分钟内扫描一次
Android 9及更高版本:
每个前台应用程序可以在2分钟内扫描4次。这
允许在短时间内进行突发扫描
所有后台应用程序可以在30分钟内扫描一次
那么,在android Pie中启动扫描的最佳方式是什么???