在Google Play服务活动识别中有
DetectedActivity.RUNNING,
DetectedActivity.WALKING,
DetectedActivity.ON_FOOT
当我得到行走或跑步的活动更新时,我得到了 ON_FOOT
我该如何区分?
我知道它说RUNNING和WALKING:"这是ON_FOOT"
的子活动感谢您的帮助。
答案 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所提到的,WALKING
和RUNNING
活动以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;
}
我今天晚上测试了上面的代码,无论是走路还是跑步,它似乎做得相当不错。如果您未明确过滤RUNNING
或WALKING
,则可能会收到错误的结果。