TextToSpeech muestra Null Pointer Exception?
Estoy creando una aplicación en TextToSpeech. Pero cuando estoy tratando de ejecutar, lanzar excepción en la línea siguiente.
tts.speak(ruleOne, TextToSpeech.QUEUE_ADD, null);
Aquí está mi código completo para referencia
Por favor, dame cualquier pista. No entiendo qué malo en mi código. Cuando compile mi código todo el valor pasa correctamente pero cuando salta encima de tts el objeto golpeó la excepción del puntero nulo. Qué sintaxis es incorrecta? ¿Qué método llaman primero onCreate () o onActivityResult? Gracias por adelantado
- OnUtteranceCompleted no se llama?
- ¿Cómo usar e importar eSpeak en eclipse?
- ¿Cuál es la sintaxis adecuada para el atributo de fonema en el TTS XML de Android?
- Ampliación del motor TTS android
- ¿Alguna api de TTS para Android en turco?
Aquí está el contenido de Logcat.
04-10 13:58:34.082: WARN/System.err(19352): java.lang.NullPointerException 04-10 13:58:34.082: WARN/System.err(19352): at com.example.examguide.ExamRulesActivity.onCreate(ExamRulesActivity.java:60) 04-10 13:58:34.082: WARN/System.err(19352): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 04-10 13:58:34.092: WARN/System.err(19352): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 04-10 13:58:34.092: WARN/System.err(19352): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 04-10 13:58:34.092: WARN/System.err(19352): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 04-10 13:58:34.092: WARN/System.err(19352): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 04-10 13:58:34.092: WARN/System.err(19352): at android.os.Handler.dispatchMessage(Handler.java:99) 04-10 13:58:34.092: WARN/System.err(19352): at android.os.Looper.loop(Looper.java:123) 04-10 13:58:34.092: WARN/System.err(19352): at android.app.ActivityThread.main(ActivityThread.java:3683) 04-10 13:58:34.102: WARN/System.err(19352): at java.lang.reflect.Method.invokeNative(Native Method) 04-10 13:58:34.102: WARN/System.err(19352): at java.lang.reflect.Method.invoke(Method.java:507) 04-10 13:58:34.102: WARN/System.err(19352): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 04-10 13:58:34.102: WARN/System.err(19352): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 04-10 13:58:34.102: WARN/System.err(19352): at dalvik.system.NativeStart.main(Native Method)
- Android TextToSpeech solo escribe palabras cortas en lugar de pronunciarlas
- ¿Soporta Android TTS el lenguaje de marcado de síntesis de voz?
- Mejor práctica para especificar la pronunciación para el motor Android TTS?
- OnUtteranceCompleted () perdido si TTS recibido es demasiado largo
- Android Vietnamita Texto a voz?
- Los componentes de IntentReceiver no pueden enlazar servicios
escribir
tts = new TextToSpeech(this, this);
En su bucle if en el método onCreate ().
Como Dhruvisha y andy boot sugirió, la NullPointerException es obvia porque onCreate
se ejecuta antes de onActivityResult
. Mi sugerencia es traer todo su código que utiliza tts
a un procedimiento después de la comprobación. Aquí está mi código sugerido:
@Override public void onCreate(Bundle me) { super.onCreate(me); setContentView(R.layout.examrules); Intent checkIntent = new Intent(); checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == MY_DATA_CHECK_CODE) { if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { // success, create the TTS instance tts = new TextToSpeech(this, this); this.speak(); } else { // missing data, install it Intent installIntent = new Intent(); installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); //tts.isLanguageAvailable(Locale.INDIA_HINDI); startActivity(installIntent); } } } @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { // tts.setLanguage(Locale.US); Locale loc = new Locale ("IN", "en"); tts.setLanguage(loc); Toast.makeText(ExamRulesActivity.this, "Text-To-Speech engine is initialized", Toast.LENGTH_LONG).show(); } else if (status == TextToSpeech.ERROR) { Toast.makeText(ExamRulesActivity.this, "Error occurred while initializing Text-To-Speech engine", Toast.LENGTH_LONG).show(); } } public void speak() { int isVoiceEnabled=bundle.getInt("isVoiceEnabled"); setResult(RESULT_OK, intent); if(isVoiceEnabled==1) { String ruleOne="hi."; String ruleTwo= "How are you"; String ruleThree= "will you meet e=me?"; String ruleFour= " No,Ok"; if (ruleOne!=null && ruleOne.length()>0) { tts.speak(ruleOne, TextToSpeech.QUEUE_ADD, null); tts.speak(ruleTwo, TextToSpeech.QUEUE_ADD, null); tts.speak(ruleThree, TextToSpeech.QUEUE_ADD, null); tts.speak(ruleFour, TextToSpeech.QUEUE_ADD, null); } } } }
¿No se ejecuta onCreate antes de onActivityResult ?
Por lo tanto su objeto tts será nulo. Agregar código adicional para comprobar tts no es nulo antes de llamar a tts.speak
Sólo tienes que copiar estas líneas
Intent checkIntent = new Intent(); checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
Y escribir a continuación, después de escribir setContentView()
Eso porque antes de hacer algo con el objeto TextToSpeach
debe comprobar que los datos están instalados o no.
Así que el error en el código es que escribió todo lo nuevo en ese example
que lo escribió antes de la llamada de intent
.