如何使人类 Activity 识别在 Android 中不那么敏感

How to make Human Activity Recognition less sensitive in Android

我正在开发一个 Android 应用程序,它可以识别 activity 我们每 3 秒执行一次的用户(必须设计得如此频繁)(例如静态、步行、运行).我的数据库中有一个 Activity table 递增以下值:

private int activeTime;
private int longestInactivityInterval;
private int currentInactivityInterval;
private int averageInactInterval;

这些在片段中呈现。目前,非常"sensitive"。例如,如果用户是静止的(即躺在他们的床上)并且他们将他们的 phone 从口袋里拉出来,它将识别 activity 就像 "walking"。已识别活动的历史记录如下所示:

static
static
walking
static
static

如何确保这个附带的 "walking" 被识别为 activity 被识别为 "static"。有什么办法可以纠正吗?

这是正在执行 Activity 监控的 class(递增值取决于 activity 被识别的内容。

public class ActivityMonitor implements Observer, IActivityMonitor {
private User mUser;
private IActivityDataManager mDataManager;

public ActivityMonitor(IActivityDataManager dataManager) {
    mDataManager = dataManager;
}

@Override
public void update(Observable observable, Object activity) {
    monitorActivity(activity);
}

private void monitorActivity(Object activityClass) {

    switch ((int) activityClass) {
        case 0:
            //activity = "walking";
        case 1:
            //activity = "running";
        case 3:
            //activity = "cycling";
            mDataManager.incActiveTime();
            mDataManager.clearCurrentInacInterval();
            break;
        case 2:
            //activity = "static";
            mDataManager.incCurrentInacInterval();
            break;
    }

}

我自己找到了解决问题的方法。我正在使用 apache 的通用 CircularFifoQueue 并将大小设置为 2。

我的解决方案是这样的:

private void monitorActivity(Object activityClass) {
    int activityInt = (int) activityClass;
    correctionList.add(activityInt);
    int correctResult = applyCorrection(activityInt);

    if (correctResult == correctionList.size()) {
        mDataManager.incActiveTime();
        mDataManager.clearCurrentInacInterval();
    } else {
        mDataManager.incCurrentInacInterval();
    }


}


private int applyCorrection(int classInt) {
    int count = 0;
    for (int item : correctionList) {
        if (item == 0 || item == 1 || item == 3) {
            count++;
        }
    }

    return count;
}

基本上,它添加了 classInt,它可以是 (0,1,2 or 3) - walking = 0, 运行 = 1, cycling = 3 and static = 2. applyCorrection方法查看大小为 2 的队列(这起到了因子的作用,2 对我来说非常有用)并对整数进行计数和检查。如果返回的计数 correctResult 是 2,这意味着 activity 肯定是 ACTIVE (1,2,3) 而不是 STATIC (2)。