एक समय पहले, मुझे लगता है कि playEarcon()
never producesonUtteranceCompleted()
की खोज की।TTSService में क्या playEarcon() के लिए अंतर्निहित पूर्ण() की कमी की व्याख्या कर सकता है?
समय मैं सिर्फ प्रलेखन कि कहा व्याख्या पर "कहा जाता है जब एक कथन संश्लेषित कर दिया गया है" के रूप में onUtteranceCompleted()
इयरकॉन के लिए लागू नहीं किया जा रहा है, क्योंकि एक earcon वास्तव में टीटीएस synthesization का एक परिणाम नहीं है।
लेकिन एंड्रॉइड के स्रोत कोड को फिर से देखकर, मुझे बस एक स्पष्टीकरण नहीं मिल रहा है जो मेरी व्याख्या को औचित्य देगा।
my test jig के बारे में कुछ तथ्य:
onUtteranceCompleted()
हमेशा कथन आईडी earcon पूर्ववर्ती के लिए आता है। यह उच्चारण एक सामान्य टीटीएस उच्चारण है, एक कानकॉन नहीं।- के बाद कानकॉन खेलता है (यानी बिल्कुल वांछित)।
onUtteranceCompleted()
उस कान के लिए कभी भी दिखाई देता है। यह बहुत ही संगत और पुनरुत्पादित व्यवहार है।:
TtsService स्रोत कोड में गहरी delving, वहाँ केवल 2 तरीकों कि onUtteranceCompleted()
के आगमन (या अनुपस्थिति) को प्रभावित कर सकता होने लगते हैं यदि आप उस कोड की जांच करते हैं, तो आप देखेंगे कि एक तीसरा उम्मीदवार, TtsService.getSoundResource() अस्वीकार कर दिया गया है (मेरे ई के लिए निरंतरता की कमी के लिए ज़िम्मेदार होने के नाते arcon) वास्तव में ऊपर # 2 की वजह से: कानकॉन हमेशा खेलता है, इसलिए getSoundResource()
संभवतः शून्य वापस नहीं कर सकता है।
एक ही तर्क का उपयोग, 1 उम्मीदवार, TtsService.processSpeechQueue(), यह भी संभावना से इनकार किया जा सकता है एक ही # 2 तथ्य के लिए,: earcon हमेशा निभाता है, इसलिए निम्नलिखित 2 महत्वपूर्ण बयान हमेशा क्रियान्वित कर रहे हैं:
1108 mPlayer.setOnCompletionListener(this);
...
1111 mPlayer.start();
public void onCompletion(MediaPlayer arg0) {
// mCurrentSpeechItem may become null if it is stopped at the same
// time it completes.
SpeechItem currentSpeechItemCopy = mCurrentSpeechItem;
if (currentSpeechItemCopy != null) {
String callingApp = currentSpeechItemCopy.mCallingApp;
ArrayList<String> params = currentSpeechItemCopy.mParams;
String utteranceId = "";
if (params != null) {
for (int i = 0; i < params.size() - 1; i = i + 2) {
String param = params.get(i);
if (param.equals(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID)) {
utteranceId = params.get(i + 1);
}
}
}
if (utteranceId.length() > 0) {
dispatchUtteranceCompletedCallback(utteranceId, callingApp);
}
}
processSpeechQueue();
}
वहाँ में, वहाँ केवल 2 की स्थिति है कि पी विफल हो जाएगा रहे हैं: तो, हम क्यों एक playEarcon()
never producesonUtteranceCompleted()
के लिए एक संभावित व्याख्या के रूप में, केवल 2 उम्मीदवार, TtsService.onCompletion() साथ छोड़ दिया जाता है roduce dispatchUtteranceCompletedCallback():
- currentSpeechItemCopy == बातिल
- utteranceId.length() == 0
लेकिन मुझे यकीन है के लिए पता है कि हालत # 2 की संभावना से इनकार किया जा सकता है, क्योंकि मैं सब utteranceIds लॉग इन करें और कानकॉन निश्चित रूप से वहाँ हैं।
इसके अलावा, पूरे सिस्टम लॉग की जांच:
Log.v(SERVICE_TAG, "TTS callback: dispatch started");
लापता onUtteranceCompleted()
dispatchUtteranceCompletedCallback() नहीं बुलाया जा रहा है का परिणाम हो सकता है, लेकिन यह भी अशक्त लौटने mCallbacksMap.get(packageName)
का परिणाम हो सकता है।
- समय एक earcon के onCompletion() कहा जाता है, earcon के
mCurrentSpeechItem
रिक्त है द्वारा:तो, हम 2 संभावनाओं, जो दोनों के लिए मुझे बहुत भावना को नहीं बनाते हैं के साथ फिर से छोड़ दिया जाता है। लेकिन क्यों?
- mCallbacksMap खाली है। यह क्या है और यह कभी भी आबादी कब मिलता है?
कोई सुझाव या इस रहस्य को सुलझाने के लिए अन्य स्पष्टीकरण?
हम एक ही समस्या है, वैकल्पिक हल earcon के बाद एक खाली कथन जोड़ना है। यह नए एपीआई संस्करणों (16) * डू * इयरकॉन के लिए कॉलबैक का उत्पादन भी करता है, इसमें देखकर। –
'टेक्स्टटॉस्पेच' contstructor में भी एक बुरा दौड़ की स्थिति है जो आपके 'ऑनइन' हैंडलर को टीटीएस इंजन के लिए न्यूल (लगभग 1% मौका) तक पहुंचने का कारण बनती है, क्योंकि यह कॉलबैक पैरामीटर में नहीं आती है! कन्स्ट्रक्टर निष्पादन खत्म होने से पहले यह वास्तव में आपके 'onInit' को कॉल करता है। यह बहुत गंभीर है, क्योंकि वे आप 'onInit' में प्रारंभ (' setOnUtteranceComplete', 'addEarcon') करने की उम्मीद। –
emulators में जांच की गई और 'playEarcon' अब एक कॉलबैक जब यह खेल रहे हैं किया जाता है भेजता है। यह एपीआई 15 और उच्चतर पर है। आप निचले एपीआई के लिए पिछली टिप्पणी में उल्लिखित वर्कअराउंड का उपयोग कर सकते हैं। –