6

在 Google Play Services Activity Recognition 中有

DetectedActivity.RUNNING,
DetectedActivity.WALKING,
DetectedActivity.ON_FOOT

每当我获得步行或跑步的活动更新时,我都会得到 ON_FOOT

我该如何区分?

我知道它说 RUNNING 和 WALKING :“这是 ON_FOOT 的子活动”

谢谢你的帮助。

4

3 回答 3

6

emil10001 提供的walkingOrRunning () 方法有效,但是它无法以最高的置信度获得活动(跑步或步行),这是因为,他的for循环中第二个if子句的条件总是将活动的置信度与0。

为了澄清这一点,假设我们将一个大小为 2 的“probableActivities”列表作为参数传递给 walkOrRunning() 方法,即:我们调用 walkOrRunning(probableActivities)。

假如,

列出可能的活动 = [活动1,活动2],

在哪里:

activity1 = 以 75% 的置信度“行走”

活动2 =“运行”5% 的置信度。

简而言之,walkingOrRunning(probableActivities) 方法的执行如下:

1)在for循环的第一次迭代之后,myActivity = "walking"

2)在for循环的第二次迭代之后,myActivity = "running"

并且该方法返回“running”作为活动类型,同时我们期望返回的活动是“walking”。

总之,为了获得最高置信度的活动类型(步行/跑步),我将 walkOrRunning() 方法修改为以下

[仅供参考:我已经实现并测试了代码,它按预期工作,我欢迎任何反馈/评论/问题]。

 private DetectedActivity walkingOrRunning(List<DetectedActivity> probableActivities) {
    DetectedActivity myActivity = null;
    int confidence = 0;
    for (DetectedActivity activity : probableActivities) {
        if (activity.getType() != DetectedActivity.RUNNING && activity.getType() != DetectedActivity.WALKING)
            continue;

        if (activity.getConfidence() >= confidence) {
            confidence = activity.getConfidence();
            myActivity = activity;
        }
    }

    return myActivity;
}
于 2016-09-17T21:06:48.650 回答
3

正如 Sam 提到的,WALKINGandRUNNING活动作为列表 ( ActivityRecognitionResult.getProbableActivities())中的辅助活动出现,您需要将它们解析出来。

// Get the update
ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);

// Get the most probable activity from the list of activities in the update
DetectedActivity mostProbableActivity = result.getMostProbableActivity();

// Get the type of activity
int activityType = mostProbableActivity.getType();

if (activityType == DetectedActivity.ON_FOOT) {
    DetectedActivity betterActivity = walkingOrRunning(result.getProbableActivities());
    if (null != betterActivity)
        mostProbableActivity = betterActivity;
}

private DetectedActivity walkingOrRunning(List<DetectedActivity> probableActivities) {
    DetectedActivity myActivity = null;
    int confidence = 0;
    for (DetectedActivity activity : probableActivities) {
        if (activity.getType() != DetectedActivity.RUNNING && activity.getType() != DetectedActivity.WALKING)
            continue;

        if (activity.getConfidence() > confidence)
            myActivity = activity;
    }

    return myActivity;
}

今天晚上我测试了上面的代码,无论是走路还是跑步,它似乎都做得很好。如果您没有明确过滤仅RUNNINGor WALKING,您可能会得到错误的结果。

于 2014-07-23T03:41:33.627 回答
2

我观察到类似的行为。我的理论是,当您收到一个ActivityRecognitionResult对象时,它通常会包含几个可解析的DetectedActivity对象,每个对象都有一个由整数指定的置信度分数。在 的情况下WALKING,将至少有两个DetectedActivity对象 - 一个DetectedActivity对象ON_FOOT具有较高的置信水平,一个DetectedActivity对象WALKING具有较低或相等的置信水平。

在实践中,我想你经常会得到ON_FOOT+ WALKING||的一些排列。RUNNING,或者所有三个具有不同的置信度分数,ON_FOOT可能是最高的。

于 2014-07-21T14:24:17.403 回答