如何使用活动识别来检测步行/跑步与on_foot

时间:2014-07-17 23:44:33

标签: android google-play-services activity-recognition

在Google Play服务活动识别中有

DetectedActivity.RUNNING,
DetectedActivity.WALKING,
DetectedActivity.ON_FOOT

当我得到行走或跑步的活动更新时,我得到了 ON_FOOT

我该如何区分?

我知道它说RUNNING和WALKING:"这是ON_FOOT"

的子活动

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

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

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

假设,

列出probableActivities = [activity1,activity2],

其中:

activity1 =“行走”,置信度为75%

activity2 =“正在运行”5%的信心。

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

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

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

并且该方法将“running”作为活动类型重新运行,同时我们期望返回的活动是“行走”。

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

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

 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;
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

正如Sam所提到的,WALKINGRUNNING活动以secondary activities in a list (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;
}

我今天晚上测试了上面的代码,无论是走路还是跑步,它似乎做得相当不错。如果您未明确过滤RUNNINGWALKING,则可能会收到错误的结果。

相关问题