我有一个非常重视使用TTS的应用程序。它工作正常,但我需要调整它。
我在每个屏幕上都使用TTS对象,但这并不好。我希望我只能创建一次TTS对象(比如Singleton)和它们,在我的所有活动中都使用它。
以下是此代码的基本代码:
public class SimOuNaoActivity extends Activity implements OnInitListener{
public TextToSpeech tts;
private int MY_DATA_CHECK_CODE = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
tts.speak("Testing 1,2,3", TextToSpeech.QUEUE_ADD, null);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
tts = new TextToSpeech(this, this);
} else {
// missing data, install it
Intent installIntent = new Intent();
installIntent
.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
// Toast.LENGTH_LONG).show();
} else if (status == TextToSpeech.ERROR) {
// Toast.LENGTH_LONG).show();
}
}
@Override
public void onDestroy() {
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroy();
System.gc();
}
}
在我的所有活动中使用TTS对象的正确方法是什么?请记住它使用了一些方法,比如startActivityForResult等......所以...我想知道我能做些什么来使这项工作正常。
有人可以帮助我吗?
感谢任何帮助!
谢谢!
答案 0 :(得分:0)
看看这里分享活动和程序之间的东西与Android中的更好的设计: Intent.putExtras size limit?
答案 1 :(得分:0)
你可能想要在Application中实例化并保存你的Singleton对象,它只能被实例化一次,所以只需将你的TTS初始化代码放在它自己的类中,并将该类实例化为你的Application中的一个对象。您需要将应用程序传递给您的TTS类作为将实例化TTS的上下文。
public class MyApplication extends Application {
public MyTTS myTTS;
public void onCreate() {
myTTS = new MyTTS(this);
}
}
然后你可以在Activities中使用getApplication()。myTTS.whateverMethodsYouMake(yadayada)来访问Application-Singleton-ified TTS类。
答案 2 :(得分:0)
这是相对简单的-只需按以下方式实现它,不要忘记将它作为上下文,应用程序上下文(this.getApplicationContext()
)而不是活动上下文传递。
public class SingletonTTS {
private static SingletonTTS instance;
private static Context ctx;
private TextToSpeech mTTS;
private static boolean TTSready = false;
private SingletonTTS(Context context) {
ctx = context;
mTTS = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int i) {
TTSready = true;
configTTS();
}
});
}
public static synchronized SingletonTTS getInstance(Context context) {
if (instance == null) {
instance = new SingletonTTS(context);
}
return instance;
}
public static boolean isTTSready(){
return TTSready;
}
private void configTTS() {
Toast.makeText(ctx, "supports " + mTTS.isLanguageAvailable(Locale.getDefault()), Toast.LENGTH_LONG).show();
int available = mTTS.isLanguageAvailable(Locale.getDefault());
if( available != TextToSpeech.LANG_MISSING_DATA
&& available != TextToSpeech.LANG_NOT_SUPPORTED ){
mTTS.setLanguage(new Locale(Locale.getDefault().getLanguage()) );
} else {
/** TODO SAVE */
}
}
public void speakSentence(String sentence){
mTTS.speak(sentence, TextToSpeech.QUEUE_ADD, null);
}
}