Slik gjenkjenner du brukeraktivitet med aktivitetsgjenkjenning

Å lage en kontekstbevisst applikasjon er en av de beste måtene å tilby nyttige tjenester til brukerne. Det er noen måter å gjøre dette på, inkludert bygningsapplikasjoner som bruker geofences og andre plasseringstjenester. Denne artikkelen fokuserer på å bruke Google Play-tjenestene Aktivitetsgjenkjenning API for å avgjøre om brukeren kjører, går, i et kjøretøy, sykler eller gjenstår.

Å vite hvilken aktivitet brukeren utfører kan tillate deg å imøtekomme programopplevelsen, for eksempel ved å spørre om brukeren begynner å trene, slik at du kan holde styr på det med Google Fit, eller forhindre at varsler sendes når brukeren kjører . Kildefilene for denne opplæringen finner du på GitHub.

1. Prosjektoppsett

Det første du må gjøre er å opprette et nytt Android-program. For denne prøveapplikasjonen angir jeg minimum SDK til 14 og opprettet en standard tom Aktivitet. Når Android Studio har opprettet baseprogrammet, åpner du build.gradle fil, og importer Play Services (versjon 8.4 er det siste ved skrivingstidspunktet) under avhengig node.

kompilere 'com.google.android.gms: play-services: 8.4.0'

Deretter oppretter du en ny klasse, nevner den ActivityRecognizedService, og få det til å strekke seg IntentService. Når Google Play Services returnerer brukerens aktivitet, blir den sendt til dette IntentService. Dette vil tillate deg å utføre din programlogikk i bakgrunnen som brukeren går om dagen.

offentlig klasse ActivityRecognizedService utvider IntentService public ActivityRecognizedService () super ("ActivityRecognizedService");  offentlig aktivitetRecognizedService (Strenge navn) super (navn);  @Override protected void onHandleIntent (Intent Intent) 

For å fullføre oppsettet, åpne AndroidManifest.xml. Du må deklarere ActivityRecognizedService og inkludere com.google.android.gms.permission.ACTIVITY_RECOGNITION Tillatelse til søknaden din.

            

Nå som du har grunnstrukturen til søknaden din fullført, kan du flytte til neste trinn for tilkobling til Google Play-tjenester og be om aktivitetsdata.

2. Be om aktivitetsgodkjenning

For å kunne bruke Google Play Services må du først koble til dem. Begynn med å åpne MainActivity.java og implementere ConnectionCallbacks og OnConnectionFailedListener grensesnitt. Du må også opprette en medlemsvariabel av typen GoogleApiClient for å holde en referanse til API-klienten.

offentlig klasse MainActivity utvider AppCompatActivity implementerer GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener offentlig GoogleApiClient mApiClient; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main);  @Override public void onConnected (@Nullable Bundle Bundle)  @Override public void onConnectionSuspended (int i)  @Overtrid offentlig tomgang onConnectionFailed (@NonNull ConnectionResult connectionResult) 

Etter å ha implementert de nødvendige grensesnittene for GoogleApiClient, Du kan initialisere klienten og koble deg til Google Play Services i onCreate () ved å be om ActivityRecognition.API og assosiere dine lyttere med GoogleApiClient forekomst.

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

Først når GoogleApiClient eksempel har koblet til, onConnected () er kalt. Når dette skjer, må du opprette en PendingIntent som går til IntentService Du opprettet tidligere, og sender den til ActivityRecognitionApi. Du må også angi et intervall for hvor ofte API-en skal sjekke brukerens aktivitet. For denne prøveapplikasjonen bruker vi en verdi på 3000, eller tre sekunder, men i en faktisk applikasjon vil du kanskje sjekke sjeldnere for å spare strøm.

@Override public void onConnected (@Nullable Bundle Bundle) Intent Intent = Ny Intent (dette, ActivityRecognizedService.class); PendingIntent pendingIntent = PendingIntent.getService (dette, 0, hensikt, PendingIntent.FLAG_UPDATE_CURRENT); ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates (mApiClient, 3000, pendingIntent); 

På dette tidspunktet bør søknaden din prøve å gjenkjenne brukerens aktivitet hvert tredje sekund og sende dataene til ActivityRecognizedService.

3. Håndtering av aktivitetsgjenkjenning

I onHandleIntent () Metode av ActivityRecognizedService, Det første du gjør er å validere den mottatte Intent inneholder aktivitetsgjenkjenningsdata. Hvis det gjør det, kan du trekke ut ActivityRecognitionResult fra Intent for å se hvilke aktiviteter brukeren din kan utføre. Du kan hente en liste over mulige aktiviteter ved å ringe getProbableActivities ()ActivityRecognitionResult gjenstand.

@Override protected void onHandleIntent (Intent intention) hvis (ActivityRecognitionResult.hasResult (intent)) ActivityRecognitionResult result = ActivityRecognitionResult.extractResult (intent); håndtereDetectedActivities (result.getProbableActivities ()); 

For denne prøveapplikasjonen logger du bare på hver aktivitet som har blitt oppdaget, og viser hvor sikker Google Play Services er at brukeren utfører den aktiviteten ved å ringe getConfidence () på en DetectedActivity forekomst. Hvis en tillit er 75 eller høyere, er det trygt å anta at brukeren utfører den aktiviteten. For å demonstrere dette, viser du også et varsel når appen oppdager at brukeren går med stor tillit.

privat ugyldig håndtakDetectedActivities (Liste probableActivities) for (DetectedActivity aktivitet: probableActivities) switch (activity.getType ()) case DetectedActivity.IN_VEHICLE: Log.e ("ActivityRecogition", "In Vehicle:" + activity.getConfidence ()); gå i stykker;  tilfelle DetectedActivity.ON_BICYCLE: Log.e ("ActivityRecogition", "On Bicycle:" + activity.getConfidence ()); gå i stykker;  tilfelle DetectedActivity.ON_FOOT: Log.e ("ActivityRecogition", "On Foot:" + activity.getConfidence ()); gå i stykker;  tilfelle DetectedActivity.RUNNING: Log.e ("ActivityRecogition", "Running:" + activity.getConfidence ()); gå i stykker;  tilfelle DetectedActivity.STILL: Log.e ("ActivityRecogition", "Still:" + activity.getConfidence ()); gå i stykker;  tilfelle DetectedActivity.TILTING: Log.e ("ActivityRecogition", "Tilting:" + activity.getConfidence ()); gå i stykker;  tilfelle DetectedActivity.WALKING: Log.e ("ActivityRecogition", "Walking:" + activity.getConfidence ()); hvis (activity.getConfidence ()> = 75) NotificationCompat.Builder builder = ny NotificationCompat.Builder (dette); builder.setContentText ("går du?"); builder.setSmallIcon (R.mipmap.ic_launcher); builder.setContentTitle (getString (R.string.app_name)); NotificationManagerCompat.from (this) .notify (0, builder.build ());  gå i stykker;  tilfelle DetectedActivity.UNKNOWN: Log.e ("ActivityRecogition", "Unknown:" + activity.getConfidence ()); gå i stykker; 

Hvis du kjører dette programmet, kan du kjøre, og deretter koble enheten til datamaskinen din, bør du se en logg som ligner på følgende i utviklingskonsollen.

E / ActivityRecogition: På foten: 92 E / ActivityRecogition: Running: 87 E / ActivityRecogition: På sykkel: 8 E / ActivityRecogition: Walking: 5

Hvis du går en tur, bør du motta et varsel som spør om du er på tur. Hvis du har en treningsapplikasjon, vil dette være den perfekte muligheten til å gi brukeren en tiltak som gjør at de kan begynne å holde øye med treningen deres.

Konklusjon

Google Play Services gjør det veldig enkelt å bestemme brukerens nåværende aktivitet. Dette kan være utrolig verdifullt for å gjøre programmene dine kontekstbevisste og nyttige for brukerne, noe som er bra for alle involverte. Med bare noen få linjer med kode kan du også gjøre applikasjonene dine smartere.