在Android P中前台处理WifiManager#startScan

时间:2019-01-15 02:59:34

标签: android wifimanager android-9.0-pie

来自herehere的一些信息。我们知道Android P

  

每个前台应用程序可以在2分钟内扫描4次
  所有后台应用程序组合在一起可以在30分钟内扫描一次

测试后,我发现从第5次扫描(在2分钟内)开始,扫描就被限制了

WifiService: startScan uid=10085
WifiScanRequestProxy: Scan request from vn.linh.androidwifiscanner throttled

立即(在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

任何帮助或建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

好吧,我能为您找到的最接近的是在EXTRA_RESULTS_UPDATED收到的意图中提供的布尔标志onReceive

根据文档,如果您的应用程序在短时间内请求了太多次,而无论应用程序处于前台还是后台,您都将获得此false,从而解决了为两者编写两种不同逻辑的问题并手动进行计数(无论是4还是5都没有关系),但这再次不是您将这个标志设置为false的唯一原因。但是我认为这可能会有所帮助。

您可以在此处查看有关它的官方文档: https://developer.android.com/reference/android/net/wifi/WifiManager.html#EXTRA_RESULTS_UPDATED