Mídia e Text-to-Speech em Android • Introdução Este artigo talvez seja o artigo menos planejado que já escrevi. Isso porque encontrei por acaso três fontes de informações excelentes, comecei a brincar com os códigos delas e, finalizei em um aplicativo até engraçado. Segue sua descrição: Ao iniciar a aplicação veremos um vídeo de um pouso de avião em um aeroporto. Temos a possibilidade de pausar e reiniciar o vídeo. AO pausar o vídeo, ouviremos uma pergunta feita pelo aplicativo, dizendo: - Porque você quer pausar o vídeo? Com isso veremos duas features que são utilizadas até mesmo com certa freqüência em diversos aplicativos: vídeos e text to speech. Antes de começar deixo aqui os links dos textos que inspiraram este pequeno artigo: •
Android TTS (Text To Speech) Example
•
Media on the Android Platform
•
Android VideoView Example
Com isso, você programador, estará mais preparado para o mercado de trabalho e, também, pode fazer alguns aplicativos para impressionar seus amigos que não nerd. •
Criando a primeira e única tela da aplicação
Veja a Figura 1, nela está nossa primeira e única tela do aplicativo. Ela mostrará o vídeo, e, mais nada.
Figura 1: Primeira tela da aplicação.
Vamos estudar o main.xml, que possivelmente será um dos mais básicos criados até hoje. Veja a Listagem 1: Listagem 1: <?xml version="1.0" encoding="utf-8"?> 01: <LinearLayout android:id="@+id/LinearLayout01" 02: android:layout_height="fill_parent" 03: xmlns:android="http://schemas.android.com/apk/res/android" 04: android:paddingLeft="2px" android:paddingRight="2px" 05: android:paddingTop="2px" android:paddingBottom="2px" 06: android:layout_width="fill_parent" 07: android:orientation="vertical"> 08: <VideoView android:layout_height="fill_parent" 09: android:layout_width="fill_parent" 10: android:id="@+id/VideoView" /> 11: </LinearLayout>
O LinearLayout é um gerenciador de layout extremamente comum em aplicações Android. Suas propriedades também são auto-explicativas. Destacam-se as margens na esquerda (paddingLeft), direita (paddingRight), encima (paddingTop) e embaixo (paddingBottom) e a definição da orientação (android:orientation) como vertical. Na linha 8 temos o VideoView. Seu nome também dispensa comentários, deixando claro qual sua função, ou seja, um componente que trabalha como container de um vídeo.
Agora vamos trabalhar nossa única classe Activity. Veja a Listagem 2: 01:public class ViewVideoEx extends Activity { 02: 03: public void onCreate(Bundle savedInstanceState) { 04: super.onCreate(savedInstanceState); 05: 06: setContentView(R.layout.main); 07: 08: final VideoView videoView = (VideoView) findViewById(R.id.VideoView); 09: 10: Uri video = Uri.parse("http://daily3gp.com/vids/747.3gp"); 11: videoView.setVideoURI(video); 12: videoView.setClickable(true); 13: videoView.setFocusableInTouchMode(true); 14: videoView.start(); 15: } 16:}
Nossa explicação pode começar da linha 8, o restante é bê-a-bá do Android. Na linha 10 definimos o local do vídeo. O método parse serve para deixar os dados de acordo com os padrões de URI válidos. Na linha 11 definimos a URI do vídeo. Assim como o setVideoURI, existe o método setVideoPath, que recebe uma String. Na linha 12 define-se que o componente pode ser clicado. Nesta linha recuperamos o objeto VideoView. Na linha 13 identificamos o comportamento de foco quando ele receber o evento de touch. E, na linha 14 iniciamos o vídeo com o método start. Se testarmos o aplicativo agora, o vídeo demora um pouco para iniciar, mas, ele mostra o vídeo inteiro. Porém, e se o usuário quiser pausar o vídeo, avançar, retroceder, oque acontece? Vamos sanar este problema agora. Logo após a linha que instancia o VideoView, adicione estas três linhas de código: MediaController mediaController = new MediaController(this); mediaController.setAnchorView(videoView); videoView.setMediaController(mediaController);
O MediaController também é auto explicativo. Ele é um componente que adiciona um controlador de mídia ao clicar no vídeo. Veja a Figura 2:
Figura 1: MediaCntroller.
Para brincar um pouco mais com a API. Vamos adicionar um comportamento único. Ao clicar a key número 3, o vídeo será pausado, ao clicar a key número 1, o vídeo reinicia. Veja o trecho de código abaixo, ele é colocado logo abaixo da chamada do método start(): videoView.setOnKeyListener(new View.OnKeyListener(){
});
public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == 8){ videoView.start(); } else if (keyCode == 10){ videoView.pause(); } return false; }
O código é bem simples. Cada tecla clicada chama o método onKey, passando o código da tecla no parâmetro keyCode. Em seguida testamos se a tecla clicada foi o número 1 (código 8) ou o número 3 (código 10). E a fala, prometi e não vou cumprir. Não. Nada disso.
• Brincando com Text to Speech O primeiro passo é mudar a ação que é efetuada ao clicar no número 8. Veja como ficou: else if (keyCode == 10){ videoView.pause(); speech = "why did you stop viewing the video?"; fala(); }
Perceba que editamos uma String speech com o texto que queremos que nosso aplicativo fale. Em seguida chamamos o método fala(). Que é mostrado abaixo: 01:public void fala(){ 02: Intent checkIntent = new Intent(); 03: checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 04: startActivityForResult(checkIntent, 0); 05: tts = new TextToSpeech(this, this); 06:}
Na linha 2 criamos uma Intent. Não esqueçam que a tradução dessa palavra é intenção. Na linha 3, definimos a ação dessa Intent, que pode ser traduzida para, sua intenção. Passamos como ação desejada uma constante de TexToSpeech.Engine, chamada ACTION_CHECK_TTS_DATA. Segundo a própria documentação oficial, a constante define: indica para a TextToSpeech que verifique a sua instalação e disponibilidade dos arquivos de recursos no sistema. Nada mais é do que um checuk da engine de TTS. Na linha 4 iniciamos a Intent criada recentemente. Na linha 5 criamos a instância de TextToSpeech. Seu constructor recebe uma instância de contexto e o listener OnInitListener. Perceba que passamos this nos dois parâmetros, para que isso funcione também é necessário implementar este listener na classe: public class ViewVideoEx extends Activity implements OnInitListener{
E que o método onInit esteja implementado:
public void onInit(int status) { ... }
Esta interface que acabamos de implementer indica o fim do processo de inicialização da engine do Text to Speech, que iniciamos com a Intent. Logicamente, quando o onInit for chamado quer dizer que a engine está pronta e que podemos dar voz a nossa aplicação. Então, coloque as duas linha de código dentro deste método: public void onInit(int status) { tts.setLanguage(Locale.US); tts.speak(speech, TextToSpeech.QUEUE_FLUSH, null); }
Na primeira linha definimos a linguagem. Como era de se esperar, infelizmente não temos a opção de português. E na última linha do método é onde a mágica acontecerá. Literalmente, o método speak dará voz ao Android. O primeiro parâmetro é o texto a ser falado. O segundo parâmetro indica modo de fila, referente a entrada de novos textos para serem falados. Por fim, podemos passar mais alguns parâmetro no formato de HashMap, mas não vamos utilizar isso aqui. Pronto, ao testar novamente o aplicativo e pausar o vídeo o leitor descobrirá que o Android pode até falar.
• Conclusão Trabalhar com vídeo e text to speech no Android não é tão trivial como mexer com interface de usuário, conectividade, dentre outros. Mas, também, ficou claro que não é nada de outro mundo. Com um pouquinho a mais de esforço podemos adicionar estas duas features que podem enriquecer e muito sua aplicação.
• Sobre Mim Meu nome é Ricardo da Silva Ogliari, sou graduado em Ciência da Computação pela Universidade de Passo Fundo. Atualmente também estou cursando uma pós-graduação em web, estratégias de inovação e tecnologia, no Senac SP. Trabalho com mobile a 6 anos, escrevo artigos para algumas revistas nacionais especializadas. Sou criador e mantenedor do http://www.mobilidadetudo.com e sou um dos membros do www.javamovel.com. Palestrei em eventos nacionais e internacionais, como o FISL, JustJava e Java Day, além de ter dezenas de artigos espalhados pelo mundão da internet.