Hur man känner igen användaraktivitet med aktivitetsigenkänning

Att göra ett programkontext medveten är ett av de bästa sätten att erbjuda användbara tjänster till dina användare. Det finns några sätt att göra detta, inklusive byggprogram som använder geofences och andra platstjänster. Den här artikeln fokuserar på att använda Google Play-tjänsterna Aktivitetsigenkänning API för att avgöra om användaren kör, går, i ett fordon, cyklar eller kvarstår.

Att veta vilken aktivitet användaren utför kan låta dig tillgodose programupplevelsen, till exempel genom att fråga om användaren börjar träna så att du kan hålla reda på det med Google Fit eller förhindra att meddelanden skickas när användaren kör . Källfilerna för denna handledning finns på GitHub.

1. Projektinställningar

Det första du behöver göra är att skapa en ny Android-applikation. För denna provansökan ställer jag in minsta SDK till 14 och skapade en standard tom Aktivitet. När Android Studio har skapat basprogrammet öppnar du build.gradle fil och importera Play Services (version 8.4 är senast vid skrivets gång) under beroenden nod.

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

Skapa sedan en ny klass, namnge den ActivityRecognizedService, och få det att förlängas IntentService. När Google Play Services returnerar användarens aktivitet skickas den till det här IntentService. Detta gör att du kan utföra din programlogik i bakgrunden som användaren går om sin dag.

public class ActivityRecognizedService utökar IntentService public ActivityRecognizedService () super ("ActivityRecognizedService");  public ActivityRecognizedService (strängnamn) super (namn);  @Override protected void onHandleIntent (Intent Intent) 

För att avsluta installationen, öppna AndroidManifest.xml. Du måste förklara ActivityRecognizedService och inkludera com.google.android.gms.permission.ACTIVITY_RECOGNITION tillstånd för din ansökan.

            

Nu när du har grundstrukturen för din ansökan klar kan du gå vidare till nästa steg för anslutning till Google Play Services och begära aktivitetsdata.

2. Begär aktivitetsigenkänning

För att kunna använda Google Play Services måste du först ansluta till dem. Börja med att öppna MainActivity.java och implementera ConnectionCallbacks och OnConnectionFailedListener gränssnitt. Du måste också skapa en medlemsvariabel av typen GoogleApiClient att hålla en hänvisning till API-klienten.

public class MainActivity utökar AppCompatActivity implementerar 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 Bundle)  @Override public void onConnectionSuspended (int i)  @Override public void onConnectionFailed (@NonNull ConnectionResult connectionResult) 

Efter att ha genomfört de nödvändiga gränssnitten för GoogleApiClient, du kan initiera klienten och ansluta till Google Play Services i onCreate () genom att begära ActivityRecognition.API och associera dina lyssnare med GoogleApiClient exempel.

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

När GoogleApiClient exemplet har anslutit sig, onConnected () kallas. När det händer måste du skapa en PendingIntent som går till IntentService du skapade tidigare och skickar den till ActivityRecognitionApi. Du måste också ange ett intervall för hur ofta API ska kontrollera användarens aktivitet. För denna provansökan använder vi ett värde av 3000, eller tre sekunder, men i en faktisk applikation kanske du vill kolla mindre ofta för att spara ström.

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

Vid denna tidpunkt bör din ansökan försöka igenkänna användarens aktivitet var tredje sekund och skicka den till ActivityRecognizedService.

3. Hantering av aktivitetsigenkänning

I onHandleIntent () metod av ActivityRecognizedService, Det första du gör är att validera den mottagna Avsikt innehåller aktivitetsigenkänningsdata. Om det gör kan du extrahera ActivityRecognitionResult från Avsikt för att se vilka aktiviteter din användare kan utföra. Du kan hämta en lista över möjliga aktiviteter genom att ringa getProbableActivities ()ActivityRecognitionResult objekt.

@Override protected void onHandleIntent (Intent intention) om (ActivityRecognitionResult.hasResult (intention)) ActivityRecognitionResult result = ActivityRecognitionResult.extractResult (intention); hanteraDetectedActivities (result.getProbableActivities ()); 

För den här proverapplikationen loggar du helt enkelt varje aktivitet som har upptäckts och visar hur säker Google Play Services är att användaren utför den aktiviteten genom att ringa getConfidence () på en DetectedActivity exempel. Om ett förtroende är 75 eller högre, är det säkert att anta att användaren utför den aktiviteten. För att visa detta visar du också ett meddelande när din app upptäcker att användaren går med ett högt förtroende.

privat tomt handtagDetectedActivities (Lista probableActivities) for (DetectedActivity aktivitet: probableActivities) switch (activity.getType ()) case DetectedActivity.IN_VEHICLE: Log.e ("ActivityRecogition", "In Vehicle:" + activity.getConfidence ()); ha sönder;  fallet DetectedActivity.ON_BICYCLE: Log.e ("ActivityRecogition", "On Bicycle:" + activity.getConfidence ()); ha sönder;  fallet DetectedActivity.ON_FOOT: Log.e ("ActivityRecogition", "On Foot:" + activity.getConfidence ()); ha sönder;  case DetectedActivity.RUNNING: Log.e ("ActivityRecogition", "Running:" + activity.getConfidence ()); ha sönder;  fallet DetectedActivity.STILL: Log.e ("ActivityRecogition", "Still:" + activity.getConfidence ()); ha sönder;  case DetectedActivity.TILTING: Log.e ("ActivityRecogition", "Tilting:" + activity.getConfidence ()); ha sönder;  case DetectedActivity.WALKING: Log.e ("ActivityRecogition", "Walking:" + activity.getConfidence ()); om (activity.getConfidence ()> = 75) NotificationCompat.Builder builder = ny NotificationCompat.Builder (this); 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 ());  ha sönder;  case DetectedActivity.UNKNOWN: Log.e ("ActivityRecogition", "Unknown:" + activity.getConfidence ()); ha sönder; 

Om du kör den här applikationen kör du och kör sedan enheten i datorn, så ska du se en logg som liknar följande i din utvecklingskonsol.

E / ActivityRecogition: On Foot: 92 E / ActivityRecogition: Running: 87 E / ActivityRecogition: På cykel: 8 E / ActivityRecogition: Walking: 5

Om du går en promenad, bör du få en anmälan om du är på en promenad. Om du har en träningsapplikation skulle det vara det perfekta tillfället att ge din användare en åtgärd som skulle göra det möjligt för dem att börja hålla reda på deras övning.

Slutsats

Google Play Services gör det mycket enkelt att bestämma användarens aktuella aktivitet. Detta kan vara otroligt värdefullt för att göra dina applikationer kontextmedvetna och användbara för dina användare, vilket är bra för alla inblandade. Med bara några rader av kod kan du också göra dina applikationer smartare.