2016-04-14 60 views
5

我试图在项目中使用活动识别来检测用户何时是“车内”(驾驶)问题在于它几乎不可能使用它,因为大多数ProbableActivity经常报告“车内”(In-VEHICLE)尽管我已经坐在办公桌上很长时间,或者只是在我家里走动。知道API如何得出这个结论将是非常好的。活动识别API不可靠?

我认为这个功能有很大的潜力,但是现在有些东西显然不起作用。

这是每30秒拍摄一次MostProbableActivity的日志,以显示我的意思。坐在我的办公桌前,4分钟后,我打开手机几次,这导致“最可能的车内”结果。

我试过不同的手机,结果是一样的。所以我不认为它与硬件有关。

DetectedActivity [type=STILL, confidence=43] 
DetectedActivity [type=STILL, confidence=54] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=69] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=92] 
DetectedActivity [type=TILTING, confidence=100] 
DetectedActivity [type=IN_VEHICLE, confidence=49] 
DetectedActivity [type=TILTING, confidence=100] 
DetectedActivity [type=STILL, confidence=51] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=85] 
DetectedActivity [type=STILL, confidence=100] 
DetectedActivity [type=STILL, confidence=66] 
DetectedActivity [type=STILL, confidence=100] 

这是代码,没有什么特别的有:

public class ActivitiesIntentService extends IntentService { 


    private static final String TAG = "ActivitiesIntentService"; 


    public ActivitiesIntentService() { 
     super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent); 
     Intent i = new Intent(Constants.STRING_ACTION); 


     DetectedActivity mostProbableActivity = result.getMostProbableActivity(); 


     i.putExtra("MOST_PROBABLE_ACTIVITY",mostProbableActivity); 



     LocalBroadcastManager.getInstance(this).sendBroadcast(i); 


     Log.e(TAG, String.valueOf(mostProbableActivity)); 
     } 

} 

从这个链接:

Activity Recognition API

我可以看到其他人有类似的经历,但有些说法,它行得通。

我认为这是API的置信算法中的一个错误。应该很容易得出这样的结论:手机没有朝任何方向移动,也没有在道路上显然不是“最可能的”。

任何人都可以证实这个问题,或者我用它错误的方式吗?

问候

托马斯

+0

您正在以正确的方式使用它。问题在于,如果没有对GPS进行采样并排空电池,将很难检测到驾驶活动。 Google可能会在某些时段追踪传感器数据(加速度计,陀螺仪,磁力计等),并寻找驾驶模式(这与静止但非常相似,但具有独特的振动)。有时候算法不够精确。 – MikeL

回答

3

请记住,这是一个非常低的能耗的服务,所以它不能在设备上的传感器不断地寻找。这会耗尽电池太快而无法使用。请确保read the docs了解约束条件。

如果您想要更准确的读数,请增加检测间隔。这将为其提供更多数据。

另外请记住,这些测量应广泛进行。一种可能的用例是估计设备的运营商从事物理活动的时间,或者在运营商正在执行其中一项检测到的活动时激活和停用应该运行的应用的组件。

1

如果您需要更准确的读数,您应该增加设备的检测水平,但这反过来最终会耗尽您的电池电量。 就您的结果回复而言,要确保您的用户正在执行某项活动,Google Play服务的信心必须> 75,否则假设您的用户没有执行此操作是安全的。就您的情况而言,Google Play服务的可信度为49,这意味着您无法确定您的用户是否在开车。 您也可以尝试用一个简单的“if语句”

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

以其他方式获得有关用户的活动和位置的更准确的见解,而无需你的电池耗尽,就是要尝试一些API的喜欢的TranQL的,上下文枢纽或Neura

+2

你是如何得出75%是一个好数字的结论的?有没有一些参考来支持你的建议? – Pranaysharma

+0

@Pranaysharma好问题。我发现一个教程提到这个75%,但我不知道他们如何选择这个数字:https://code.tutsplus.com/tutorials/how-to-recognize-user-activity-with-activity-recognition--cms-25851 – nbeuchat

+0

75%在此谷歌页面上显示的视频中提及 https://developers.google.com/location-context/activity-recognition/ –