来自非活动简单类的文本到语音

时间:2016-10-28 16:50:12

标签: android text-to-speech

我试图通过一个简单的类来调用文本到语音,我在其中进行图像操作 由于文本到语音TextToSpeech需要上下文作为参数,我无法将其传递给它

是否有任何解决方案

1 个答案:

答案 0 :(得分:0)

例如,您可以在其构造函数中将有效的Context传递给您的简单类,然后您可以使用简单类中的TTS:

public class MySimpleClass implements TextToSpeech.OnInitListener {

  private TextToSpeech tts;
  private boolean ttsOk;

  // The constructor will create a TextToSpeech instance.
  MySimpleClass(Context context) {
    tts = new TextToSpeech(context, this);
  }

  @Override
  // OnInitListener method to receive the TTS engine status
  public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
      ttsOk = true;
    }
    else {
      ttsOk = false;
    }
  }

  // A method to speak something
  @SuppressWarnings("deprecation") // Support older API levels too.
  public void speak(String text, Boolean override) {
    if (ttsOk) {
      if (override) {
        tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);    
      }    
      else {
        tts.speak(text, TextToSpeech.QUEUE_ADD, null);    
      }
    }
  }

  // Other code goes here...

}

根据具体的应用程序设计,Context可以是Activity或应用程序上下文。如果接收上下文引用的类的生命周期超过提供它的类的生命周期,则应使用后一个。例如,Activity可能会被销毁,而引用它的类仍然存在。这会影响垃圾收集和泄漏记忆。

另一种选择是将所有TTS代码保留在Activity中,这是在"简单类"使用代码,传递"简单类"引用Activity并在Activity中使用公开方法接收需要说出的文字:

public class MySimpleClass {

  private MyActivity myActivity;

  // The constructor receives a reference to the Activity.
  MySimpleClass(MyActivity activity) {
    myActivity = activity;
  }

  // Other code goes here...

  myActivity.speak("Hello, Stackoverflow!");

}

再次传递对Activity的引用时,应该考虑类的生命周期,并避免在Activity被销毁后仍然存在的类中引用。 / p>

另一种选择是为TTS代码设置一个单独的类。它将Context作为构造函数参数并提供说出任何给定文本的方法。 this answer to another question中有一个简单的例子。

相关问题