@diegofigueroa
Activity Recognition API
Activity Recognition API
¿Qué es?
Servicio que permite detectar la actividad física del usuario.
Anunciado en Google I/O 2013.
Muy fácil de usar.
Disponible en todas las versiones de Android*.
¿Por qué?
Aplicaciones ahora pueden saber no sólo donde estamos, sino qué estamos haciendo y reaccionar acorde a esto.
¿Por qué?
Aplicaciones más inteligentes (y proactivas).
Mejor interacción.
Usuarios más felices :D
¿Por qué?
Una aplicación para corredores puede saber cuándo dejamos de correr y animarnos a seguir corriendo.
¿Por qué?
Una aplicación de mensajería puede saber si estamos manejando...
¿Por qué?
Podemos activar o desactivar notificaciones en función de lo que el usuario está haciendo.
¿Por qué?
Podemos tener recordatorios basados en nuestras actividades.
Y más...
Es una gran oportunidad para crear nuevas experiencias.
Actividades
Podemos detectar las siguientes actividades:
- El usuario viaja en un automóvil.
- El usuario viaja en bicicleta.
- El usuario viaja a pie.
- El usuario está detenido, pero el teléfono se está moviendo.
- El usuario está detenido completamente.
Setup
0. Instalar Google Play Services SDK
Google Play Services SDK
1. En Eclipse:
Window > Android SDK Manager
Extras > Google Play Services SDK > Install > Accept License > Install
Permisos
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>Funcionamiento
0. Verificar Google Play Services APK.
- Instalable por el usuario.- Disponible en el Play Store.
GooglePlayServicesUtil.isGooglePlayServicesAvailable(...);Funcionamiento
1. Conectarse a Google Play Services

Funcionamiento
2. Solicitar actualizaciones de reconocimiento de actividades.
- Periódicamente cada n segundos.- Recibidas por un servicio.
activityRecognitionClient.requestActivityUpdates(...);Funcionamiento
3. Esperar actualizaciones en el background.
public class ActivityRecognitionService extends IntentService{protected void onHandleIntent(Intent intent){...}}
Funcionamiento
4. Reaccionar a la actualización.
DetectedActivity.IN_VEHICLEDetectedActivity.ON_BICYCLEDetectedActivity.ON_FOOTDetectedActivity.TILTINGDetectedActivity.STILLDetectedActivity.UNKNOWN
Funcionamiento
5. Cancelar actualizaciones.
activityRecognitionClient.removeActivityUpdates(...);Implementación
Componentes
1. MainActivity
2. ActivityRecognitionClient
3. ActivityRecognitionManager
4. ActivityRecognitionIntentService
Detectando Google Play Services APK
public boolean servicesAvailable(Context c){int res;res = GooglePlayServicesUtil.isGooglePlayServicesAvailable(c);if(res == ConnectionResult.SUCCESS){ return true;}else{Dialog dialog;dialog = GooglePlayServicesUtil.getErrorDialog(res, c, 0);if(dialog != null){dialog.show();}return false;}}
Activity Recognition Manager
public class ActivityRecognitionManagerimplements ConnectionCallbacks,OnConnectionFailedListener{public void onConnected(){}public void onDisconnected(){}public void onConnectionFailed(){}}
Activity Recognition Manager
public ActivityRecognitionManager(MainActivity c){this.context = c;this.connecting = false;this.client = new ActivityRecognitionClient(c, this, this);Intent i = new Intent(c, ARIntentService.class);this.serviceIntent = PendingIntent.getService(c, 0, i,...);...}
Activity Recognition Manager
public void connect(){if(servicesAvailable()){if(!connecting){connecting = true;client.connect();} }}
Activity Recogntion Manager
public void onConnected(Bundle connectionHint){ connecting = false;if(requestUpdates){int lapse = 1000 * 30; // 30s client.requestActivityUpdates(lapse, serviceIntent);}else{ client.removeActivityUpdates(serviceIntent);}client.disconnect(); }
Activity Recognition Manager
public void onDisconnected(){ this.connecting = false;... }
Activity Recognition Intent Service
public class ActivityRecognitionIntentService extends IntentService{public ActivityRecognitionIntentService(){ super("ActivityRecognitionService"); }protected void onHandleIntent(Intent i){...}}
Activity Recognition Intent Service
protected void onHandleIntent(Intent i){ActivityRecognitionResult r;r = ActivityRecognitionResult.extractResult(i);DetectedActivity activity = r.getMostProbableActivity();int type = activity.getType();int confidence = activity.getConfidence();......}
Notas
- La certeza de cada detección se mide como un número entero entre 0 y 100.
- El lapso entre detecciones se estipula en milisegundos.
- El lapso en que se reciben las notificaciones puede variar respecto al solicitado.
-
Para modificar el lapso deseado, basta con hacer una nueva solicitud con el nuevo lapso.



Referencias
- Android Activity Recogntion API training
- Google Play Services
- Google Play Services SDK Setup
- Activity Recognition Client
- Activity Recognition Result
- Detected Activity
- GooglePlayServicesClient.ConnnectionCallbacks
- GooglePlayServicesClient.OnConnectionFailedListener
- ConnectionResult
-
GooglePlayServicesUtil
Ejemplo completo en
Práctica
Android activity recognition API
By Diego Figueroa
Android activity recognition API
Introduction to Android's User Activity Recognition API
- 1,669