6

我在用

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)
  }
}

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

我也在使用后台插件

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

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

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

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

4

1 回答 1

1

目前尚不清楚您使用的是哪个版本的 Android,但针对该系统工作通常无济于事。猜猜你可能已经用旧版本测试过,因为从 Android 9 开始,当应用程序在后台时,采样率的频率应该是 0Hz。这是由于“App Standby Buckets”的新电源管理,其中只有“活动”的没有限制。

查看 Android 9行为变化

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

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

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

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

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

于 2020-01-08T17:04:52.497 回答