android - 如何在后台服务中以非常低的采样率使用加速度计? (以节省电池)

标签 android android-sensors

我正在开发一个应用程序,我希望即使在屏幕关闭时也能持续监控加速度计传感器数据,但我也希望我的电池持续时间超过 5 小时:/最明显的当然是将采样率设置得很低。我尝试使用

使用 SENSOR_DELAY_NORMAL 和微秒值为 1000000(每秒一次)注册加速度计
senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
senSensorManager.registerListener(this, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);

但 Android 操作系统很快(在我摇动手机几秒钟后)决定覆盖这些建议的采样率并开始以大约 100/秒的速度向我的应用程序不间断地发送加速度计传感器事件,即使我关闭屏幕也是如此.不用说,这对电池生命周期不利。

我现在尝试的是一些 hack,我想知道是否有 1. 是否有更好的 Android 认可的方法,以及 2. 我所做的是否实际上不会按照我想要的方式工作。我目前的解决方案是在第一次读取后立即取消注册加速度计(从监听器回调中),记录取消注册的时间,然后有一个单独的计时器循环,在半秒后重新注册加速度计监听器。这似乎 可以工作,但我不知道它是否会在某些设备上引起问题,或者 registerListener 函数本身可能会耗尽某些设备上的电池电量?非常感谢任何其他人提出的非电池耗尽的永远在线的背景加速度计监听器的任何建议。谢谢。

编辑 2016 年 9 月 7 日: 只要我将采样速度降低到大约 0.5 或 1.0 秒,我上面描述的 hack 似乎确实有效并且似乎确实可以显着节省电池电量。如果我对这种技术有更多的经验,无论好坏,我都会告诉你们。 (如果重要的话,我正在 Android 5.1.1 的 Note 4 上对此进行测试)(还在上面添加了更多解释性代码)

最佳答案

你可能想看看这个项目是如何处理它的:

https://github.com/alanszlosek/androidstudio-accelerometer-gps/blob/master/app/src/main/java/com/alanszlosek/whenmoving/MainService.java

似乎是在使用警报来安排日志记录。采样频率更低的情况有点不同,所以我不确定哪种方法更有效。

您是否可以将您的记录器代码贴在 github 或其他地方?我正在尝试为一个赠款项目进行加速度计跟踪,但在让服务和唤醒锁很好地协同工作时遇到了问题。

关于android - 如何在后台服务中以非常低的采样率使用加速度计? (以节省电池),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38685254/

相关文章:

android - 检查 Sensor.TYPE_SIGNIFICANT_MOTION 是否受硬件支持

android - 为什么我不能通过在 getView() 中使用 LayoutInflater 让我的 BaseAdapter 工作?它不断返回空指针异常

android - Android native 录音机采样率

android - 使用 setOnMenuItemClickListener 时的空对象引用

android - 如何应用大比例风景图像

java - 使用扩展 Dialog 的类访问 Android 传感器

android - TYPE_ROTATION_VECTOR, TYPE_ORIENTATION 给出不同的结果,也有偏差

android - 将箭头指向用户面对的方向

android - android中的传感器 Activity

java - Android native 库: Runtime error when trying to load JNI native library