Android NDK传感器向事件队列报告奇怪的间隔

Android NDK Sensor strange report interval to event queue

本文关键字:报告 NDK 传感器 事件队列 Android      更新时间:2023-10-16

我尝试从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和应用程序待机

您也可以尝试在前台服务中使用湿度计。