Las aplicaciones con interfaces que hacen uso de la voz tienen un atractivo único. Tienden a hacer que sus usuarios sientan que están usando algo futurista. Desde sus inicios, Android ha tenido una funcionalidad de texto a voz (TTS) muy robusta. Este año, Google ha agregado muchas voces de alta calidad a su motor TTS y esa es una razón más para que los desarrolladores lo utilicen en sus aplicaciones..
En este tutorial, aprenderá cómo crear una aplicación simple, con una interfaz de usuario minimalista, que pueda recibir mensajes de texto y leerlos al usuario..
Asegúrese de tener configurado el paquete Eclipse ADT. Puedes descargarlo en el sitio web de Android Developer. Para obtener mejores resultados, también necesitarás un dispositivo Android real y algunos amigos que puedan enviarte mensajes de texto..
Inicia Eclipse y crea una nueva aplicación para Android. Llama a esta aplicación SMSReader. Si crees que vas a publicar esta aplicación en Google Play para compartirla con tus amigos, asegúrate de usar un nombre de paquete único. Selecciona el SDK mínimo requerido a Android 2.2 y establecer el SDK de destino a Android 4.4.
Esta aplicación tendrá una Actividad
. Seleccionar Crear actividad y elige Actividad vacía.
Nombralo Actividad principal y haga clic Terminar.
Esta aplicación necesita tres permisos:
Añade las siguientes líneas a tu AndroidManifest.xml.
Esta aplicación va a tener solo una orientación de pantalla, retrato. Por lo tanto, edite el actividad
etiqueta y añade el siguiente atributo:
android: screenOrientation = "retrato"
El manifiesto está ahora completo..
No es absolutamente necesario, pero almacena todas las cadenas que la aplicación utiliza en el res / values / strings.xml El archivo es una buena práctica. Edita este archivo para que tenga los siguientes contenidos:
SMSReader Últimos SMS Ninguna Comience a hablar PARA DE HABLAR ¡Bueno! Voy a leer tus mensajes en voz alta para ti ahora. ¡Bueno! Me quedaré en silencio ahora.
La mayoría de estas cadenas se utilizan en el siguiente paso..
Editar res / layout / activity_main.xml Para agregar lo siguiente:
Vista de texto
para mostrar el nombre de la persona que envió el último SMSVista de texto
Para visualizar los contenidos de los últimos SMS.Botón de activación
para activar y desactivar la salida de vozDespués de agregar el código para colocar y diseñar estos elementos, su archivo debe tener los siguientes contenidos:
El diseño de nuestra aplicación ya está completo..
Ahora vamos a crear una clase de ayuda para el motor TTS. Crea una nueva clase de Java y llámala. Speaker.java. Esta clase se utiliza para evitar llamar a la API de TTS directamente desde el Actividad
.
Esta clase implementa el OnInitListener
Interfaz para que sepa cuándo está listo el motor TTS. Almacenamos este estado listo en una variable booleana llamada Listo
. Usamos otra variable booleana llamada permitido
cuyo valor es cierto
solo si el usuario ha permitido que el motor TTS hable. También agregamos métodos para obtener y establecer el valor de esta variable. En este punto, Speaker.java Debe tener los siguientes contenidos:
La clase pública Speaker implementa OnInitListener private TextToSpeech tts; booleano privado listo = falso; booleano privado permitido = falso; Orador público (contexto de contexto) tts = new TextToSpeech (contexto, este); public boolean isAllowed () return permitido; public void allow (boolean allowed) this.allowed = allowed;
los OnInitListener
la interfaz tiene un solo método, onInit
. Este método se llama cuando se ha inicializado el motor TTS. los estado
El parámetro nos permite saber si la inicialización fue exitosa. Una vez que sabemos que la inicialización fue exitosa, configuramos el idioma del motor TTS. Esto es importante para producir un discurso que sea comprensible. Agregue el siguiente código:
@Override public void onInit (int status) if (status == TextToSpeech.SUCCESS) // Cambie esto para que coincida con su // locale tts.setLanguage (Locale.US); ready = true; else ready = false;
A continuación, agregamos un método llamado hablar
, que utiliza el motor para leer cualquier texto que se le pase. Antes de hacerlo, comprueba si tanto el permitido
y el Listo
los valores son cierto
. El discurso que genera se coloca en el flujo de notificaciones..
hablar público (texto de cadena) // hablar solo si el TTS está listo // y el usuario ha permitido el habla si (listo y & permitido) HashMaphash = nuevo HashMap (); hash.put (TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf (AudioManager.STREAM_NOTIFICATION)); tts.speak (texto, TextToSpeech.QUEUE_ADD, hash);
Luego agregamos un método que reproduce el silencio durante un tiempo específico. Usando este método, podemos agregar pausas al discurso para que suene un poco más claro. Agregue el siguiente código a la implementación:
pausa pública vacía (duración int) tts.playSilence (duración, TextToSpeech.QUEUE_ADD, null);
Finalmente, agregue un método para liberar recursos cuando el motor TTS ya no sea necesario.
// Liberar recursos public void destroy () tts.shutdown ();
Editar MainActivity.java Y declare todas las vistas que mencionamos en el layout. Declarar dos enteros, LARGA DURACIÓN
y CORTA DURACIÓN
. Estos son meramente valores que se pasan a la Altavoz
es pausa
método.
Tambien declara un CÓDIGO DE VERIFICACIÓN
entero. Su valor no es importante. Se pasa a la startActivityforResult
Método y luego se utiliza para identificar el resultado..
Por último, declarar un Altavoz
objeto y un Receptor de radiodifusión
objeto.
En este punto, tu clase debería verse así:
la clase pública MainActivity extiende la actividad private final int CHECK_CODE = 0x1; int final privado LONG_DURATION = 5000; int final privado SHORT_DURATION = 1200; Orador privado orador; toggle privado del botón de alternar privado OnCheckedChangeListener toggleListener; privado TextView smsText; privado TextView smsSender; transmisión privada receptor de SMS, receptor;
Agregue un método para verificar si un motor TTS está instalado en el dispositivo. El control se realiza haciendo uso del resultado de otro. Actividad
.
checkTTS vacíos privados () Intent check = new Intent (); check.setAction (TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult (check, CHECK_CODE);
Cuando el resultado de startActivityForResult
llega, el onActivityResult
se llama metodo Por lo tanto, tenemos que anularlo. En este método, si el resultado es positivo, inicializamos Altavoz
objeto. Si no hay un motor TTS instalado, redirigimos al usuario para que lo instale.
@ Override protected void onActivityResult (int requestCode, int resultCode, Intent data) if (requestCode == CHECK_CODE) if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) speaker = new Speaker (this); else Intent install = new Intent (); install.setAction (TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity (instalar);
Ahora es el momento de crear nuestra Receptor de radiodifusión
para hacer frente a los mensajes que el dispositivo está recibiendo. Cada vez que hay nuevos mensajes, su onReciba
se llama metodo Analizamos los mensajes, que llegan como arrays de bytes, usando el Mensaje sms
clase. Una vez analizado el mensaje, usamos métodos como getDisplayMessageBody
y getOriginatingAddress
para extraer información significativa de ella.
Con esta información, generamos el texto que el motor TTS debe leer. Hacemos una pausa para LARGA DURACIÓN
Antes de leer un nuevo SMS y para CORTA DURACIÓN
entre las expresiones del nombre del remitente del SMS y el cuerpo del SMS.
Agregue el siguiente código a la implementación:
private void initializeSMSReceiver () smsReceiver = new BroadcastReceiver () @Override public void onReceive (Contexto del contexto, Intención) Bundle bundle = intent.getExtras (); if (bundle! = null) Object [] pdus = (Object []) bundle.get ("pdus"); para (int i = 0; iSolo podemos extraer el número de teléfono del remitente del mensaje. Para asignar este número al nombre de un contacto, tenemos que hacer uso de los contactos del usuario. El siguiente método consulta los datos de los contactos. Si el número de teléfono no está disponible en los contactos del usuario, simplemente devuelve la cadena
numero desconocido
:privado String getContactName (String phone) Uri uri = Uri.withAppendedPath (PhoneLookup.CONTENT_FILTER_URI, Uri.encode (teléfono)); Proyección de cadenas [] = nueva cadena [] ContactsContract.Data.DISPLAY_NAME; Cursor cursor = getContentResolver (). Query (uri, projection, null, null, null); if (cursor.moveToFirst ()) return cursor.getString (0); else devolver "número desconocido";Antes de
Receptor de radiodifusión
Se puede utilizar, tiene que estar registrado. En el siguiente método, creamos unIntentFilter
para los mensajes de texto entrantes y luego registrar nuestrasmsReceptor
para ello:private void registerSMSReceiver () IntentFilter intentFilter = new IntentFilter ("android.provider.Telephony.SMS_RECEIVED"); registerReceiver (smsReceiver, intentFilter);A continuación, creamos la
onCreate
método. Aquí es donde inicializamos todos los objetos que declaramos. Iniciamos eltoggleListener
para establecer el valor depermitido
en elAltavoz
clase.Después de estas inicializaciones, llamamos al
chequeos
,initializeSMSReceiver
, yregistroSMSReceptor
metodos.@Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); toggle = (ToggleButton) findViewById (R.id.speechToggle); smsText = (TextView) findViewById (R.id.sms_text); smsSender = (TextView) findViewById (R.id.sms_sender); toggleListener = new OnCheckedChangeListener () @Override public void onCheckedChanged (vista CompoundButton, boolean isChecked) if (isChecked) speaker.allow (true); speaker.speak (getString (R.string.start_speaking)); else speaker.speak (getString (R.string.stop_speaking)); speaker.allow (falso); ; toggle.setOnCheckedChangeListener (toggleListener); checkTTS (); initializeSMSReceiver (); registerSMSReceiver ();Finalmente, en el
onDestroy
método de la actividad, anula el registro de nuestro receptor y apagamos el motor TTS para liberar recursos.@Override notificó el vacío onDestroy () super.onDestroy (); unregisterReceiver (smsReceiver); speaker.destroy ();7. Ejecutar y probar
La aplicación ya está lista para ser probada. Compila y ejecútalo en un dispositivo físico Android. Toca el botón para activar la voz y enviarte un SMS desde otro teléfono o pídele a uno de tus amigos que lo haga. Pronto deberías poder escuchar tu teléfono leyendo los SMS por ti.
Aquí hay una muestra del discurso generado por el motor TTS:
Conclusión
En este tutorial, aprendió a utilizar no solo la API de texto a voz, sino también a utilizar receptores de difusión y a entender los datos sin procesar de SMS. Ahora puede continuar personalizando esta aplicación según sus necesidades..