El tutor de nuestro curso online de Desarrollo de Aplicaciones para Android, Víctor Ramírez Las,…
Soporte para comandos de voz en Smartwatches Android
3.
Soporte para comandos de voz en Smartwatches Android
En este tutorial, presentaremos las dos formas que proporciona Google para la realización de tareas sobre dispositivos smartwatches, con tan solo el uso de comandos de voz ya preestablecidos o personalizados por el usuario en una aplicación.
Al tratarse Android Wear de la versión especializada de Google para implementar su sistema operativo en relojes inteligentes, era indispensable una integración total del uso de comandos de voz, para la realización de acciones sin necesidad de tocar el dispositivo.
Tratándose de un sistema que no necesita la intervención directa del usuario, y como parte de la experiencia que propone Google en el uso de smartwatches, permite la implementación de acciones de voz de dos formas bien diferenciadas:
1. Declarar acciones de voz proporcionadas por el sistema
Este sistema proporciona determinadas acciones de voz, basadas en tareas, que ya están incorporadas a la plataforma Wear. Estas acciones ya predefinidas, permitirán al usuario simplemente indicar la tarea a realizar, y a continuación la propia aplicación se encargará de filtrar el intent y lanzar la Activity asociada a la tarea filtrada. Es recomendable que dicha implementación se lleve a cabo utilizando mensajes, ya sean visuales o de texto, que avisen al usuario del inicio de la tarea.
Un ejemplo muy común sería la tarea de «Tome una nota», que se implementaría de la siguiente forma (en archivo AndroidManifest.xml):
1 2 3 4 5 6 |
<activity android:name="MyNoteActivity"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="com.google.android.voicesearch.SELF_NOTE" /> </intent-filter> </activity> |
Lista de comandos de voz soportados por la plataforma Android Wear
Nombre | Frases de ejemplo | Intent |
Call a car/taxi | «OK Google, get me a taxi»»OK Google, call me a car» | Action com.google.android.gms.actions.RESERVE_TAXI_RESERVATION |
Take a note | «OK Google, take a note»»OK Google, note to self» | Action android.intent.action.SENDCategory com.google.android.voicesearch.SELF_NOTEExtras android.content.Intent.EXTRA_TEXT – string para cuerpo de nota |
Set alarm | «OK Google, set an alarm for 8 AM»»OK Google, wake me up at 6 tomorrow» | Action android.intent.action.SET_ALARMExtras android.provider.AlarmClock.EXTRA_HOUR – entero que establece la hora de la alarma. android.provider.AlarmClock.EXTRA_MINUTES – entero que establece el minuto de la alarma.Ambas opciones extras no son obligatorias, pudiendo definir ambas o niguna. |
Set timer | «Ok Google, set a timer for 10 minutes» | Action android.intent.action.SET_TIMERExtras android.provider.AlarmClock.EXTRA_LENGTH – entero dentro del rango de 1 a 86400 (número de segundos en 24 horas) que representan el largo del temporizador |
Start/Stop a bike ride | «OK Google, start cycling»»OK Google, start my bike ride»»OK Google, stop cycling» | Action vnd.google.fitness.TRACKMime Type vnd.google.fitness.activity/bikingExtras actionStatus – string con el valor ActiveActionStatus cuando comienza y CompletedActionStatus cuando se detiene. |
Start/Stop a run | «OK Google, track my run»»OK Google, start running»»OK Google, stop running» | Action vnd.google.fitness.TRACKMimeType vnd.google.fitness.activity/runningExtras actionStatus – string con el valor ActiveActionStatus cuando comienza y CompletedActionStatus cuando se detiene. |
Start/Stop a workout | «OK Google, start a workout»»OK Google, track my workout»»OK Google, stop workout» | Action vnd.google.fitness.TRACKMimeType vnd.google.fitness.activity/otherExtras actionStatus – string con el valor ActiveActionStatus cuando comienza y CompletedActionStatus cuando se detiene. |
Show heart rate | «OK Google, what’s my heart rate?»»OK Google, what’s my bpm?» | Action vnd.google.fitness.VIEWMime Type vnd.google.fitness.data_type/com.google.heart_rate.bpm |
Show step count | «OK Google, how many steps have I taken?»»OK Google, what’s my step count?» | Action vnd.google.fitness.VIEWMime Type vnd.google.fitness.data_type/com.google.step_count.cumulativeMime Type vnd.google.fitness.data_type/com.google.step_count.cumulative |
Nota: Tabla elaborada a partir de información de la página oficial de desarrolladores de Android
2. Declarar acciones de voz proporcionadas por una aplicación
Esta opción permite definir acciones de voz para lanzar cualquier Activity definida en la aplicación. Para que esta funcionalidad sea posible, bastará con definir el atributo android:label="AppWear" (en archivo <span=»nombre-fichero»>AndroidManifest.xml) con la Activity a lanzar, para que posteriormente reconozca el comando de voz «Iniciar AppWear».
1 2 3 4 5 6 7 8 9 10 |
<application> <activity android:name="com.academiaandroid.appwear.MainActivity" android:label="AppWear" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> |
Además, dentro de la posibilidades de comandos de voz implementado por Google, también proporciona un sistema de construcción de reconocimiento del habla. Para su uso dentro de una aplicación, se deberá llamar al método startActivityForResult(), recibiendo entre sus parámetros el intent declarado, y la acción ACTION_RECOGNIZE_SPEECH. Con la acción anterior se inicia el reconocimiento de voz, para posteriormente, manejar el resultado dentro del método onActivityResult():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
private static final int SPEECH_REQUEST_CODE = 0; //Crea un intent que permite iniciar la Activity para reconocer el discurso. private void displaySpeechRecognizer() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); //Se inicia la Activity con el texto dictado. startActivityForResult(intent, SPEECH_REQUEST_CODE); } /*Método invocado cuando se reconoce el discurso de regreso. Además se encarga de procesar el discurso transformándolo en texto.*/ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SPEECH_REQUEST_CODE && resultCode == RESULT_OK) { List<String> results = data.getStringArrayListExtra( RecognizerIntent.EXTRA_RESULTS); String spokenText = results.get(0); } super.onActivityResult(requestCode, resultCode, data); } |
Nota: En este enlace, se puede acceder al resto de intents comunes, que permitirán lanzar diferentes Activities con el uso de comandos de voz ya preestablecidos
Imagen: Icon made by Egor Rumyantsev from www.flaticon.com is licensed under CC BY 3.0