在 Android P 中在前台处理 WifiManager#startScan
Handle WifiManager#startScan on foreground in Android P
来自 here and 的一些信息。我们知道在 Android P
Each foreground app can scan 4 times in a 2-minute period
All background apps combined can scan one time in a 30-minute period
测试后我看到,从第 5 次扫描(2 分钟内)开始,扫描被限制为
WifiService: startScan uid=10085
WifiScanRequestProxy: Scan request from vn.linh.androidwifiscanner throttled
它return旧值立即(在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
如有任何帮助或建议,我们将不胜感激。
好吧,我能找到的最接近你的案例的是 onReceive
收到的意向中提供的布尔标志 EXTRA_RESULTS_UPDATED
。
根据文档,如果您的应用在短时间内请求了太多次,无论应用是在前台还是后台,您都会得到这个 false
,这样可以解决您编写两个不同逻辑的问题对于两者和手动计数(无论是 4 还是 5 都无关紧要),但这同样不是您获得此标志的唯一原因 false.But 我认为它可能会有所帮助。
你可以在这里查看官方文档:
https://developer.android.com/reference/android/net/wifi/WifiManager.html#EXTRA_RESULTS_UPDATED
来自 here and
Each foreground app can scan 4 times in a 2-minute period
All background apps combined can scan one time in a 30-minute period
测试后我看到,从第 5 次扫描(2 分钟内)开始,扫描被限制为
WifiService: startScan uid=10085
WifiScanRequestProxy: Scan request from vn.linh.androidwifiscanner throttled
它return旧值立即(在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
如有任何帮助或建议,我们将不胜感激。
好吧,我能找到的最接近你的案例的是 onReceive
收到的意向中提供的布尔标志 EXTRA_RESULTS_UPDATED
。
根据文档,如果您的应用在短时间内请求了太多次,无论应用是在前台还是后台,您都会得到这个 false
,这样可以解决您编写两个不同逻辑的问题对于两者和手动计数(无论是 4 还是 5 都无关紧要),但这同样不是您获得此标志的唯一原因 false.But 我认为它可能会有所帮助。
你可以在这里查看官方文档: https://developer.android.com/reference/android/net/wifi/WifiManager.html#EXTRA_RESULTS_UPDATED