我试图通过一个简单的类来调用文本到语音,我在其中进行图像操作 由于文本到语音TextToSpeech需要上下文作为参数,我无法将其传递给它
是否有任何解决方案
答案 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中有一个简单的例子。