2012-05-09 3 views
1

Android permet à une application d'interroger la plate-forme pour la disponibilité des fichiers de langue: il suffit d'instancier l'intention ci-dessous et de l'envoyer dans une requête asynchrone en utilisant la méthode startActivityForResult.Pourquoi la liste des voix indisponibles est-elle toujours vide?

Intent checkIntent = new Intent(); 
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
startActivityForResult(checkIntent, TTS_CHECK_DATA_REQUEST_CODE); 

Le résultat de cette demande est renvoyée en appelant la méthode onActivityResult: le second argument est une valeur qui représente le succès ou l'échec de la demande ci-dessus, et le troisième argument contient des données supplémentaires. Parmi les données supplémentaires, il y a deux listes (éventuellement vides):

  • les voix disponibles;

    ArrayList<String> availableVoices = data.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES); 
    Log.i(LOG_TAG, String.format("Available voices: %s %s", availableVoices.size(), availableVoices.toString())); 
    
  • les voix indisponibles.

    ArrayList<String> unavailableVoices = data.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES); 
    Log.i(LOG_TAG, String.format("Unavailable voices: %s %s", unavailableVoices.size(), unavailableVoices.toString())); 
    

Dans le cas d'une simple demande comme celle ci-dessus, la liste des voix non disponibles est vide, alors que le tableau de voix disponibles est rempli de toutes les voix installées sur le système.

Le comportement change si vous ajoutez le TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR supplémentaire: selon la documentation, ce supplément est utilisé pour donner des instructions au moteur TTS qui vérifie certaines voix spécifiques. Voici un exsample de code source:

ArrayList<String> checkVoiceDataFor = new ArrayList<String>(3); 
checkVoiceDataFor.add("ita-ITA"); // installed on emulator 
checkVoiceDataFor.add("eng-USA-female"); // not installed 
checkVoiceDataFor.add("eng-USA"); // installed on emulator 
Intent checkIntent = new Intent(); 
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
checkIntent.putStringArrayListExtra(TextToSpeech.Engine.EXTRA_CHECK_VOICE_DATA_FOR, checkVoiceDataFor); 

Je pense que la réponse contient:

  • ita-ITA et eng-USA dans la liste des voix disponibles;
  • fra-USA-female dans la liste des voix indisponibles.

Cependant, les résultats sont les suivants:

  • voix disponibles: 2 [fr-USA ita-ITA]
  • voix: Non disponible 0 []

Pourquoi?

Répondre

1

Pour les voix non disponibles, j'utiliser les éléments suivants:

ArrayList<String> unavailable = data 
      .getStringArrayListExtra("unavailableVoices"); 

Les résultats sont toujours au format 'fra-GBR' ou tout simplement 'eng'. Si j'ai mal compris, vous vous posez la question et vous vous demandez pourquoi vous n'obtenez pas un résultat 'indisponible' spécifiquement pour votre recherche 'eng-USA-female' (plutôt que du tout), alors je ne peut que suggérer que le format n'est pas adapté pour être passé à la recherche. Je suggérerais de chercher 'zzz-ZZZ' pour voir où se trouve le vrai problème ...

Espérons que ça aide.

Questions connexes