Rendere un'applicazione sensibile al contesto è uno dei modi migliori per offrire servizi utili ai tuoi utenti. Ci sono alcuni modi per farlo, inclusa la creazione di applicazioni che utilizzano geofence e altri servizi di localizzazione. Questo articolo si concentra sull'utilizzo dei servizi di Google Play Riconoscimento di attività API per determinare se l'utente è in esecuzione, a piedi, in un veicolo, in bicicletta o rimanendo fermo.
Sapendo quale attività l'utente sta eseguendo può consentire all'utente di soddisfare l'esperienza dell'applicazione, ad esempio chiedendo se l'utente sta iniziando a esercitarsi in modo da poterlo tenere traccia con Google Fit o impedire che le notifiche vengano inviate quando l'utente sta guidando . I file sorgente per questo tutorial sono disponibili su GitHub.
La prima cosa che devi fare è creare una nuova applicazione Android. Per questa applicazione di esempio, ho impostato l'SDK minimo su 14 e creato un default vuoto Attività
. Una volta che Android Studio ha creato l'applicazione di base, apri il build.gradle file e importa Play Services (la versione 8.4 è la più recente al momento della stesura di questo) sotto dipendenze
nodo.
compila "com.google.android.gms: play-services: 8.4.0"
Quindi, crea una nuova classe, chiamala ActivityRecognizedService
, e farlo estendere IntentService
. Quando Google Play Services restituisce l'attività dell'utente, verrà inviata a questo IntentService
. Ciò ti consentirà di eseguire la logica dell'applicazione in background mentre l'utente passa la giornata.
public class ActivityRecognizedService estende IntentService public ActivityRecognizedService () super ("ActivityRecognizedService"); public ActivityRecognizedService (String name) super (nome); @Override protected void onHandleIntent (Intent intent)
Per completare la configurazione, apri AndroidManifest.xml. Devi dichiarare ActivityRecognizedService
e includere il com.google.android.gms.permission.ACTIVITY_RECOGNITION
permesso per la tua applicazione.
Ora che hai completato la struttura di base della tua applicazione, puoi passare al passaggio successivo della connessione a Google Play Services e alla richiesta di dati sulle attività.
Per poter utilizzare Google Play Services, devi prima connetterti a loro. Inizia aprendo MainActivity.java e implementare il ConnectionCallbacks
e OnConnectionFailedListener
interfacce. Devi anche creare una variabile membro di tipo GoogleApiClient
mantenere un riferimento al client API.
public class MainActivity estende AppCompatActivity implementa 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)
Dopo aver implementato le interfacce richieste per il GoogleApiClient
, puoi inizializzare il client e collegarti a Google Play Services in onCreate ()
richiedendo il ActivityRecognition.API
e associando i tuoi ascoltatori con il GoogleApiClient
esempio.
@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 ();
Una volta il GoogleApiClient
l'istanza è connessa, onConnected ()
è chiamato. Quando ciò accade, devi creare un PendingIntent
quello va al IntentService
hai creato in precedenza e passalo al ActivityRecognitionApi
. È inoltre necessario impostare un intervallo per la frequenza con cui l'API deve controllare l'attività dell'utente. Per questa applicazione di esempio, utilizziamo un valore di 3000
, o tre secondi, anche se in un'applicazione vera e propria si consiglia di controllare meno frequentemente per risparmiare energia.
@Override public void onConnected (bundle @Nullable Bundle) Intent intent = new Intent (this, ActivityRecognizedService.class); PendingIntent pendingIntent = PendingIntent.getService (this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates (mApiClient, 3000, PendingIntent);
A questo punto, l'applicazione dovrebbe tentare di riconoscere l'attività dell'utente ogni tre secondi e inviare tali dati a ActivityRecognizedService
.
Nel onHandleIntent ()
metodo di ActivityRecognizedService
, la prima cosa che fai è convalidare quella ricevuta Intento
contiene dati sul riconoscimento dell'attività. Se lo fa, allora puoi estrarre il ActivityRecognitionResult
dal Intento
per vedere quali attività potrebbero essere eseguite dall'utente. È possibile recuperare un elenco delle possibili attività chiamando getProbableActivities ()
sul ActivityRecognitionResult
oggetto.
@Override protected void onHandleIntent (Intent intent) if (ActivityRecognitionResult.hasResult (intent)) ActivityRecognitionResult result = ActivityRecognitionResult.extractResult (intent); handleDetectedActivities (result.getProbableActivities ());
Per questa applicazione di esempio, devi semplicemente registrare ogni attività che è stata rilevata e mostrare in che misura i servizi di Google Play sono sicuri che l'utente sta eseguendo quell'attività chiamando getConfidence ()
a DetectedActivity
esempio. Se la confidenza è 75 o superiore, allora è lecito ritenere che l'utente stia svolgendo tale attività. Per dimostrarlo, visualizzi anche una notifica quando la tua app rileva che l'utente sta camminando con grande sicurezza.
private void handleDetectedActivities (ListprobableActivities) for (DetectedActivity activity: probableActivities) switch (activity.getType ()) case DetectedActivity.IN_VEHICLE: Log.e ("ActivityRecogition", "In Vehicle:" + activity.getConfidence ()); rompere; caso DetectedActivity.ON_BICYCLE: Log.e ("ActivityRecogition", "On Bicycle:" + activity.getConfidence ()); rompere; caso DetectedActivity.ON_FOOT: Log.e ("ActivityRecogition", "On Foot:" + activity.getConfidence ()); rompere; caso DetectedActivity.RUNNING: Log.e ("ActivityRecogition", "In esecuzione:" + activity.getConfidence ()); rompere; caso DetectedActivity.STILL: Log.e ("ActivityRecogition", "Still:" + activity.getConfidence ()); rompere; caso DetectedActivity.TILTING: Log.e ("ActivityRecogition", "Tilting:" + activity.getConfidence ()); rompere; caso DetectedActivity.WALKING: Log.e ("ActivityRecogition", "Walking:" + activity.getConfidence ()); if (activity.getConfidence ()> = 75) NotificationCompat.Builder builder = new NotificationCompat.Builder (this); builder.setContentText ("Stai camminando?"); builder.setSmallIcon (R.mipmap.ic_launcher); builder.setContentTitle (getString (R.string.app_name)); NotificationManagerCompat.from (this) .notify (0, builder.build ()); rompere; caso DetectedActivity.UNKNOWN: Log.e ("ActivityRecogition", "Unknown:" + activity.getConfidence ()); rompere;
Se esegui questa applicazione, esegui una corsa, quindi collega il dispositivo al computer, dovresti visualizzare un registro simile al seguente nella tua console di sviluppo.
E / ActivityRecogition: On Foot: 92 E / ActivityRecogition: Running: 87 E / ActivityRecogition: On Bicycle: 8 E / ActivityRecogition: Walking: 5
Se vai a fare una passeggiata, dovresti ricevere una notifica che ti chiede se sei a fare una passeggiata. Se si dispone di un'applicazione di esercizio, questa sarebbe l'occasione perfetta per fornire all'utente un'azione che consenta loro di iniziare a tenere traccia del proprio esercizio.
Google Play Services rende molto facile determinare l'attività corrente dell'utente. Questo può essere incredibilmente prezioso per rendere le tue applicazioni sensibili al contesto e utili per i tuoi utenti, il che è ottimo per chiunque sia coinvolto. Con solo poche righe di codice, anche tu puoi rendere più intelligenti le tue applicazioni.