这是我的广播接收器,取自 wifi 管理器文档:
private val wifiScanReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent?) {
val success = intent?.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false) ?: false
Log.d("WifiManager", "In on receive $success with scan number: $scanId")
if (success) {
scanSuccess()
} else {
scanFailure()
}
// unregisterWifiReceiver()
}
}
我在 on create 方法中注册 wifi 接收器,并在每次单击按钮时调用开始扫描。但是,即使我只单击该按钮一次,我也会返回连续扫描。这是一个问题,因为我将这些值存储在数据库中,并且我得到了重复项,尽管有时
level
值是不同的。
我设法解决此问题的唯一方法是在扫描成功后立即取消注册 wifi 接收器,然后每次单击按钮时创建一个接收器。我不确定是否需要存储所有这些值 - 为什么
level
会波动以及为什么它会返回这么多结果?我用它来进行 WiFi 指纹识别,因此级别非常重要。
onReceive 不仅会获取 startScan() 生成的结果,还会获取所有其他扫描,包括系统本身启动的定期扫描。因此,在发出 startScan() 时设置一个标志,并在获取结果时重置该标志。未设置标志时忽略结果。
(旁白:考虑使用 WifiManager.ScanResultsCallback for API level >= 30)