gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:41:26 27 4
gpt4 key购买 nike

我尝试从 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 秒后出现?或者有没有办法确保我在他们想要的运行中收到它们?

最佳答案

您的代码是正确的,而且我认为只有一个原因可能导致这种行为。它是android系统,为了避免耗尽电池,在应用程序进入后台或设备进入休眠状态后的一段时间内降低加速度计事件流的频率。您需要修改所有与轴测器相关的逻辑并根据 Doze and App Standby

您也可以尝试在前台服务中使用 axelerometer。

关于Android NDK 传感器奇怪报告间隔到事件队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53133451/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com