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

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

使用Ionic与Angular在Android设备上访问加速度计数据。当应用程序内部时,事件的频率为60 Hz,但当应用程序切换到后台时,前5分钟频率下降约9-10 Hz,并在仍然处于后台时的某个时间点返回到60 Hz,并保持不变。

我还使用了背景插件。

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

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

我还尝试了设备运动和陀螺仪的插件,但它们的行为相同。

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

1个回答

1

不清楚您使用的是哪个版本的Android,但是与系统作对通常没有什么用。猜测您可能已经尝试过旧版,因为自Android 9以来,当应用程序在后台运行时,采样率应该具有0Hz的频率。 这是由于具有“App Standby Buckets”的新power management,只有“活动”才不受限制。

请参见Android 9 behavior changes:

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

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

唯一的预防方法是手动将存储桶设置为“激活”状态:
adb shell am set-standby-bucket packagename active|working_set|frequent|rare

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


你好。我正在使用安卓9.1的华为P9智能手机进行测试。如果安卓9不允许在后台接收传感器事件,那么我很困惑为什么我仍然可以接收到这些事件。 - Daniel T.
@DanielT。那个被限制的采样率可能是华为特定的,但是原始ROM没有它。这不是人们可以想当然的事情。android.hardware.SensorManagerSENSOR_DELAY_NORMALSENSOR_DELAY_UISENSOR_DELAY_GAMESENSOR_DELAY_FASTEST的值,这至少可以解释不同的采样率...请参见第676行及其后面;它建议使用部分唤醒锁定-但在不处理onPauseonResume时会浪费电池。 - Martin Zeitler
那么在Android 9上即使在前台服务中也无法访问传感器数据吗?Ionic上的后台插件也使用了它。 - Daniel T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接