在 Android 设备上使用 Angular Ionic 加速计事件频率在前 5 分钟减慢

Dan*_* T. 6 android ionic-framework devicemotion angular ionic4

我在用

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

使用带有 Angular 的 Ionic 访问 Android 设备上的加速度计数据。在应用程序内部时,事件以 60 Hz 的频率运行,但当应用程序切换到后台时,频率在前 5 分钟内下降约 9-10 Hz,并且在某个时刻仍处于后台时,它会以 60 Hz 的频率返回并且无限期地保持这样。

我也在使用后台插件

this.backgroundMode.enable();
this.backgroundMode.on('activate').subscribe(() => {
  this.backgroundMode.disableWebViewOptimizations();
});
Run Code Online (Sandbox Code Playgroud)

我尝试将 disableBatteryOptimizations() 添加到具有 config.xml 中相应条件的后台插件,但仍然没有运气。

我还尝试了 Device Motion 和 Gyroscope 的插件,但它们的行为相同。

我应该如何防止频率变慢?有没有其他人遇到过这个问题?

Mar*_*ler 1

目前尚不清楚您使用的是哪个版本的 Android,但针对该系统的操作通常不会有任何结果。我猜您可能已经使用旧版本进行了测试,因为从 Android 9 开始,当应用程序处于后台时,采样率的频率应该为 0Hz。这是由于采用了“应用程序待机存储桶”的新电源管理,其中只有“活动”存储桶不受限制。

查看 Android 9行为变化

对后台传感器的有限访问 Android 9 限制了后台应用程序访问用户输入和传感器数据的能力。如果您的应用在运行 Android 9 的设备上后台运行,系统会对您的应用应用以下限制:

  • 您的应用无法访问麦克风或摄像头。
  • 使用连续报告模式的传感器(
    例如加速度计和陀螺仪)不会接收事件。
  • 使用变化或一次性报告模式的传感器不会接收事件。

防止这种情况的唯一方法是手动将存储桶设置为“活动”:

adb shell am set-standby-bucket packagename active|working_set|frequent|rare
Run Code Online (Sandbox Code Playgroud)

来源:测试与电源相关的问题,还有一个UsageStatsManager