En el pasado Google I/O 2014, Google nos presentó el SDK de Android Wear y con ello la extensión del sistema operativo para los dispositivos wearables, empezando por los smartwatch. Aunque, ¿quién sabe qué nuevos dispositivos vendrán después.
Pero pongámonos a mirar como desarrolladores. Ya hemos publicado nuestra aplicación en Google Play, y ahora queremos poder hacerla compatible con Android Wear. ¿Qué debemos hacer? ¿Deberemos rehacer la aplicación entera?
Android Wear: haciendo las cosas fáciles
La respuesta es muy simple: NO. Tan sólo deberemos añadir algo de código para hacer uso de algunas de las características de Android Wear, como puede ser extender las notificaciones a nuestro smartwatch. Y si en algo destaca Android Wear, desde mi punto de vista, es en el hecho de que el valor añadido del sistema de notificaciones nos permitirá interactuar con nuestra aplicación sin necesidad de utilizar el smartphone.
Aunque hay que decir, que si no modificamos nada, las notificaciones que nuestro app enviase, ya se mostrarían en Android Wear, pero sin todas las nuevas posibilidades que ofrece el mismo.
El valor añadido de Android Wear
Concretamente, el sistema operativo de los wearables nos permitirá:
- Añadir nuevas funcionalidades a las notificaciones, que podremos gestionar desde el mismo reloj. Podremos, incluso, añadir reconocimiento de voz de entrada a la notificación, o diferentes tarjetas para la notificación, entre otras cosas.
- Crear aplicaciones para el smartwatch
- Enviar y sincronizar datos con nuestro dispositivo
Seguramente vendrán más funcionalidades en el futuro, pero con estas tenemos bastante con lo que jugar, pues tan sólo las notificaciones dan muchísimas oportunidades.
Lo que personalmente sí creo que hay que destacar es considerar no caer en el error de desarrollar aplicaciones para el smartwatch imitando las de nuestro dispositivo. ¿Por qué? Porque un smartwatch no debe estar pensado para hacer las cosas de la misma manera que nuestro móvil o tablet lo hace. Hay que hacerlo diferente. Y esto es el punto difícil para los desarrolladores
Modificando nuestra aplicación existente
Y con todo esto, pasamos a ver cómo modificar nuestra aplicación para que haga uso de Android Wear y sus ventajas. Para ello, seguiremos los siguientes pasos con nuestro Android Studio:
1. Añadir la última versión de la librería support a nuestro fichero build.gradle
dependencies {
compile ‘com.android.support:support-v4:20.0+’
}
2. Añadir las acciones específicas que queremos incluir en Android Wear a las notificaciones ya existentes en nuestra app. Para ello utilizaremos la clase NotificationCompat.Builder ya que así el sistema se encargará de mostrarlas donde sea necesario (teléfono o reloj).
//standard notification code
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mContext)
.setSmallIcon(R.drawable.icon_notification_queueing_seethrough)
.setContentTitle(mContext.getString(R.string.redomat))
.setContentText(message);
//Actions «Snooze» notification and delete ticket (remove from queue) are only available if user is not next in line
if (!getIsUserNextInLine()) {
//User click on action triggers broadcast which is received by WearActionReceiver.class
//Put notification id and flag WEAR_ACTION.
//Using these parameters WearActionReceiver.class will know which action was clicked
Intent notifyNextTimeIntent = new Intent(mContext, WearActionReceiver.class);
notifyNextTimeIntent.putExtra(WearActionReceiver.NOTIFICATION_ID_STRING, NOTIFICATION_ID);
notifyNextTimeIntent.putExtra(WearActionReceiver.WEAR_ACTION, WearActionReceiver.SNOOZE_NOTIFICATION);
PendingIntent pendingIntentNotify = PendingIntent.getBroadcast(mContext, WEAR_REQUEST_CODE, notifyNextTimeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
//text shown in notification
String notifyAgainText = String.format(mContext.getString(R.string.notification_next_in_line), getNumberInLine());
//Wear action – this action will be shown only on Android Wear devices
//Set action icon, text and pending intent which will be executed on click
//When user clicks on this icon he will «snooze» notification
NotificationCompat.Action actionNotifyNextTime = new NotificationCompat.Action.Builder(R.drawable.ic_launcher, notifyAgainText, pendingIntentNotify).build();
//The same as Intent for «snooze» but this time set another flag Intent cancelTicketIntent = new Intent(mContext, WearActionReceiver.class); cancelTicketIntent.putExtra(WearActionReceiver.NOTIFICATION_ID_STRING, NOTIFICATION_ID);
cancelTicketIntent.putExtra(WearActionReceiver.WEAR_ACTION, WearActionReceiver.CANCEL_TICKET);
PendingIntent pendingIntentCancel = PendingIntent.getBroadcast(mContext, WEAR_REQUEST_CODE_2, cancelTicketIntent, PendingIntent.FLAG_UPDATE_CURRENT);
//When user clicks on this icon he will cancel his ticket and remove himself from the queue
NotificationCompat.Action actionCancel = new NotificationCompat.Action.Builder(R.drawable.actionbar_icon_delete, mContext.getString(R.string.cancel_ticket), pendingIntentCancel) .build();
//Create new WearableExtender object and add actions
NotificationCompat.WearableExtender extender = new NotificationCompat.WearableExtender();
extender.addAction(actionNotifyNextTime); extender.addAction(actionCancel);
//Extend Notification builder
mBuilder.extend(extender);
}
//Get notification manager
NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
//show notification
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
3. Añadir un Broadcast Receiver para gestionar la notificación.
public class WearActionReceiver extends BroadcastReceiver {
public static final String NOTIFICATION_ID_STRING = «NotificationId«;
public static final String WEAR_ACTION = «WearAction«;
public static final int SNOOZE_NOTIFICATION = 1;
public static final int CANCEL_TICKET = 2;
@Override
public void onReceive (Context context, Intent intent) {
if (intent != null) {
int notificationId = intent.getIntExtra(NOTIFICATION_ID_STRING, 0);
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(notificationId);
int action = intent.getIntExtra(WEAR_ACTION, 0);
switch (action) {
case SNOOZE_NOTIFICATION:
//Code for notification snooze
break;
case CANCEL_TICKET:
//code for removing the user from the queue
break;
default:
break;
} } }
}
4. Declarar el Receiver en el Manifest
<receiver android:name=«co.infinum.WearActionReceiver«/>
Como podemos ver, tan sólo han sido necesarias unas cuantas líneas de código para darle un valor añadido a nuestra app y aprovechar algunas de las características de Android Wear. Y no estamos añadiendo conceptos nuevos, sino conceptos que ya hemos estudiado cuando programábamos tan sólo para Android.
A partir de ahí, no debemos quedarnos en el uso de las notificaciones, y deberíamos poder añadir funcionalidad para una interacción más fluida y completa desde nuestros relojes. Para ello, poedemos hacer uso de las tarjetas y de los comandos de voz. Ya depende de hasta dónde queramos llegar.
Como último consejo, os recomiendo que leáis los Principios de diseño de Android Wear, pues nos darán una idea de qué podemos esperar de Android Wear y qué esperarán los usuarios de nuestras aplicaciones. Aunque como siempre digo, para cualquier otra cosa, lo mejor es acudir a la documentación oficial.
Via Infinum