- Как избежать троттлинга Wi-Fi на устройствах Android
- Как это работало раньше
- Android 9 и 10
- Android R и решение
- Заключение
- Можно ли отключить регулирование Wi-Fi на Android (Xamarin.Forms), если на устройстве нет этой опции в меню разработчика (Huawei)?
- 2 ответа
- Как проверить, включено или отключено регулирование сканирования WiFi?
- 4 ответа
Как избежать троттлинга Wi-Fi на устройствах Android
Сегодня я хочу обсудить регулирование сканирования Wi-Fi в новых версиях Android и способы его избежать. Раньше я писал статью о новом механизме сканирования в недавно выпущенном Android R. Если вы читаете эту статью, то знаете, что Google ограничивает возможности разработчиков сканировать WiFi, как и в предыдущих версиях Android.
Итак, давайте начнем нашу статью с обзора того, как это работало раньше и как получить аналогичные результаты сейчас с новым Android R.
Как это работало раньше
Эта часть статьи будет простой и без каких-либо ограничений. Не было никаких ограничений, включая Android Oreo, и вы могли сканировать каждую секунду без какого-либо троттлинга. Вот простой фрагмент кода, объясняющий, как это работало раньше:
Вы просто регистрируете широковещательный приемник в своем контексте для получения результатов сканирования и их анализа. Затем вы вызываете метод start scan в своем менеджере WiFi, и он работает как шарм. Было время, когда Android позволял сканировать WiFi до десяти раз в секунду. Только представьте, какой потенциал открывается у качественной навигации.
Но потом все пошло не так, и Google ввел ограничения на сканирование Wi-Fi.
Android 9 и 10
После выхода Android 9 компания Google преподнесла сюрприз всем разработчикам. Сканирование WiFi было максимально обрезано. Теперь вы можете запускать сканирование только четыре раза каждые 120 секунд. Если вы попытаетесь запустить сканирование несколько раз, все ваши попытки будут заблокированы.
В своей предыдущей статье я описал решение для сканирования с равными интервалами и работы с WiFi RTT, но стоит отметить, что полностью избежать троттлинга невозможно.
Кстати, Google представил решение с выпуском Android 10. Они добавили кнопку, позволяющую отключить дросселирование сканирования WiFi в настройках разработчика, так что теперь вы можете выключить его и сканировать без ограничений. Но если вы напишете общее решение для всех устройств, то вы не узнаете, отключена эта опция или нет. И основная проблема — это устройства с настраиваемой ОС (например, Huawei, Xiaomi и т. Д.), Потому что у них нет возможности отключить дросселирование.
Android R и решение
Android R был выпущен несколько недель назад, и Google представил новое сканирование, потому что старое было устаревшим с выпуском Android 9. Итак, теперь они добавили функцию для проверки, отключено ли регулирование:
Вам просто нужно убедиться, что дроссельная заслонка отключена, и вы можете сканировать без каких-либо ограничений. Кстати, это решение годится только в том случае, если вы тестируете свое локальное приложение. Для распространения через Play Market и другие платформы это решение может быть очень плохим, потому что пользователям нужно будет включить режим разработчика и найти там эту опцию.
Заключение
Google ограничил частое сканирование Wi-Fi, но добавил возможность отключения дросселирования. Похоже, они поняли, что принимали неверные решения, и пытаются как-то это исправить. Однако это по-прежнему создает трудности как для разработчиков, так и для пользователей.
С другой стороны, на iOS вообще нет возможности сканировать Wi-Fi, поэтому мы должны быть благодарны за то, что у нас есть.
Можно ли отключить регулирование Wi-Fi на Android (Xamarin.Forms), если на устройстве нет этой опции в меню разработчика (Huawei)?
Я работаю над приложением в Xamarin.Forms и пытаюсь использовать близлежащие сигналы Wi-Fi для отслеживания в помещении. Но это невозможно из-за Android Wi-Fi Throttling.
Как я могу отключить его, если на моем Huawei P20 Pro нет этой опции в меню разработчика?
Могут ли быть другие варианты эффективного сканирования сигналов Wi-Fi на Android, или это невозможно, пока нельзя контролировать регулирование Wi-Fi?
2 ответа
И, наконец, я выполнил эту команду:
в настройках оболочки adb поставить глобальный wifi_scan_throttle_enabled 0
Согласно документам по сканированию Wi-Fi, Android 10 имеет параметр «Регулирование скорости Wi-Fi» в меню разработчика.
Android 9 : каждое приложение переднего плана может сканировать четыре раза за 2 минуты. период. Это позволяет выполнить серию сканирований за короткое время. Все вместе взятые фоновые приложения могут сканировать один раз в 30-минутный период.
Android 10 и выше : те же ограничения троттлинга, что и в Android 9. применять. Появилась новая опция разработчика для отключения троттлинга. для локального тестирования (в разделе Параметры разработчика & gt; Сеть & gt; Сканирование Wi-Fi дросселирование ).
Huawei P20 (P20 / P20 Pro) (Android 9) получил обновление системы с Android 10 и EMUI 10 в 2020 году. Вы можете обновить его и отключить регулирование в параметрах разработчика.
Как проверить, включено или отключено регулирование сканирования WiFi?
У меня есть сценарий разработки, в котором мне нужно проверить, включена или отключена опция дросселирования WiFi?
Если он включен, я хочу отключить его программно.
private fun prepareForWiFiScan() < Toast.makeText(this, "Wifi scan preparation started", Toast.LENGTH_SHORT).show() circularProgressbar.visibility = View.VISIBLE wiFiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager if (!wiFiManager.isWifiEnabled) < wiFiManager.isWifiEnabled = true >wiFiScanReceiver = object : BroadcastReceiver() < override fun onReceive(context: Context, intent: Intent) < Toast.makeText([email protected], "Wifi scan finished", Toast.LENGTH_SHORT).senter code herehow() val i'sSuccess: Boolean = when < android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M -> intent.getBooleanExtra( WifiManager.EXTRA_RESULTS_UPDATED, false ) else -> intent.getBooleanExtra(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION, false) > circularProgressbar.visibility = View.GONE when (isSuccess) < true ->scanSuccess() false -> scanFail() > > > registerReceiverAndStartScan() > private fun registerReceiverAndStartScan() < val intentFilter = IntentFilter() intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION) registerReceiver(wiFiScanReceiver, intentFilter) val success = wiFiManager.startScan() if (!success) < scanFail() >>
4 ответа
На самом деле вы также можете проверить дроссель Wi-Fi в версиях Android 1 если дроссель Wi-Fi включен, 0 иначе