Search code examples
javaandroidtext-to-speech

Not able to get Text-to-Speech work from an non-activity class


I tried to use Text-to-Speech but getting an nullpointerexception.I have many textviews with text init.what i tried to do is that when user clicks on this textviews than text-to-speech speaks up the text which is on that particular textview.Following is the code of 2 of my classes which handles text-to-speech.I have also marked down the lines where i'm getting the nullpointerexception.Please tell me what am i doing wrong?! Thank you.

My TextSpeaker class:

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

}

}

My TextViewClick class:

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

}

}

My logcat messages:

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)

Solution

  • It appears that your Context is never initialized. Make sure that you initialize the context before you call the constructor for TextSpeaker.

    You also don't need to pass an onInitListener, your TextSpeaker is already an OnInitListener. You can try this in your 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);
      }
    }
    

    And your TextSpeaker would change as well:

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

    In addition, make sure you have enabled TTS in your device settings.