【问题标题】:Accelerometer event frequency slows down first 5 min using Angular Ionic on Android device在 Android 设备上使用 Angular Ionic 加速计事件频率在前 5 分钟减慢
【发布时间】:2020-01-05 13:35:48
【问题描述】:

我正在使用

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() 添加到后台插件,但仍然没有成功。

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

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

【问题讨论】:

    标签: android angular ionic-framework ionic4 devicemotion


    【解决方案1】:

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

    查看Android 9 behavior changes

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

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

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

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

    来源:Test power-related issues,还有一个UsageStatsManager

    【讨论】:

    • 你好。我正在使用 Android 9.1 的华为 P9 Smart 上进行测试。如果 Android 9 不允许后台发生传感器事件,那么我很困惑为什么我仍然会收到这些事件。
    • @DanielT。受限制的采样率可能是华为供应商特定的,但库存 ROM 没有。这不是一件可以想当然的事情。 android.hardware.SensorManager 具有 SENSOR_DELAY_NORMALSENSOR_DELAY_UISENSOR_DELAY_GAMESENSOR_DELAY_FASTEST 的值,这至少可以解释不同的采样率...参见 676 行;它建议部分唤醒锁定 - 但不处理onPauseonResume时会浪费电池。
    • 所以即使在 Android 9 的前台服务中也无法访问传感器数据? Ionic 上的 Background 插件也使用了这个
    猜你喜欢
    • 2019-06-27
    • 2014-10-18
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    相关资源
    最近更新 更多