Hacer que una aplicación sea sensible al contexto es una de las mejores formas de brindar servicios útiles a sus usuarios. Hay varias formas de hacerlo, incluida la creación de aplicaciones que utilicen geocercas y otros servicios de ubicación. Este artículo se centra en el uso de los servicios de Google Play. Reconocimiento de actividad API para determinar si el usuario está corriendo, caminando, en un vehículo, en bicicleta o parado.
Conocer la actividad del usuario puede ayudarlo a administrar la experiencia de la aplicación, por ejemplo, preguntando si el usuario comienza a hacer ejercicio para que pueda rastrearlo con Google Fit, o evitando que el usuario haga ejercicio. . Los archivos de origen de este tutorial se pueden encontrar en GitHub.
1. Configuración del proyecto
Lo primero que debe hacer es crear una nueva aplicación para Android. Para esta aplicación de muestra, establecí el SDK mínimo en 14 y creó un vacío predeterminado Activity
. Una vez que Android Studio haya creado la aplicación base, abra el build.gradle e importar los servicios de reproducción (la versión 8.4 es la más reciente en el momento de escribir este artículo) en la dependencies
nodo.
compile 'com.google.android.gms:play-services:8.4.0'
Luego crea una nueva clase, nómbrala ActivityRecognizedService
y haz que se extienda IntentService
. Cuando Google Play Services devuelva la actividad del usuario, se enviará a este IntentService
. Esto le permitirá ejecutar la lógica de su aplicación en segundo plano a medida que el usuario avanza en su día.
public class ActivityRecognizedService extends IntentService { public ActivityRecognizedService() { super("ActivityRecognizedService"); } public ActivityRecognizedService(String name) { super(name); } @Override protected void onHandleIntent(Intent intent) { } }
Para completar la configuración, abra AndroidManifest.xml. Debes declarar ActivityRecognizedService
e incluye el com.google.android.gms.permission.ACTIVITY_RECOGNITION
autorización para su aplicación.
Ahora que la estructura básica de su aplicación está completa, puede pasar al siguiente paso para iniciar sesión en los servicios de Google Play y solicitar datos de actividad.
2. Solicitud de reconocimiento de actividad
Para utilizar los servicios de Google Play, primero debe iniciar sesión en ellos. Empiece por abrir MainActivity.java e implementar el ConnectionCallbacks
y OnConnectionFailedListener
interfaces. También debe crear una variable miembro de tipo GoogleApiClient
para mantener una referencia al cliente API.
public class MainActivity extends AppCompatActivity implements 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) { } }
Después de implementar las interfaces necesarias para GoogleApiClient
, puede inicializar el cliente y conectarse a los servicios de Google Play en onCreate()
pidiendo el ActivityRecognition.API
e involucrar a sus oyentes en GoogleApiClient
ejemplo.
@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 vez el GoogleApiClient
la instancia se ha conectado, onConnected()
es llamado. Cuando esto sucede, debe crear un PendingIntent
quien va a IntentService
que creó anteriormente y envíelo a la ActivityRecognitionApi
. También debe establecer un intervalo para la frecuencia con la que la API debe verificar la actividad del usuario. Para esta aplicación de muestra, usamos un valor de 3000
, o tres segundos, aunque en una aplicación real es posible que desee verificar con menos frecuencia para ahorrar energía.
@Override public void onConnected(@Nullable Bundle 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 ); }
En este punto, su aplicación debe intentar reconocer la actividad del usuario cada tres segundos y enviar esos datos a ActivityRecognizedService
.
3. Reconocimiento de las actividades de gestión
en el onHandleIntent()
método de ActivityRecognizedService
, lo primero que debe hacer es validar que el recibo Intent
contiene datos de reconocimiento de actividad. Si es así, puede extraer el ActivityRecognitionResult
de Intent
para ver qué actividades puede realizar su usuario. Puede recuperar una lista de posibles actividades llamando getProbableActivities()
sobre ActivityRecognitionResult
objeto.
@Override protected void onHandleIntent(Intent intent) { if(ActivityRecognitionResult.hasResult(intent)) { ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent); handleDetectedActivities( result.getProbableActivities() ); } }
Para esta aplicación de muestra, simplemente registra cada actividad que se detectó y muestra la confianza en los servicios de Google Play de que el usuario realiza esa actividad llamando getConfidence()
sobre un DetectedActivity
ejemplo. Si la confianza es 75 o más, es seguro asumir que el usuario está realizando esta actividad. Para ilustrar esto, también muestra una notificación cuando su aplicación detecta que el usuario camina con gran confianza.
private void handleDetectedActivities(ListprobableActivities) { for( DetectedActivity activity : probableActivities ) { switch( activity.getType() ) { case DetectedActivity.IN_VEHICLE: { Log.e( "ActivityRecogition", "In Vehicle: " + activity.getConfidence() ); break; } case DetectedActivity.ON_BICYCLE: { Log.e( "ActivityRecogition", "On Bicycle: " + activity.getConfidence() ); break; } case DetectedActivity.ON_FOOT: { Log.e( "ActivityRecogition", "On Foot: " + activity.getConfidence() ); break; } case DetectedActivity.RUNNING: { Log.e( "ActivityRecogition", "Running: " + activity.getConfidence() ); break; } case DetectedActivity.STILL: { Log.e( "ActivityRecogition", "Still: " + activity.getConfidence() ); break; } case DetectedActivity.TILTING: { Log.e( "ActivityRecogition", "Tilting: " + activity.getConfidence() ); break; } case DetectedActivity.WALKING: { Log.e( "ActivityRecogition", "Walking: " + activity.getConfidence() ); if( activity.getConfidence() >= 75 ) { NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentText( "Are you walking?" ); builder.setSmallIcon( R.mipmap.ic_launcher ); builder.setContentTitle( getString( R.string.app_name ) ); NotificationManagerCompat.from(this).notify(0, builder.build()); } break; } case DetectedActivity.UNKNOWN: { Log.e( "ActivityRecogition", "Unknown: " + activity.getConfidence() ); break; } } } }
Si ejecuta esta aplicación, iníciela y luego conecte su dispositivo a su computadora, debería ver un registro similar al siguiente en su consola de desarrollo.
E/ActivityRecogition: On Foot: 92 E/ActivityRecogition: Running: 87 E/ActivityRecogition: On Bicycle: 8 E/ActivityRecogition: Walking: 5
Si va a dar un paseo, debería recibir una notificación que le pregunte si va a dar un paseo. Si tiene una aplicación de ejercicio, esta sería la oportunidad perfecta para brindarle a su usuario una acción que le permita comenzar a rastrear su ejercicio.


Conclusión
Los servicios de Google Play facilitan la determinación de la actividad actual del usuario. Esto puede ser extremadamente valioso para que sus aplicaciones sean contextuales y útiles para sus usuarios, lo cual es excelente para todos los involucrados. Con solo unas pocas líneas de código, también puede hacer que sus aplicaciones sean más inteligentes.
Deja una respuesta