2012-01-18 21 views
1

我試圖使用文本到語音,但獲得nullpointerexception.I有許多textviews文本init.what我試圖做的是當用戶點擊此文本瀏覽而不是文本到語音來說明在該特定文本瀏覽中的文本。以下是我的兩個類的代碼,用於處理文本到語音的轉換。我還標記了我所獲得的行nullpointerexception.Please告訴我,我做錯了什麼?!謝謝。無法從非活動類獲得文本到語音的工作

我TextSpeaker類:​​

public class TextSpeaker implements OnInitListener{ 

TextToSpeech tts; 
public TextSpeaker(Context c,OnInitListener listener){ 
    tts = new TextToSpeech(c,listener); //Getting NullPointerException here 
} 

@Override 
public void onInit(int status) { 
    if(status != TextToSpeech.ERROR){ 
     tts.setLanguage(Locale.US); 
    } 

} 

}

我TextViewClick類:

public class TextViewClick implements OnClickListener{ 
public String textHolder; 
Context c; 
TextToSpeech.OnInitListener listener; 
TextSpeaker tts1 = new TextSpeaker(c,listener); //Getting NullPointerException here 
@Override 
public void onClick(View v) { 
    TextView tv=(TextView) v; 
    tv.setTextColor(R.color.red); 
    textHolder = (String) tv.getText(); 
    System.out.println(textHolder); 
    tts1.tts.speak(textHolder, TextToSpeech.QUEUE_FLUSH, null); 

} 

}

我logcat的消息:

01-18 13:59:20.017: E/AndroidRuntime(323): FATAL EXCEPTION: main 
01-18 13:59:20.017: E/AndroidRuntime(323): java.lang.NullPointerException 
01-18 13:59:20.017: E/AndroidRuntime(323): at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:407) 
01-18 13:59:20.017: E/AndroidRuntime(323): at blah.blah.com.TextSpeaker.<init>(TextSpeaker.java:13) 
01-18 13:59:20.017: E/AndroidRuntime(323): at independent.vervecoders.com.TextViewClick.<init>(TextViewClick.java:13) 
01-18 13:59:20.017: E/AndroidRuntime(323): at independent.vervecoders.com.Independent.onClick(Independent.java:86) 
01-18 13:59:20.017: E/AndroidRuntime(323): at android.view.View.performClick(View.java:2408) 
01-18 13:59:20.017: E/AndroidRuntime(323): at android.view.View$PerformClick.run(View.java:8816) 
01-18 13:59:20.017: E/AndroidRuntime(323): at android.os.Handler.handleCallback(Handler.java:587) 
01-18 13:59:20.017: E/AndroidRuntime(323): at android.os.Handler.dispatchMessage(Handler.java:92) 
01-18 13:59:20.017: E/AndroidRuntime(323): at android.os.Looper.loop(Looper.java:123) 
01-18 13:59:20.017: E/AndroidRuntime(323): at android.app.ActivityThread.main(ActivityThread.java:4627) 
01-18 13:59:20.017: E/AndroidRuntime(323): at java.lang.reflect.Method.invokeNative(Native Method) 
01-18 13:59:20.017: E/AndroidRuntime(323): at java.lang.reflect.Method.invoke(Method.java:521) 
01-18 13:59:20.017: E/AndroidRuntime(323): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
01-18 13:59:20.017: E/AndroidRuntime(323): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
01-18 13:59:20.017: E/AndroidRuntime(323): at dalvik.system.NativeStart.main(Native Method) 
+0

您是否在電話設置中啓用了文字轉語音功能? – harbinja 2012-01-18 22:32:52

回答

2

看起來您的上下文從未初始化。確保在調用TextSpeaker的構造函數之前初始化上下文。

你也不需要傳遞一個onInitListener,你的TextSpeaker已經是一個OnInitListener。您可以在TextViewClick試試這個:

public class TextViewClick implements OnClickListener 
{ 
    public String textHolder; 

    public TextViewClick(Context c) 
    { 
    TextSpeaker tts1 = new TextSpeaker(c); 
    } 

    @Override 
    public void onClick(View v) 
    { 
    TextView tv=(TextView) v; 
    tv.setTextColor(R.color.red); 
    textHolder = (String) tv.getText(); 
    System.out.println(textHolder); 
    tts1.tts.speak(textHolder, TextToSpeech.QUEUE_FLUSH, null); 
    } 
} 

和你TextSpeaker會改變,以及:

public class TextSpeaker implements OnInitListener 
{ 
    TextToSpeech tts; 

    public TextSpeaker(Context c) 
    { 
    tts = new TextToSpeech(c, this); 
    } 

    @Override 
    public void onInit(int status) { 
    if(status != TextToSpeech.ERROR){ 
     tts.setLanguage(Locale.US); 
    } 
    } 
} 

另外,請確保您已啓用TTS在您的設備設置。

+0

謝謝你的答覆。它工作! – Viking 2012-01-18 23:15:40