2012-04-08 15 views
6

Sto creando un'applicazione su TextToSpeech. Ma quando sto provando a correre, genera un'eccezione sulla riga seguente.TextToSpeech mostra Null Pointer Exception?

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

Here is my full code for reference
Si prega di darmi qualche suggerimento. Non capisco cosa c'è di sbagliato nel mio codice. quando compilo il mio codice tutti i valori passano correttamente, ma quando salta sopra sopra l'oggetto colpisce l'eccezione del puntatore nullo. c'è qualche sintassi sbagliata? quale metodo chiama prima suCreate() o suActivityResult? Grazie in anticipo

Ecco il contenuto di 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

Si prega di inviare l'intera traccia dello stack. –

+0

@LukasKnuth qui aggiungo Logcat –

risposta

9

scrittura

tts = new TextToSpeech(this, this); 

nel vostro metodo se loop in onCreate().

2

Non è onCreate corsa prima onActivityResult?

Pertanto il tuo oggetto tts sarà nullo. Aggiungere codice aggiuntivo per controllare TTS non è nullo prima di chiamare tts.speak

+0

grazie ..... Come risolvere questo? –

+0

pls suggeriscono modifiche nel mio codice –

+0

come dice Dhruvisha –

3

Come Dhruvisha e andy avvio suggerito, la NullPointerException è evidente perché onCreate viene eseguito prima onActivityResult. Il mio suggerimento è di portare tutto il codice che usa tts in una procedura dopo il controllo. Qui è la mia suggeriscono codice:

@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

Hai solo bisogno di copiare questo le linee

Intent checkIntent = new Intent(); 
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); 

e scrivere poi a destra dopo che hai scritto setContentView()

che perché prima di fare qualsiasi cosa con l'oggetto TextToSpeach È necessario verificare che i dati siano installati o meno.

Quindi l'errore nel codice è che hai scritto tutto di nuovo in quello example che hai scritto prima della chiamata intent.