@diegofigueroa

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:

    1. El usuario viaja en un automóvil.
    2. El usuario viaja en bicicleta.
    3. El usuario viaja a pie.
    4. El usuario está detenido, pero el teléfono se está moviendo.
    5. El usuario está detenido completamente.

    Setup






    0. Instalar Google Play Services SDK

    Google Play Services SDK



    1. En Eclipse:
    Window > Android SDK Manager

    2. En 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



    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