Android NDK传感器向事件队列报告奇怪的间隔
Android NDK Sensor strange report interval to event queue
我尝试从NDK访问加速度计。到目前为止,它是有效的。但是事件写入事件队列的方式似乎有点奇怪。
请参阅以下代码:
ASensorManager* AcquireASensorManagerInstance(void) {
typedef ASensorManager *(*PF_GETINSTANCEFORPACKAGE)(const char *name);
void* androidHandle = dlopen("libandroid.so", RTLD_NOW);
PF_GETINSTANCEFORPACKAGE getInstanceForPackageFunc = (PF_GETINSTANCEFORPACKAGE) dlsym(androidHandle, "ASensorManager_getInstanceForPackage");
if (getInstanceForPackageFunc) {
return getInstanceForPackageFunc(kPackageName);
}
typedef ASensorManager *(*PF_GETINSTANCE)();
PF_GETINSTANCE getInstanceFunc = (PF_GETINSTANCE) dlsym(androidHandle, "ASensorManager_getInstance");
return getInstanceFunc();
}
void init() {
sensorManager = AcquireASensorManagerInstance();
accelerometer = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_ACCELEROMETER);
looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
accelerometerEventQueue = ASensorManager_createEventQueue(sensorManager, looper, LOOPER_ID_USER, NULL, NULL);
auto status = ASensorEventQueue_enableSensor(accelerometerEventQueue,
accelerometer);
status = ASensorEventQueue_setEventRate(accelerometerEventQueue,
accelerometer,
SENSOR_REFRESH_PERIOD_US);
}
这就是我初始化一切的方式。我的SENSOR_REFRESH_PERIOD_US为100.000,因此每秒刷新10次。现在我有了以下方法来接收事件队列中的事件。
vector<sensorEvent> update() {
ALooper_pollAll(0, NULL, NULL, NULL);
vector<sensorEvent> listEvents;
ASensorEvent event;
while (ASensorEventQueue_getEvents(accelerometerEventQueue, &event, 1) > 0) {
listEvents.push_back(sensorEvent{event.acceleration.x, event.acceleration.y, event.acceleration.z, (long long) event.timestamp});
}
return listEvents;
}
此时sensorEvent
是我使用的自定义结构。这个update
方法每10秒从IntentService
通过JNI从Android调用一次(以确保即使应用程序本身被杀死也能运行(。现在我希望收到100个值(每秒10个*10秒(。在不同的测试中,我收到了大约130个,这对我来说也很好,即使它有点偏离。然后我在ASensorEventQueue_setEventRate
的文档中读到,它不必遵循给定的刷新周期。所以,如果我能得到比我想要的更多的东西,那就完全没问题了。
但现在的问题是:有时我在10秒内收到13个值,当我在10秒后继续调用update
时,我会得到130个值+之前运行中缺少的117个值。这种情况完全随机发生,有时不是下一次跑步,而是第四次跑步或类似的事情。
我完全可以通过拥有更多的值来摆脱刷新期。但是,有人能解释为什么会有这么多值丢失,并在10秒后的下一次运行中出现吗?或者有没有办法确保我在他们想要的跑步中收到他们?
您的代码是正确的,正如我所看到的,导致这种行为的原因只有一个。它是安卓系统,为了避免耗尽电池,在应用程序进入后台或设备入睡后的一段时间内降低加速度计事件流的频率。您需要修改所有与湿度计相关的逻辑,并根据Doze和应用程序待机
您也可以尝试在前台服务中使用湿度计。
相关文章:
- 如何使用ndk-build.cmd构建Android.so文件
- Android NDK传感器向事件队列报告奇怪的间隔
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 使用std::source_location报告错误的最佳实践
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 当用户超过按钮点击限制时报告
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么cudaMemGetInfo报告设备内存总量的变化
- Android NDK 编译 LAME HAVE_MPGLIB > 'interface.h' 文件未找到
- NDK:如何通过ndkr15c包含"RefBase.h"?
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 内存清理程序报告全局对象构造中未初始化值的使用
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- QDataStream 读取和写入的字节数比 QFile::length() 报告要多
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- Android NDK 未定义对ASensorEventQueue_registerSensor的引用
- 如何将 libjpeg-turbo Android NDK 添加为静态库
- 在使用ndk的android上,运行时间报告为0ns