Обработка WifiManager # startScan на переднем плане в Android P - PullRequest
0 голосов
/ 15 января 2019

Как некоторая информация от здесь и здесь . Мы знаем в Android P

Каждое приложение переднего плана может сканировать 4 раза за 2 минуты
Все фоновые приложения могут сканироваться один раз за 30 минут

После тестирования я вижу, что с 5-го сканирования (через 2 минуты) сканирование регулируется как

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

Возвращает старое значение немедленно onReceive) без любой ошибки или исключения. Тогда я не знаю, какое значение из дросселированного сканирования.

В настоящее время я хочу показать всплывающее окно с обратным отсчетом через 2 минуты после сканирования пользователем более 4 раз (после сканирования с дросселированием).

Конечно, я могу посчитать общее время сканирования пользователя за 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 голосов
/ 15 января 2019

Ну, самым близким, что я смог найти для вашего случая, был логический флаг EXTRA_RESULTS_UPDATED, предоставленный в намерении, полученном onReceive.

Согласно документации вы получите это false, если ваше приложение запрашивало слишком много раз за короткий промежуток времени, независимо от того, находится ли приложение на переднем или заднем плане, так что это решает вашу проблему для написания двух разных логик для обоих и подсчета вручную (независимо от того, 4 или 5 это не имеет значения), но, опять же, это не единственная причина, по которой вы можете получить этот флаг false. Но я подумал, что это может помочь.

Вы можете посмотреть официальный документ об этом здесь: https://developer.android.com/reference/android/net/wifi/WifiManager.html#EXTRA_RESULTS_UPDATED

...