मेरे एंड्रॉइड एप्लिकेशन में फीचर बोलने के लिए टेक्स्ट है और फिर एक गतिविधि इस सुविधा का उपयोग करती है। इसलिए इसे आसान बनाने के लिए एक स्थिर सहायक वर्ग बनाया।एंड्रॉइड "बोलने में असफल रहा: टीटीएस इंजन से बंधे नहीं"
import java.util.Locale;
import android.content.Context;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.util.Log;
public class TextToSpeechController implements OnInitListener {
private static final String TAG = "TextToSpeechController";
private TextToSpeech myTTS;
private String textToSpeak;
private Context context;
private static TextToSpeechController singleton;
public static TextToSpeechController getInstance(Context ctx) {
if (singleton == null)
singleton = new TextToSpeechController(ctx);
return singleton;
}
private TextToSpeechController(Context ctx) {
context = ctx;
}
public void speak(String text) {
textToSpeak = text;
if (myTTS == null) {
// currently can't change Locale until speech ends
try {
// Initialize text-to-speech. This is an asynchronous operation.
// The OnInitListener (second argument) is called after
// initialization completes.
myTTS = new TextToSpeech(context, this);
} catch (Exception e) {
e.printStackTrace();
}
}
sayText();
}
public void onInit(int initStatus) {
if (initStatus == TextToSpeech.SUCCESS) {
if (myTTS.isLanguageAvailable(Locale.UK) == TextToSpeech.LANG_AVAILABLE)
myTTS.setLanguage(Locale.UK);
}
// status can be either TextToSpeech.SUCCESS or TextToSpeech.ERROR.
if (initStatus == TextToSpeech.SUCCESS) {
int result = myTTS.setLanguage(Locale.UK);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e(TAG, "TTS missing or not supported (" + result + ")");
// Language data is missing or the language is not supported.
// showError(R.string.tts_lang_not_available);
} else {
// Initialization failed.
Log.e(TAG, "Error occured");
}
}
}
private void sayText() {
// ask TTs to say the text
myTTS.speak(this.textToSpeak, TextToSpeech.QUEUE_FLUSH, null);
}
public void stopTTS() {
if (myTTS != null) {
myTTS.shutdown();
myTTS.stop();
myTTS = null;
}
}
}
मैं इस तरह के सहायक वर्ग का उपयोग कर रहा हूं।
TextToSpeechController.getInstance(this).speak(readableMessage);
लेकिन कभी-कभी मुझे लॉगकैट पर लाइन बेलोव जैसी त्रुटि दिखाई देती है।
"speak:failed not bound to tts engine"
कोई अपवाद फेंक दिया गया लेकिन टीटीएस द्वारा कुछ भी नहीं पढ़ा गया। मुझे एहसास हुआ कि अगर मैंने ब्रॉडकास्ट रिसीवर से गतिविधि शुरू की, तो मुझे यह त्रुटि मिली। अन्यथा अगर आवेदन कोड से मैन्युअल रूप से खुली गतिविधि कोई समस्या नहीं है।
यहाँ BroadcastReceiver कोड
private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String newMessage = intent.getExtras().getString(EXTRA_MESSAGE);
String readableMessage = intent.getExtras().getString(READABLE_MESSAGE);
Bundle b = new Bundle();
b.putString(EXTRA_MESSAGE, newMessage);
b.putString(READABLE_MESSAGE, readableMessage);
Intent newIntent = new Intent("android.intent.action.MAIN");
newIntent.setClass(context, Speak.class);
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
newIntent.putExtra("MessageReceived", b);
newIntent.putExtra("CallType", CallType.NOTIFICATION);
context.startActivity(newIntent);
}
};
तो मैं यह कैसे कर सकता हूं? Thread.Sleep? मैं नहीं कह सकता कि बोलने तक प्रतीक्षा करें। –
हाय। क्या हम इस टीटीएस धागे को समानांतर में शुरू कर सकते हैं? –