Частота событий акселерометра замедляется первые 5 минут при использовании Angular Ioni c на устройстве Android - PullRequest
6 голосов
/ 05 января 2020

Я использую

window.addEventListener('devicemotion', event => this.watchDeviceMotion(event))

watchDeviceMotion(event: any) {

  let motionData = {
    x: event.acceleration.x,
    y: event.acceleration.y,
    z: event.acceleration.z,
  }
  let rotationData = {
    alpha: event.rotationRate.alpha,
    beta: event.rotationRate.beta,
    gamma: event.rotationRate.gamma
  }

  if (this.getSensorData) {
    // console.log(JSON.stringify(motionData))
    // console.log(JSON.stringify(rotationData))
    this.userData.motionData.push(motionData)
    this.userData.rotationData.push(rotationData)
  }
}

для доступа к данным акселерометра на устройстве Android с использованием Ioni c с Angular. Внутри приложения событие работает с частотой 60 Гц, но когда приложение переключается в фоновый режим, частота падает около 9-10 Гц в течение первых 5 минут, а в какой-то момент, пока он еще в фоновом режиме, оно возвращается к частоте 60 Гц и остается таким до бесконечности.

Я также использую фоновый плагин с

this.backgroundMode.enable();
this.backgroundMode.on('activate').subscribe(() => {
  this.backgroundMode.disableWebViewOptimizations();
});

Я попытался добавить disableBatteryOptimizations () к фоновому плагину с соответствующим условием в конфигурации. xml, но все равно не повезло.

Я также попробовал плагины для Device Motion и Gyroscope, но они ведут себя одинаково.

Как предотвратить частоту замедления? Кто-нибудь еще сталкивался с этой проблемой раньше?

1 Ответ

1 голос
/ 08 января 2020

Неясно, какую версию Android вы используете, но работа с системой обычно ни к чему не приводит. Полагаю, вы могли проверить это в старшей версии, поскольку начиная с Android 9 частота дискретизации должна иметь частоту 0 Гц, когда приложение находится в фоновом режиме. Это связано с новым управлением питанием с «резервными корзинами приложений», где только «активный» не ограничен.

См. Изменения поведения Android 9 :

Ограниченный доступ к датчикам в фоновом режиме Android 9 ограничивает возможности фоновых приложений для доступа к пользовательскому вводу и данным датчиков. Если ваше приложение работает в фоновом режиме на устройстве с Android 9, система применяет к вашему приложению следующие ограничения:

  • Ваше приложение не может получить доступ к микрофону или камере.
  • Датчики, которые используют режим непрерывного создания отчетов,
    , такие как акселерометры и гироскопы, не получают события.
  • Датчики, которые используют переключатели или Однократные режимы отчетов не получают события.

Единственный способ предотвратить это - вручную установить ведро на «активный»:

adb shell am set-standby-bucket packagename active|working_set|frequent|rare

Источник: Проверка проблем с питанием , а также UsageStatsManager .

...