Android中的TTS和Singleton

时间:2012-02-24 22:56:46

标签: android singleton text-to-speech

我有一个非常重视使用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等......所以...我想知道我能做些什么来使这项工作正常。

有人可以帮助我吗?

感谢任何帮助!

谢谢!

3 个答案:

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

}