Как использовать распознавание активности для обнаружения хождения / бега против on_foot

При распознавании активности в Google Play

DetectedActivity.RUNNING, DetectedActivity.WALKING, DetectedActivity.ON_FOOT 

Когда когда-либо я получаю обновление активности для хождения или бега, я получаю ON_FOOT

Как мне дифференцироваться?

Я знаю, что это говорит о том, что RUNNING и WALKING: «Это под-активность ON_FOOT»

Спасибо за вашу помощь.

Я наблюдал подобное поведение. Моя теория заключается в том, что когда вы получаете объект ActivityRecognitionResult , он часто содержит несколько анализируемых объектов DetectedActivity каждый из которых имеет доверительный балл, заданный целым числом. В случае WALKING будет существовать как минимум два объекта DetectedActivity – один объект DetectedActivity для ON_FOOT с более высоким уровнем достоверности и один объект DetectedActivity для WALKING с более низким или равным доверительным уровнем.

На практике я предполагаю, что вы часто получите некоторую перестановку ON_FOOT + ON_FOOT || RUNNING или все три с разными значениями доверия, причем ON_FOOT вероятно, является самым высоким.

Метод walkOrRunning (), предоставляемый emil10001, работает, однако он не сможет с максимальной уверенностью получить активность (бег или ходьбу), потому что условие второго предложения if в его цикле for всегда сравнивает доверие активности к 0.

Чтобы прояснить это, допустим, что мы передаем List of size 2 "probableActivities" в качестве аргумента метода walkOrRunning (), то есть: мы вызываем walkOrRunning (вероятные действия).

Предположив,

List probableActivities = [activity1, activity2],

где:

Activity1 = «ходьба» с доверием 75%

Activity2 = «работает» 5% доверия.

Короче говоря, изгиб метода walkOrRunning (вероятные действия) выглядит следующим образом:

1) После 1-й итерации цикла for myActivity = "ходьба"

2) После 2-й итерации цикла for myActivity = "running"

И метод возвращает «работает» как тип активности, а мы ожидаем, что возвращаемая активность будет «ходячей».

В целом, чтобы получить максимальный уровень активности (ходьба / работа), я изменил метод walkOrRunning () на следующий

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

Как сказал Сэм, действия WALKING и RUNNING входят в качестве второстепенных действий в списке ( 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 , вы, вероятно, получите ошибочные результаты.