当前位置: 首页 > 知识库问答 >
问题:

活动识别API

胡野
2023-03-14

在最近的Google Play服务更新中,有人对活动识别API有问题吗?

我已经在一个应用程序中实现了它。在5.0更新之前,它工作得非常好。现在,当用户走路或坐着不动时,它会在车内返回:/

并且根本不返回WALINGRUNningON_FOOT

我应该知道的活动识别API是否有任何更改?

如果你需要更多的细节,请告诉我。

共有3个答案

卫财
2023-03-14

您可以尝试这个简单的“for循环”,以确保您的用户正在驾驶。

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

请记住,要让Google Play services确保您的用户正在执行某项任务,置信度必须大于75,只有这样您才能确保任务已执行。或者,您可以尝试一些免费SDK,如Tranql、Neura或ContextHub,它们可以让您更好地了解用户的活动和位置。

李俭
2023-03-14

主要的变化是ON_FOOT现在返回检测到的活动列表。现在改用getMostProbable活动()。

此解决方案在步行时可以行走或跑步获取检测到的活动列表,如下所示:

//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;

}

蔡理
2023-03-14

行走和跑步活动作为次要活动出现在列表中(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;
}

今天晚上我测试了上面的代码,包括步行和跑步,它看起来做得相当好。如果您不明确地只过滤RUNWALING,您可能会得到错误的结果。

下面是处理新活动结果的完整方法。我直接从示例应用程序中提取了这个,并且已经测试了几天,结果很好。

/**
 * 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";
    }
}
 类似资料:
  • 我正在制作一个应用程序,使用ActivityRecognition API跟踪用户在后台的活动,如果用户在指定的时间段(例如1小时)内保持在同一位置,则系统会推送通知,告诉用户散步。我已经实现了活动识别,但仅适用于打开应用程序的情况。显然,Google API客户端需要保持连接才能发送活动更新。我的问题是-对于后台活动跟踪,什么是更好的解决方案: 1)在主活动(或单独活动)中实现警报管理器,该活动

  • 我将使用google play services活动识别api编写一个应用程序。android开发者网站上的培训是直接进行的,但在过去的几个小时里,我编写了一个简单的应用程序,但没有得到任何结果。更新:实际上,我将在5秒钟的时间间隔内以toast消息的形式显示用户的当前活动(如ActivityRecognitionService-Intent服务中的OnIntentHandler方法所示)。我认为

  • 我试图在项目中使用活动识别来检测用户何时“在车内”。(驾驶)问题是几乎不可能使用它,因为大多数可能的活动经常报告“车内”,即使我已经在办公桌前坐了很长时间,或者只是在家里走来走去。很高兴知道API是如何得出这一结论的。 我认为这个功能有很大的潜力,但现在有些东西显然不起作用。 这是一份每30秒进行一次的最有可能的活动日志,以显示我的意思。坐在办公桌前,4分钟后,我把电话转了几次,结果是“最有可能的

  • 我正在开发android原生应用程序。我的要求是获取设备的当前活动,如运行,in_vehicle,静止等等。我使用Activity识别API并设置了通过IntentService接收活动更改的挂起意图。我给每个更新5秒的间隔。它未能在某段时间内提供活动更改并再次开始提供活动。之后我更喜欢Awareness SnapshotAPI来获取活动状态。它也是同样的结果,未能定期提供活动。两个API有时提供

  • 我有一个定义为singleTop的活动,因此只有一个实例存在。 我用一些数据设置了一个通知意图,并将其包含在Pending帐篷中,然后将其发送给通知管理器。 如果activivty未运行,则意图会按预期通过onCreate()启动活动。 如果活动正在运行,但处于停止状态/不在前台(如单击home按钮时),并且通知被单击,则按预期调用我的活动的onNewIntent()。 但是,如果活动在前台时已被

  • 我试图使用谷歌活动识别API,只在活动发生变化时或大约每30分钟(如果活动没有变化,则为10分钟或更长时间)获取结果。相反,当我调用下面的代码时,我经常在我的IntentService中获得活动识别结果,就像每分钟一样: 创建PendingContent对象的方法: 获取的方法: 我知道官方文件说: 如果另一个应用程序也以更快的速度请求活动更新,则接收活动的频率可能会高于detectionInte