Intereting Posts
После нажатия кнопки «Домой» повторное запуск приложения показывает начальную активность не текущей Определение текущего приложения переднего плана из фоновой задачи или службы UI Automator в проекте с minSdkVersion 9 Android: отображение клавиатуры перемещает мои компоненты вверх, я хочу скрыть их Панель инструментов перекрывается ниже строки состояния Установить шрифт для всех текстовых элементов в действии? Как загрузить заголовок веб-страницы в Android WebView? Android Intent для отправки электронной почты с приложением Эта версия приложения не настроена для выставления счетов через Google Play KeyStore и ключевой псевдоним Android. Попробуйте отправить поддельные sms мне без использования мобильной сети. Как включить конфигурацию proguard в мою библиотеку Android (AAR) Android получает список активных аварийных сигналов Android HttpPost: как получить результат Android как разрешения в iOS

API распознавания активности

У кого-либо возникают проблемы с API-интерфейсом Activity Recognition в недавнем обновлении Google Play Services?

Я его реализовал в приложении. Он работал отлично до обновления 5.0. Теперь он возвращает IN_VEHICLE когда пользователь идет или сидит неподвижно. : /

И не возвращает WALKING , RUNNING или ON_FOOT .

Были ли какие-либо изменения в API распознавания активности, о которых я должен знать?

Дайте мне знать, если вам нужны подробности.

Solutions Collecting From Web of "API распознавания активности"

Действия 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 , вы, вероятно, получите ошибочные результаты.

Ниже приведен полный метод обработки новых результатов деятельности. Я вытащил это прямо из примера приложения и тестировал его на пару дней с хорошими результатами.

 /** * Called when a new activity detection update is available. */ @Override protected void onHandleIntent(Intent intent) { Log.d(TAG, "onHandleIntent"); // Get a handle to the repository mPrefs = getApplicationContext().getSharedPreferences( Constants.SHARED_PREFERENCES, Context.MODE_PRIVATE); // Get a date formatter, and catch errors in the returned timestamp try { mDateFormat = (SimpleDateFormat) DateFormat.getDateTimeInstance(); } catch (Exception e) { Log.e(TAG, getString(R.string.date_format_error)); } // Format the timestamp according to the pattern, then localize the pattern mDateFormat.applyPattern(DATE_FORMAT_PATTERN); mDateFormat.applyLocalizedPattern(mDateFormat.toLocalizedPattern()); // If the intent contains an update if (ActivityRecognitionResult.hasResult(intent)) { // Get the update ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent); // Log the update logActivityRecognitionResult(result); // Get the most probable activity from the list of activities in the update DetectedActivity mostProbableActivity = result.getMostProbableActivity(); // Get the confidence percentage for the most probable activity int confidence = mostProbableActivity.getConfidence(); // Get the type of activity int activityType = mostProbableActivity.getType(); mostProbableActivity.getVersionCode(); Log.d(TAG, "acitivty: " + getNameFromType(activityType)); if (confidence >= 50) { String mode = getNameFromType(activityType); if (activityType == DetectedActivity.ON_FOOT) { DetectedActivity betterActivity = walkingOrRunning(result.getProbableActivities()); if (null != betterActivity) mode = getNameFromType(betterActivity.getType()); } sendNotification(mode); } } } 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; } /** * Map detected activity types to strings * * @param activityType The detected activity type * @return A user-readable name for the type */ private String getNameFromType(int activityType) { switch (activityType) { case DetectedActivity.IN_VEHICLE: return "in_vehicle"; case DetectedActivity.ON_BICYCLE: return RIDE; case DetectedActivity.RUNNING: return RUN; case DetectedActivity.WALKING: return "walking"; case DetectedActivity.ON_FOOT: return "on_foot"; case DetectedActivity.STILL: return "still"; case DetectedActivity.TILTING: return "tilting"; default: return "unknown"; } } 

Основное изменение заключается в том, что ON_FOOT теперь возвращает список обнаруженных действий. Теперь используйте getMostProbableActivities ().

Это решение проходит или работает, когда ON_foot получает список обнаруженных действий, таких как:

 //Get the list from the result ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent); ArrayList<DetectedActivity> activityList = new ArrayList<DetectedActivity>(result.getProbableActivities()); //Get the most probable activity getMostProbableActivity(activityList); 

Теперь перейдите в свой список, чтобы найти наиболее вероятную операцию:

 private DetectedActivity getMostProbableActivity(List<DetectedActivity> detectedActivityList) { DetectedActivity result = null; //Find the most probably activity in the list for(DetectedActivity detectedActivity : detectedActivityList) { if(detectedActivity.getType() != DetectedActivity.ON_FOOT) { if(result == null) { result = detectedActivity; } else { if(result.getConfidence() < detectedActivity.getConfidence()) { result = detectedActivity; } } } } return result; 

}

Вы можете попробовать этот простой «цикл», чтобы быть уверенным, что ваш пользователь водит машину.

 for (DetectedActivity detectedActivity : detectedActivityList) { { if(DetectedActivity == “In_Vehicle” && result.getConfidence()> 75) { // output = User is Driving; // Perform task } } } 

Помните, что для служб Google Play убедитесь, что ваш пользователь выполняет определенную задачу, уровень доверия должен быть больше 75, только тогда вы можете быть уверены, что задача выполнена. Кроме того, вы можете попробовать некоторые из этих бесплатных SDK, таких как Tranql, Neura или ContextHub, которые могут дать вам более полное представление о действиях и местоположениях вашего пользователя.

У меня есть Google Play Services 5.0.84, он отлично работает с моим Nexus 5. Не знаю, о чем вы говорите, так что это, вероятно, ошибка в вашем коде.

Моя выборка приложений постоянно каждую минуту и ​​возвращает (большую часть времени) правильную активность. Движение / ходьба / наклон / foot .. все будет.

Кроме того, если вы не используете getMostProbableActivity , то вы должны использовать его! Комментарий: может быть, действительно, что на определенных устройствах или на некоторых прошивках поставщика все сломается, но это маловероятно.