@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
    https://github.com/diegofigueroa/activity-recognition-sample

    Práctica


    http://goo.gl/7GOr94
    Made with Slides.com