2016-04-14 4 views
5

Ich versuche, die Aktivitätserkennung in einem Projekt zu verwenden, um zu erkennen, wenn der Benutzer "IN-FAHRZEUG" ist. (Fahren) Das Problem ist, dass es fast unmöglich ist, es zu verwenden, da MostProbableActivity oft "IN-VEHICLE" meldet obwohl ich lange an meinem Schreibtisch gesessen habe oder einfach in meinem Haus herumgelaufen bin. Es wäre sehr schön zu wissen, wie die API das schließt.Aktivitätserkennungs-API unzuverlässig?

Ich denke, diese Funktion hat ein großes Potenzial, aber wie jetzt funktioniert etwas eindeutig nicht.

Dies ist ein Protokoll von MostProbableActivity alle 30 Sekunden genommen, um zu zeigen, was ich meine. An meinem Schreibtisch sitzend, schalte ich nach 4 Minuten das Telefon ein paar Mal um, und dies führt zu einem "mostProbable IN-VEHICLE" -Ergebnis.

Ich habe verschiedene Telefone ausprobiert und das Ergebnis ist das gleiche. Also ich glaube nicht, dass es Hardware betrifft.

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] 

Dies ist der Code, es gibt nichts Besonderes:

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)); 
     } 

} 

Von diesem Link:

Activity Recognition API

ich sehen kann, dass andere ähnliche Erfahrung haben, aber einige Behauptungen, dass es funktioniert OK.

Ich denke, das ist ein Fehler im Vertrauensalgorithmus der API. Es sollte leicht zu der Schlussfolgerung kommen, dass sich das Telefon in keiner Richtung bewegt, auch nicht auf einer Straße, die offensichtlich NICHT "am häufigsten" in einem FAHRZEUG ist.

Kann jemand dieses Problem bestätigen oder verwende ich es falsch?

Mit freundlichen Grüßen

Thomas

+0

Sie verwenden es auf die richtige Weise. Das Problem ist, dass es ohne das Abtasten der GPS und das Entleeren der Batterie sehr schwierig ist, die Fahraktivität zu erkennen. Wahrscheinlich verfolgt Google die Daten der Sensoren (Beschleunigungsmesser, Gyroskop, Magnetometer usw.) in bestimmten Zeiträumen und sucht nach einem Fahrmuster (das sehr ähnlich ist, aber eine einzigartige Vibration hat). Manchmal ist der Algorithmus einfach nicht präzise genug. – MikeL

Antwort

3

Beachten Sie, dass dies ein sehr niedrigen Energieverbrauch Service, so dass sie nicht ständig an den Gerätesensoren suchen können. Das würde die Batterie zu schnell entladen, um nützlich zu sein. Achte auf read the docs, um die Einschränkungen zu verstehen.

Wenn Sie genauere Messwerte wünschen, erhöhen Sie das Erkennungsintervall. Dadurch erhalten Sie mehr Daten, mit denen Sie arbeiten können.

Bedenken Sie auch, dass diese Messungen weit gefasst sind. Ein möglicher Anwendungsfall besteht darin, abzuschätzen, wie viel Zeit der Träger des Geräts mit körperlicher Aktivität verbracht hat, oder Komponenten einer App zu aktivieren und zu deaktivieren, die ausgeführt werden sollen, wenn der Träger eine der erkannten Aktivitäten ausführt.

1

Wenn Sie genauere Messwerte benötigen, sollten Sie den Erkennungslevel Ihres Geräts erhöhen, aber dies wiederum würde Ihre Batterie entladen. In Bezug auf die Antworten Ihrer Ergebnisse muss die Vertrauenswürdigkeit der Google Play-Dienste> 75 sein, um sicher sein zu können, dass Ihr Nutzer eine bestimmte Aktivität durchführt, oder es ist davon auszugehen, dass Ihr Nutzer sie nicht durchführt. In Ihrem Fall liegt das Vertrauen der Google Play-Dienste bei 49, was bedeutet, dass Sie nicht sicher sind, ob Ihr Nutzer Autofahrer ist. Sie auch ein einfaches ‚IF-Anweisung‘ versuchen könnte

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

Andere Möglichkeiten, um genauere Erkenntnisse über Ihre Benutzer-Aktivitäten und Standorte zu erhalten, ohne Ihre Batterie leer ist, ist einige der APIs wie tranql, Context Hub versuchen oder Neura

+2

Wie sind Sie zu dem Schluss gekommen, dass 75% eine gute Zahl sind? Gibt es einen Hinweis, um Ihren Vorschlag zu unterstützen? – Pranaysharma

+0

@Pranaysharma gute Frage. Ich habe ein Tutorial gefunden, in dem diese 75% erwähnt werden, aber ich weiß nicht, wie sie diese Nummer gewählt haben: https://code.tutsplus.com/tutorials/how-to-recovery-user-activity-with-activity- recognition--cms-25851 – nbeuchat

+0

75% wird in dem Video auf dieser Google-Seite erwähnt. https://developers.google.com/location-context/activity-recognition/ –