Привет, я разрабатываю приложение для слепых пользователей, так что я очень часто использую текст в речь, так как практически единственный способ реагировать на действия пользователя.Я решил сделать один глобальный экземпляр TTS работающим так же долго, как приложение.Я реализовал это следующим образом:
package com.simekadam.blindguardian;
import android.content.Context;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
public class SpeechHelper implements OnInitListener {
private static TextToSpeech mTts;
private String text;
private static final SpeechHelper helper = new SpeechHelper();
public static SpeechHelper getInstance(){
return helper;
}
public void say(String text, Context context){
if(mTts == null){
this.text = text;
mTts = new TextToSpeech(context, (OnInitListener) helper);
}
else{
mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
}
@Override
public void onInit(int status) {
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS) {
mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
}
public void stopTTS(){
if(mTts != null){
mTts.shutdown();
mTts.stop();
mTts = null;
}
}
}
Сначала - это работает, НО .. Я хотел проверить наличие таких речевых данных
protected 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);
text = getIntent().getExtras();
}
protected void onActivityResult(
int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// success, create the TTS instance
mTts = new TextToSpeech(this, (OnInitListener) this);
mTts.setLanguage(new Locale("cze", "CZE"));
} else {
// missing data, install it
Intent installIntent = new Intent();
installIntent.setAction(
TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}
Его код с портала для разработчиков Android, но я не могу запустить Activity для результата из класса, который не является дочерним для android.Activity. Пожалуйста, как проверить это, не используя активности, и является ли этот подход вызова TTS правильным?(Я реализовал все это с Activity раньше, но произошла пара утечек памяти из-за неправильно закрытого TTS - и когда я закрывал его должным образом, он должен создаваться снова при каждом вызове - просто слишком медленно ..)