Oreo 8.1 - Держите Wi-Fi во время сна - PullRequest
0 голосов
/ 08 января 2020

Я работаю над приложением для устройства Oreo 8.1, которое постоянно проверяет базу данных MS SQL, используя набор Alarm Manager, повторяющийся с RT C Wakeup. Приблизительно после 5 минут сна Wi-Fi отключается, предотвращая соединение. Я не вижу опции в ОС для установки Wi-Fi на «всегда» во время сна.

Я уже добавил wakelock:

class AlertMgr2 : BroadcastReceiver() {
  override fun onReceive(context: Context, intent: Intent?) {
    val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
    val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "app:wakelock")
    wakeLock.acquire(1000)
    displayAlert(context)
    wakeLock.release()
  }

Я попытался добавить блокировку Wi-Fi:

private fun wifiLock(context: Context) {
    Timber.d("Setting up Wifi Lock")
    val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
    wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "MyWifiLock")
    if (!wifiLock.isHeld){
        wifiLock.acquire()
    }
}

Политика никогда не спит устарела:

private fun setNeverSleepPolicy(context: Context) {
    val cr: ContentResolver = context.getContentResolver()
    val set = Settings.System.WIFI_SLEEP_POLICY_NEVER
    Settings.System.putInt(cr, Settings.System.WIFI_SLEEP_POLICY, set)
}

У меня уже есть менеджер аварийных сигналов, установленный на RT C:

    am.setRepeating(
        AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), (ConfigData.checkMsg * 1000).toLong(), pi
    )

Я даже настроил блокировку Wi-Fi на детектор сна:

object SleepDetector {
private var broadcastReceiver: BroadcastReceiver? = null
private lateinit var wifiLock: WifiManager.WifiLock
var sleeping: Boolean = false
var saver: Boolean = false

fun register(context: Context) {
    val intentFilter = IntentFilter()
    intentFilter.addAction(Intent.ACTION_SCREEN_ON)
    intentFilter.addAction(Intent.ACTION_SCREEN_OFF)
    broadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent) {
            if (intent.action == Intent.ACTION_SCREEN_ON) {
                Timber.d("Screen On Detected")
                sleeping = false
                wifiUnlock()
            }
            if (intent.action == Intent.ACTION_SCREEN_OFF) {
                Timber.d("Screen Off Detected")
                sleeping = true
                wifiLock(context!!)
            }
        }
    }
    context.applicationContext.registerReceiver(broadcastReceiver, intentFilter)
}

Есть ли что-то еще, что я можно попробовать ??

...