2012-04-08 5 views
6

Ich erstelle eine Anwendung auf TextToSpeech. Aber wenn ich versuche zu laufen, wird in der folgenden Zeile eine Ausnahme ausgelöst.TextToSpeech zeigen Null Zeiger Ausnahme?

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

Here is my full code for reference
Bitte geben Sie mir jeden Hinweis. Ich verstehe nicht, was in meinem Code falsch ist. Wenn ich meinen Code kompiliere, werden alle Werte korrekt übergeben, aber wenn er auf das obige TTS-Objekt springt, trifft er auf die Nullzeiger-Ausnahme. ist irgendeine Syntax falsch? Welche Methode ruft zuerst onCreate() oder onActivityResult auf? Vielen Dank im Voraus

Hier ist Logcat Inhalt.

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

Bitte posten Sie die volle Stack-Trace. –

+0

@LukasKnuth hier füge ich Logcat –

Antwort

9

Schreib

tts = new TextToSpeech(this, this); 

in Ihrer wenn Schleife in onCreate() -Methode.

2

Ist das nicht onCreate Lauf vor onActivityResult?

Daher wird Ihr TTS-Objekt null sein. Fügen Sie Zusatzcode tts zu überprüfen, ist nicht null, bevor Sie anrufen tts.speak

+0

danke ..... Wie man das löst? –

+0

pls schlagen Änderungen in meinem Code –

+0

vor, wie Dhruvisha sagt –

3

Als Dhruvisha und andy Boot vorgeschlagen, ist der Nullpointer offensichtlich, weil onCreate vor onActivityResult ausgeführt wird. Mein Vorschlag ist, Ihren gesamten Code, der tts verwendet, zu einem Verfahren nach der Überprüfung zu bringen. Hier ist meine vorschlagen Code:

@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

Sie müssen nur diese Zeilen kopieren

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

und schreiben dann direkt nach setContentView()

schrieb, dass, weil, bevor irgendetwas mit dem TextToSpeach Objekt tun Sie müssen überprüfen, ob Daten installiert sind oder nicht.

Also der Fehler im Code ist, dass Sie alles neue in diesem example schrieb Sie vor dem intent Anruf geschrieben.