@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_VEHICLE
DetectedActivity.ON_BICYCLE
DetectedActivity.ON_FOOT
DetectedActivity.TILTING
DetectedActivity.STILL
DetectedActivity.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 ActivityRecognitionManager
implements 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,641