在最近的Google Play服务更新中,有人对活动识别API有问题吗?
我已经在一个应用程序中实现了它。在5.0更新之前,它工作得非常好。现在,当用户走路或坐着不动时,它会在车内返回:/
并且根本不返回WALING
、RUNning
或ON_FOOT
。
我应该知道的活动识别API是否有任何更改?
如果你需要更多的细节,请告诉我。
您可以尝试这个简单的“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,它们可以让您更好地了解用户的活动和位置。
主要的变化是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;
}
行走和跑步活动作为次要活动出现在列表中(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;
}
今天晚上我测试了上面的代码,包括步行和跑步,它看起来做得相当好。如果您不明确地只过滤RUN
或WALING
,您可能会得到错误的结果。
下面是处理新活动结果的完整方法。我直接从示例应用程序中提取了这个,并且已经测试了几天,结果很好。
/**
* 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