Hoe gebruikersactiviteit te herkennen met Activity Recognition

Een applicatie contextbewust maken is een van de beste manieren om gebruikers nuttige diensten aan te bieden. Er zijn een paar manieren om dit te doen, inclusief het bouwen van applicaties die geofences en andere locatieservices gebruiken. Dit artikel is gericht op het gebruik van de Google Play-services Activiteitsherkenning API om te bepalen of de gebruiker actief is, loopt, in een voertuig, fietsen of stil blijft.

Als u weet welke activiteit de gebruiker uitvoert, kunt u de toepassingservaring aanpassen, bijvoorbeeld door te vragen of de gebruiker begint met trainen, zodat u deze kunt bijhouden met Google Fit of om te voorkomen dat meldingen worden verzonden wanneer de gebruiker aan het rijden is. . De bronbestanden voor deze tutorial zijn te vinden op GitHub.

1. Projectinstelling

Het eerste dat u hoeft te doen, is een nieuwe Android-applicatie maken. Voor deze voorbeeldtoepassing heb ik de minimum SDK ingesteld op 14 en maakte een standaard leeg Activiteit. Nadat Android Studio de basistoepassing heeft gemaakt, opent u de build.gradle bestand, en importeer Play Services (versie 8.4 is de laatste op het moment van schrijven) onder de afhankelijkheden knooppunt.

compileren 'com.google.android.gms: afspeelservices: 8.4.0'

Maak vervolgens een nieuwe klas, noem deze ActivityRecognizedService, en laat het uitbreiden IntentService. Wanneer Google Play Services de activiteit van de gebruiker retourneert, wordt deze hier naartoe verzonden IntentService. Hiermee kunt u uw applicatielogica op de achtergrond uitvoeren terwijl de gebruiker zijn dag doorloopt.

public class ActivityRecognizedService breidt IntentService uit public ActivityRecognizedService () super ("ActivityRecognizedService");  public ActivityRecognizedService (String name) super (name);  @Override protected void onHandleIntent (Intent opzet) 

Om het instellen te voltooien, opent u AndroidManifest.xml. U moet verklaren ActivityRecognizedService en neem de com.google.android.gms.permission.ACTIVITY_RECOGNITION toestemming voor uw aanvraag.

            

Nu u de basisstructuur van uw aanvraag hebt voltooid, kunt u doorgaan naar de volgende stap om verbinding te maken met Google Play-services en activiteitsgegevens op te vragen.

2. Verzoek om erkenning van activiteiten

Als u Google Play-services wilt gebruiken, moet u eerst verbinding maken met deze services. Begin met openen MainActivity.java en implementeer de ConnectionCallbacks en OnConnectionFailedListener interfaces. U moet ook een lidvariabele van het type maken GoogleApiClient om een ​​verwijzing naar de API-client te behouden.

public class MainActivity breidt AppCompatActivity implementeert GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener public GoogleApiClient mApiClient; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main);  @Override public void onConnected (@Nullable Bundle-bundel)  @Override public void onConnectionSuspended (int i)  @Override openbare ongeldig onConnectionFailed (@NonNull ConnectionResult connectionResult) 

Na het implementeren van de vereiste interfaces voor de GoogleApiClient, u kunt de client initialiseren en verbinding maken met Google Play-services in onCreate () door het ActivityRecognition.API en associeer je luisteraars met de GoogleApiClient aanleg.

@Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); mApiClient = new GoogleApiClient.Builder (this) .addApi (ActivityRecognition.API) .addConnectionCallbacks (this) .addOnConnectionFailedListener (this) .build (); mApiClient.connect (); 

Zodra de GoogleApiClient instantie heeft verbinding gemaakt, onConnected () wordt genoemd. Wanneer dit gebeurt, moet u een PendingIntent dat gaat naar de IntentService je hebt eerder gemaakt en geeft deze door aan de ActivityRecognitionApi. U moet ook een interval instellen voor hoe vaak de API de activiteit van de gebruiker moet controleren. Voor deze voorbeeldtoepassing gebruiken we een waarde van 3000, of drie seconden, hoewel u in een echte toepassing wellicht minder vaak wilt controleren op energiebesparing.

@Override public void onConnected (@Nullable Bundle-bundel) Intent intent = new Intent (this, ActivityRecognizedService.class); PendingIntent pendingIntent = PendingIntent.getService (this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates (mApiClient, 3000, pendingIntent); 

Op dit punt moet uw toepassing proberen de activiteit van de gebruiker om de drie seconden te herkennen en die gegevens naar ActivityRecognizedService.

3. Herkennen van activiteitsherkenning

In de onHandleIntent () methode van ActivityRecognizedService, het eerste dat je doet is valideren dat de ontvangen voornemen bevat activiteitsherkenningsgegevens. Als dit het geval is, kunt u de ActivityRecognitionResult van de voornemen om te zien welke activiteiten uw gebruiker zou kunnen uitvoeren. U kunt een lijst met mogelijke activiteiten opvragen door te bellen getProbableActivities () op de ActivityRecognitionResult voorwerp.

@Override beschermde leegte onHandleIntent (Intent opzet) if (ActivityRecognitionResult.hasResult (intent)) ActivityRecognition Resultaatresultaat = ActivityRecognitionResult.extractResult (opzet); handleDetectedActivities (result.getProbableActivities ()); 

Voor deze voorbeeldtoepassing meldt u eenvoudig elke activiteit die is gedetecteerd en geeft u aan hoe betrouwbaar Google Play-services is dat de gebruiker die activiteit uitvoert door te bellen getConfidence () op een DetectedActivity aanleg. Als een vertrouwen 75 of hoger is, is het veilig om aan te nemen dat de gebruiker die activiteit uitvoert. Om dit aan te tonen, geeft u ook een melding weer wanneer uw app detecteert dat de gebruiker met een hoog zelfvertrouwen loopt.

privé ongeldige handlectectedActivities (lijst probableActivities) for (DetectedActivity activity: probableActivities) switch (activity.getType ()) case DetectedActivity.IN_VEHICLE: Log.e ("ActivityRecogition", "In Vehicle:" + activity.getConfidence ()); breken;  case DetectedActivity.ON_BICYCLE: Log.e ("ActivityRecogition", "On Bicycle:" + activity.getConfidence ()); breken;  case DetectedActivity.ON_FOOT: Log.e ("ActivityRecogition", "Te voet:" + activity.getConfidence ()); breken;  case DetectedActivity.RUNNING: Log.e ("ActivityRecogition", "Running:" + activity.getConfidence ()); breken;  case DetectedActivity.STILL: Log.e ("ActivityRecogition", "Still:" + activity.getConfidence ()); breken;  case DetectedActivity.TILTING: Log.e ("ActivityRecogition", "Tilting:" + activity.getConfidence ()); breken;  case DetectedActivity.WALKING: Log.e ("ActivityRecogition", "Walking:" + activity.getConfidence ()); if (activity.getConfidence ()> = 75) NotificationCompat.Builder builder = new NotificationCompat.Builder (this); builder.setContentText ("Are you walking?"); builder.setSmallIcon (R.mipmap.ic_launcher); builder.setContentTitle (getString (R.string.app_name)); NotificationManagerCompat.from (this) .notify (0, builder.build ());  pauze;  case DetectedActivity.UNKNOWN: Log.e ("ActivityRecogition", "Unknown:" + activity.getConfidence ()); breken; 

Als u deze toepassing uitvoert, een run uitvoert en vervolgens uw apparaat op uw computer aansluit, ziet u een logboek dat lijkt op het volgende in uw ontwikkelaarsconsole.

E / ActivityRecogition: te voet: 92 E / ActivityRecogition: Running: 87 E / ActivityRecogition: On Bicycle: 8 E / ActivityRecogition: Walking: 5

Als u gaat wandelen, ontvangt u een melding met de vraag of u op stap bent. Als u een oefeningsapplicatie heeft, zou dit de perfecte gelegenheid zijn om uw gebruiker een actie te bieden waarmee zij hun oefeningen kunnen volgen..

Conclusie

Met Google Play-services is het zeer eenvoudig om de huidige activiteit van de gebruiker te bepalen. Dit kan ongelooflijk waardevol zijn om uw toepassingen context-bewust en nuttig te maken voor uw gebruikers, wat geweldig is voor alle betrokkenen. Met slechts een paar regels code kunt u uw toepassingen ook slimmer maken.