Em Android, quando queremos verificar se o motor de Text-To-Speech tem dados de linguagem disponíveis, perguntamos à plataforma lançando um intent. O problem é que, começando com o Jelly Bean (4.1), esta chamada vai devolver CHECK_VOICE_DATA_MISSING_DATA
mesmo quando alguns recursos de linguagem estão instalados. Apenas quando TODOS os ficheiros de linguagem estão instalados, é que esta verificação vai passar com sucesso. Esta é uma mudança de comportamento relativamente a versões mais antigas.
Verificar a instalação de dados de linguagem
Se querem verificar se recursos de TTS estão instalados, usam o seguinte intent numa activity:
public static final int VOICE_DATA_CHECK = 1;
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, VOICE_DATA_CHECK);
VOICE_DATA_CHECK
é um valor inteiro que definem para identificar a chamada (por exemplo, VOICE_DATA_CHECK = 1
).
Instalar dados TTS apenas quando necessário
Antes do Jelly Bean (4.1), esta chamada devolvia CHECK_VOICE_DATA_PASS
(sucesso) quando pelo menos um ficheiro de linguagem estava correctamente instalado. No entanto, desde o Jelly Bean, que apenas devolve CHECK_VOICE_DATA_PASS
quando TODOS os recursos de linguagem estão correctamente instalados.
Devem ter isto em conta quando decidem o que fazer quando recebem o resultado da activity. Para lidarem com o resultado desta chamada, fazem override a onActivityResult
:
private TextToSpeech mTts;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == VOICE_DATA_CHECK) {
ArrayList<String> availableLanguages = data.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES);
if (availableLanguages.isEmpty()) {
// no language data available, prompt for install
Intent installIntent = new Intent();
installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
} else {
// some language data is available, create TTS instance
mTts = new TextToSpeech(this, this);
}
}
}
Claro que podem sempre criar uma condição diferente, por exemplo verificando se uma linguagem em particular está disponível para usar.
Verificar que linguagens o motor de TTS suporta
Também podem verificar que linguagens é que o motor de TTS suporta, mas cujos ficheiros de linguagem estão em falta, com o seguinte extra:
ArrayList<String> unavailableLanguages = data.getStringArrayListExtra(TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES);
Isto vai-vos dar uma lista das linguagens que o TTS pode usar, mas para as quais existem ficheiros em falta. Se juntarem as linguagens que não estão disponíveis às que estão, obtêm todas as linguagens suportadas pelo motor de TTS.