Use Text-to-Speech en Android para leer los mensajes entrantes

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..

Prerrequisitos

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..

1. Crear un nuevo proyecto

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.

2. Edita el Manifiesto

Esta aplicación necesita tres permisos:

  • RECEIVE_SMS Para saber que el dispositivo ha recibido un SMS.
  • READ_SMS leer ese SMS
  • LEER_CONTACTOS para asignar el número de teléfono del remitente a un nombre (si es posible)

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..

3. Editar cadenas.xml

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..

4. Edita el diseño

Editar res / layout / activity_main.xml Para agregar lo siguiente:

  • una Vista de texto para mostrar el nombre de la persona que envió el último SMS
  • una Vista de texto Para visualizar los contenidos de los últimos SMS.
  • una Botón de activación para activar y desactivar la salida de voz

Despué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..

5. Crea una clase de ayuda

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) HashMap hash = 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 (); 

6. Editar la clase de actividad

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 Altavozes 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; i

Solo 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 un IntentFilter para los mensajes de texto entrantes y luego registrar nuestra smsReceptor 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 el toggleListener para establecer el valor de permitido en el Altavoz clase.

Después de estas inicializaciones, llamamos al chequeos, initializeSMSReceiver, y registroSMSReceptor 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..