android - 在 Android P 的前台处理 WifiManager#startScan
问题描述
作为来自这里和这里的一些信息。我们知道在 Android P
每个前台应用程序可在 2 分钟内扫描 4 次
所有后台应用程序组合可在 30 分钟内扫描一次
测试后我看到,从第 5 次扫描(在 2 分钟内)开始,扫描被限制为
WifiService: startScan uid=10085
WifiScanRequestProxy: Scan request from vn.linh.androidwifiscanner throttled
它立即(in onReceive
)返回旧值,没有任何错误或异常。然后我不知道哪个值来自节流扫描。
目前,我想在用户扫描超过 4 次后(节流扫描后)在 2 分钟内显示一个带有倒计时的弹出窗口。
当然,我可以手动计算用户扫描的总时间减去 2,但我认为它不是很有效(例如:如果应用程序支持工作后台,我们需要通过不同的方式检查,甚至在下一个 Android 中他们允许 5 而不是 4 ,...)
有没有人面临这个问题并找到了有效的方法来解决它?
这是我当前的代码
class MainActivity : AppCompatActivity() {
lateinit var wifiManager: WifiManager
public override fun onCreate(savedInstanceState: Bundle?) {
...
button_scan.setOnClickListener {
scanWifiNetworks()
}
wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
}
private fun scanWifiNetworks() {
registerReceiver(wifiReceiver, IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION))
val success = wifiManager.startScan()
if (!success) {
scanFailure()
}
Toast.makeText(this, "Scanning", Toast.LENGTH_SHORT).show()
}
private fun scanFailure() {
Toast.makeText(this, "Scan failure", Toast.LENGTH_SHORT).show()
}
private var wifiReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
Log.d(TAG, "onReceive " + wifiManager.scanResults.size)
unregisterReceiver(this)
}
}
}
https://github.com/PhanVanLinh/AndroidWifiScanner
任何帮助或建议将不胜感激。
解决方案
好吧,我能为您的情况找到的最接近的是EXTRA_RESULTS_UPDATED
在收到的意图中提供的布尔标志onReceive
。
根据文档,false
如果您的应用程序在短时间内请求太多次,无论应用程序处于前台还是后台,您都会得到此信息,这样可以解决您为两者编写两种不同逻辑并手动计数的问题(无论是 4 还是5 无关紧要),但这也不是您将此标志设为假的唯一原因。但我认为这可能会有所帮助。
您可以在这里查看官方文档: https ://developer.android.com/reference/android/net/wifi/WifiManager.html#EXTRA_RESULTS_UPDATED
推荐阅读
- javascript - 如何使用 emailjs 将电子邮件发送到收件箱,每次电子邮件登陆到垃圾邮件
- java - 使用 JNDI 和 Hibernate 配置 Spring
- tensorflow - tf.multinomial 输出数字范围以外的数字
- c# - Visual Studio Forms:有时,选择数据网格单元格不会将单元格的 Selected 属性设置为 true?
- jquery - 为什么在这种情况下 toggleClass 不起作用?
- unreal-engine4 - 虚幻引擎 - 手电筒在 180 度旋转时变暗
- aes - 一个h.264派生流协议的询问
- python - 使用列表格式的数据创建查询
- assembly - Understanding WORD PTR
- ios - 通过不同的视图控制器使用 Realm 时出现 RLMException