在 Google Play Services Activity Recognition 中有
DetectedActivity.RUNNING,
DetectedActivity.WALKING,
DetectedActivity.ON_FOOT
每当我获得步行或跑步的活动更新时,我都会得到 ON_FOOT
我该如何区分?
我知道它说 RUNNING 和 WALKING :“这是 ON_FOOT 的子活动”
谢谢你的帮助。
在 Google Play Services Activity Recognition 中有
DetectedActivity.RUNNING,
DetectedActivity.WALKING,
DetectedActivity.ON_FOOT
每当我获得步行或跑步的活动更新时,我都会得到 ON_FOOT
我该如何区分?
我知道它说 RUNNING 和 WALKING :“这是 ON_FOOT 的子活动”
谢谢你的帮助。
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;
}
正如 Sam 提到的,WALKING
andRUNNING
活动作为列表 ( 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
or WALKING
,您可能会得到错误的结果。
我观察到类似的行为。我的理论是,当您收到一个ActivityRecognitionResult
对象时,它通常会包含几个可解析的DetectedActivity
对象,每个对象都有一个由整数指定的置信度分数。在 的情况下WALKING
,将至少有两个DetectedActivity
对象 - 一个DetectedActivity
对象ON_FOOT
具有较高的置信水平,一个DetectedActivity
对象WALKING
具有较低或相等的置信水平。
在实践中,我想你经常会得到ON_FOOT
+ WALKING
||的一些排列。RUNNING
,或者所有三个具有不同的置信度分数,ON_FOOT
可能是最高的。