¿Por qué la intención de ACTION_CHECK_TTS_DATA es "incómoda de usar"?
La introducción oficial de Text-To-Speech en Android dice que "al crear su actividad, un buen primer paso es comprobar la presencia de los recursos TTS con la intención correspondiente:"
Intent checkIntent = new Intent(); checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
Pero @gregm en este hilo sugiere lo contrario:
- TTS android 4.1 jellybean
- ¿Qué significan los nombres / códigos de Android Voice?
- TextToSpeech.setEngineByPackageName () devuelve el éxito incluso cuando el paquete no está disponible
- Problema de STOP de texto a voz
- TTS: El éxito regresó de onInit () pero aún hay retraso para hablar primero
Además, no utilice la intención ACTION_CHECK_TTS_DATA, que es difícil de usar .
En su lugar, haga lo siguiente:
- Crear TextToSpeech
- OnInit, compruebe isLanguageAvailable () si lo es, su aplicación está todo configurado. Si no, envíe la ACTION_INSTALL_TTS_DATA
Si entiendo correctamente, lo que @gregm hace / sugiere es aplazar la comprobación onActivityResult()
de onActivityResult()
a onInit()
.
¿Por qué es esto mejor que el enfoque formal ?
¿Y por qué ACTION_CHECK_TTS_DATA es tan "incómodo de usar"?
- Android TTS comprueba la configuración regional admitida con datos de voz que faltan o no se han descargado
- ¿Cuál es el flujo de audio predeterminado de TTS?
- Cómo cambiar programáticamente el motor predeterminado TTS
- ¿Cómo saber cuándo se termina el TTS?
- Obtener locales disponibles para tts
- Otras opciones de la biblioteca de Android TextToSpeech
- La función de devolución de llamada de Android TTS onUtteranceCompleted no se recibe
- Pausa en el TTS android
Este es @gregm.
ACTION_CHECK_TTS_DATA
requiere una ejecución más complicada y más código, pero hace lo mismo que TextToSpeech.isLanguageAvailable()
Permítanme explicar:
1) Usted necesita dos procesos asincrónicos cuando utiliza ACTION_INSTALL_TTS_DATA
. Primero, para lanzar un Intent
y recibir el resultado. Segundo, esperar a que TextToSpeech
llame a onInit()
Más puede ir mal mientras su aplicación está haciendo todo eso esperando.
2) Todo lo que usted está tratando de hacer es ejecutar una instrucción if y necesita el mismo código para manejar la instalación de los datos de idioma si es necesario, así que ¿ por qué molestarse en agregar complejidad extra ?
Se reduce a hacer esto:
¿Quieres 1 línea de código:
if (TextToSpeech.isLanguageAvailable()) { (same tts init code here) }
O> 1 líneas de código como:
Intent checkIntent = new Intent(); checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); public void onActivityResult(...) { if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) (same tts init code here) }
En mi punto de vista, prefiero simplemente llegar a la instrucción if, en lugar de usar un Intent
around de Intent
. Creo que la documentación oficial de Android necesita cambiar para recomendar este enfoque.
Si todavía no cree que ambos enfoques estamos discutiendo hacer lo mismo, echa un vistazo a las implementaciones alternativas que tengo aquí y aquí . Además, si no se preocupan por todas estas cosas y sólo quieren que su aplicación hable, sólo extender esta actividad y hacerse.
- Fill_parent no funciona para RelativeLayout en ScrollView
- Android detectar si constructor llamado en modo de diseño?