2012-04-08 16 views
6

Estoy creando una aplicación en TextToSpeech. Pero cuando intento ejecutar, arroja una excepción en la siguiente línea.TextToSpeech muestra la excepción del puntero nulo?

tts.speak(ruleOne, TextToSpeech.QUEUE_ADD, null); 

Here is my full code for reference
Por favor, dame cualquier indicio. No entiendo qué está mal en mi código. cuando compilo mi código, todos los valores pasan correctamente pero cuando salta sobre el objeto tts, golpea la excepción del puntero nulo. ¿Hay alguna sintaxis incorrecta? ¿Qué método llama primero a Crear() o a Resultado de actividad? Gracias de antemano

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) 
+0

Por favor, publique el stack-trace completo. –

+0

@LukasKnuth aquí agrego Logcat –

Respuesta

9

escritura

tts = new TextToSpeech(this, this); 

en su método si el rizo en onCreate().

2

No es onCreate carrera antes onActivityResult?

Por lo tanto, su objeto tts será nulo. Añadir un código adicional para comprobar TTS no es nulo antes de llamar tts.speak

+0

gracias ..... ¿Cómo resolver esto? –

+0

pls sugieren cambios en mi código –

+0

haga lo que dice Dhruvisha –

3

Como sugirió Dhruvisha y Andy arranque, el NullPointerException es obvio porque onCreate se ejecuta antes de onActivityResult. Mi sugerencia es traer todo el código que usa tts a un procedimiento después del control. Aquí está mi sugiere código:

@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); 

       }  
     } 
    } 

} 
0

Sólo tiene 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 luego a la derecha después de que escribió setContentView()

que debido a que antes de hacer cualquier cosa con el objeto TextToSpeach Debe verificar 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 lo escribió antes de la llamada intent.

Cuestiones relacionadas