TTS do Android devolve CHECK_VOICE_DATA_MISSING_DATA

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.

Artigos relacionados