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



我正在开发一款应用程序,即使在屏幕关闭的情况下,我也希望它能持续监测加速度计传感器数据,但我也希望我的电池续航时间超过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);

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

我现在尝试的是一个小技巧,我想知道是不是1。有一种更好的、安卓系统认可的方法可以做到这一点。如果我所做的并没有按我希望的方式工作。我目前的解决方案是在第一次读取后立即注销加速度计(从侦听器回调中),记录注销的时间,然后有一个单独的定时器循环,在半秒后重新注册加速度计侦听器。这个似乎有效,但我不知道它是否会在某些设备上引起问题,或者registerListener函数本身会耗尽某些设备的电池?如果有人提出任何建议,让一个不消耗电池的始终在后台的加速度计听众,我们将不胜感激。谢谢

2016年7月9日编辑:我上面描述的破解似乎确实有效,并且似乎确实显著节省了电池,只要我将采样速度降低到0.5或1.0秒左右。如果我对这项技术还有任何经验,无论好坏,我都会告诉你们的。(如果重要的话,我正在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或其他地方吗?我正试图为一个拨款项目做加速度计跟踪,但很难让服务和唤醒锁一起发挥作用。

最新更新