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?