Подтвердить что ты не робот

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

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

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

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

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

Сообщите мне, если вам нужны подробности.

4b9b3361

Ответ 1

Действия 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";
    }
}

Ответ 2

Основное изменение заключается в том, что 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;

}

Ответ 3

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

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

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

Ответ 4

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

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

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