Intereting Posts
Цель камеры или галереи уничтожает старую активность на некоторых устройствах Проблемы с генетикой в ​​окнах 10 Больше не требуется ActivityManager – не проблема службы Как я могу не допустить, чтобы активность Android вкратце попадала в портретный режим, когда я указал пейзаж? Listview перезагружает уже загруженные изображения с помощью универсального загрузчика изображений Является ли Parse.com подходящей услугой для резервного копирования / синхронизации с SQLite в Android? Android EditText / TextView, как заставить каждое слово начинаться с верхнего регистра, а все остальные символы слов – строчными буквами Clickable CardView внутри NestedScroll не вызывает прокрутку Я могу использовать просмотр пейджера с представлениями (а не с фрагментами) AVD Невозможно протестировать любое приложение с помощью AVD Шифрование AES: InvalidKeyException: длина ключа не 128/192/256 бит RunOnUiThread Undefined для класса Android эмулятор не запускается в MacOS 10.10 Таймер в фоновом режиме Bluetooth с низким энергопотреблением и защита данных

Что в TtsService могло объяснить отсутствие onUtteranceCompleted () для playEarcon ()?

Некоторое время назад я обнаружил, что playEarcon() никогда не производит onUtteranceCompleted() .

В то время я просто интерпретировал документацию, в которой говорилось: «Вызывается, когда произнесение было синтезировано », поскольку onUtteranceCompleted() не применимо для earcons, потому что earcon на самом деле не является результатом синтеза TTS.

Но, глядя снова на исходный код Android, я просто не могу найти объяснения, которые оправдали бы мою интерпретацию.

Несколько фактов о моем тестовом приспособлении :

  1. onUtteranceCompleted() всегда приходит для идентификатора высказывания, предшествующего earcon. Это высказывание – обычное высказывание TTS, а не ухо.
  2. Урок после этого разыгрывается (т.е. точно так, как предполагалось).
  3. onUtteranceCompleted() для этого наушника никогда не появляется. Это очень последовательное и воспроизводимое поведение.

Вдаваясь глубоко в исходный код TtsService, похоже, всего 2 метода, которые могут повлиять на приход (или отсутствие) onUtteranceCompleted() :

  1. TtsService.processSpeechQueue ()
  2. TtsService.onCompletion ()

Если вы изучите этот код, вы увидите, что 3-й кандидат, TtsService.getSoundResource () исключен (как ответственный за отсутствие onUtteranceComplete для моего наушника) из-за факта № 2 выше: ушник всегда играет, следовательно, getSoundResource() Не может возвращать null.

Используя ту же логику, 1-й кандидат, TtsService.processSpeechQueue () , также может быть исключен из-за того же факта # 2: Earcon всегда играет, следовательно, всегда выполняются следующие два критических утверждения:

 1108 mPlayer.setOnCompletionListener(this); ... 1111 mPlayer.start(); 

Итак, у нас остается только второй кандидат, TtsService.onCompletion () , как возможное объяснение того, почему playEarcon() никогда не производит onUtteranceCompleted() :

 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 условия, которые не смогут выполнить dispatchUtteranceCompletedCallback () :

  1. CurrentSpeechItemCopy == null
  2. UtteranceId.length () == 0

Но я точно знаю, что условие №2 можно исключить, потому что я регистрирую все выражения utteranceIds, и учетные записи определенно существуют.

Кроме того, проверка всего системного журнала:

 Log.v(SERVICE_TAG, "TTS callback: dispatch started"); 

onUtteranceCompleted() может быть результатом отправки диспетчераUtteranceCompletedCallback () , но он также может быть результатом mCallbacksMap.get(packageName) .

Итак, мы снова остаемся с двумя возможностями, которые не имеют для меня большого смысла:

  1. К тому моменту, когда вызывается вызов onCompletion () , функция mCurrentSpeechItem для mCurrentSpeechItem имеет значение null. Но почему?
  2. MCallbacksMap пуст. Что это такое и когда оно когда-либо заселяется?

Любые предложения или другие объяснения для решения этой тайны?

Solutions Collecting From Web of "Что в TtsService могло объяснить отсутствие onUtteranceCompleted () для playEarcon ()?"

Проверьте android.speech.tts.TextToSpeech # playEarcon () в строке 807 . Аргумент params, передаваемый в текстовое сообщение, имеет значение null, что означает, что служба никогда не получает ваш идентификатор высказывания.

  public int playEarcon(String earcon, int queueMode, HashMap<String,String> params) { synchronized (mStartLock) { ... result = mITts.playEarcon(mPackageName, earcon, queueMode, null); } ... }