34 votes

Qu'est-ce qui dans TtsService pourrait expliquer le manque d'onUtteranceCompleted () pour playEarcon ()?

Il y a un moment, j'ai découvert qu' playEarcon() produit jamais onUtteranceCompleted().

En fait, j'ai interprété la documentation qui a dit "Appelle quand un énoncé a été synthétisé" comme onUtteranceCompleted() n'étant pas applicable pour les earcons parce que, d'une earcon n'est pas vraiment un résultat de TTS synthesization.

Mais en regardant de nouveau Android code source, j'ai simplement ne peut pas trouver une explication qui pourrait justifier mon interprétation.

Quelques faits au sujet de mon test de gabarit:

  1. onUtteranceCompleted() arrive toujours pour exprimer ID précédant la earcon. Cette parole est une parole TTS, pas un earcon.
  2. Le earcon après que ne jouer (c'est à dire exactement comme prévu).
  3. onUtteranceCompleted() pour que earcon jamais présente. C'est très cohérent et reproductible comportement.

Creusant profondément dans l'TtsService code source, il semble y avoir seulement 2 méthodes qui pourraient nuire à l'arrivée (ou l'absence) d' onUtteranceCompleted():

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

Si vous examinez le code, vous verrez que d'un 3ème candidat, TtsService.getSoundResource() est exclu (comme étant responsable de l'absence de onUtteranceComplete pour mon earcon) en raison du fait #2 ci-dessus: Le earcon joue toujours, par conséquent getSoundResource() ne peut pas retourner la valeur null.

Selon la même logique, le 1er candidat, TtsService.processSpeechQueue(), peut également être exclu, pour le même fait #2: Le earcon joue toujours, d'où les 2 suivants énoncés critiques sont toujours exécutées:

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

Donc, on se retrouve avec le 2ème candidat seulement, TtsService.onCompletion(), pour tenter d'expliquer pourquoi un playEarcon() produit jamais 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();
}

Là, il y a seulement 2 conditions ne parviennent pas à produire dispatchUtteranceCompletedCallback():

  1. currentSpeechItemCopy == null
  2. utteranceId.length() == 0

Mais je sais pour sûr que la condition #2 peut être écartée parce que je me connecte tous les utteranceIds et la earcon sont bel et bien là.

Aussi, l'examen de l'ensemble du journal système:

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

Le manque onUtteranceCompleted() pourrait être le résultat de dispatchUtteranceCompletedCallback() de ne pas être appelé, mais il peut également être le résultat d' mCallbacksMap.get(packageName) retourner null.

Donc, nous sommes de nouveau à gauche avec 2 possibilités, qui ne sont pas faites pour moi beaucoup de sens:

  1. Par le temps un earcon de onCompletion() est appelée, earcon de l' mCurrentSpeechItem a la valeur null. Mais pourquoi?
  2. mCallbacksMap est vide. Quel est-il et quand ne l'est-il plus peuplée?

Toutes les suggestions ou d'autres explications pour résoudre ce mystère?

1voto

alanv Points 2913

Vérifier android.de la parole.tts.Synthèse vocale#playEarcon() à la ligne 807. Les params argument passé à la conversion texte-parole du service binder est null, ce qui signifie que le service ne reçoit jamais de votre énonciation ID.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X