sábado, 19 de outubro de 2013

Fala que eu te escuto!

Introdução
"Eu tenho tanto pra lhe falar, mas com palavras ~é difícil escrever~".

Com esta pequena "brincadeirinha" começo este post expondo uma dificuldade presente em diferentes devices e circunstâncias.

Escrever no device, muitas vezes é muito complicado e dependendo para o que você está escrevendo é pior ainda. Por exemplo, quando você precisa buscar um contato em sua lista telefonica enquanto dirige(não faça isso ok?! ;P), ou então escrever um texto no Hangout enquanto anda de onibus nessas maravilhosas ruas brasileiras... enfim... em diferentes casos, escrever algo enquanto o mundo em sua volta exige sua atenção é muito complicado.

O Google, sabendo dessa dificuldade, criou uma maneira simples e prática para resolvermos este problema. Só é preciso falar e o device irá entender e, então, transpor o mesmo em texto. Essa mágica acontece pela classe RecognizeIntent.

Agora sim, podemos somente falar e a "mágica" irá acontecer.
Vamos entender como funciona?

Explicando a RecognizeIntent
A RecognizeIntent é uma Intent onde é possível termos acesso a ferramenta de Speech do Android. Só precisamos disparar uma intent RecognizerIntent.ACTION_RECOGNIZE_SPEECH e uma tela irá se abrir para que o usuário fale.
Depois disso, será retornado uma lista de palavras/frases ordenado pelo nível de maior probabilidade para a menor de similaridade ao que foi falado.

Algumas propriedades que podem ser passadas pelo "intent.putExtra(...)":
  • RecognizerIntent.EXTRA_LANGUAGE_MODEL - Através dele você pode informar qual a lingua que deverá ser trabalhada. Por default é o "en-US" porém é possível informar "pt-BR" por exemplo. Caso você queira deixar que o próprio Android decida qual língua está sendo dita, você irá passar o valor "RecognizerIntent.LANGUAGE_MODEL_FREE_FORM";
  • RecognizerIntent.EXTRA_PROMPT - Aqui é possível passar um pequeno texto para ser apresentado junto a tela de Speech, algo que possa auxiliar o usuário na hora de falar o que precisa ser dito.
Exemplo
No código abaixo podemos ver como é chamado a Intent e depois como pegamos a lista de possíveis resultados.

Obs: A tela tem um botão na parte superior e abaixo uma lista onde serão apresentados a lista de possíveis resultados.

Segue o código comentado:

public class MainActivity extends Activity {

 private static final int RESULT_SPEECH = 1234;
 private ImageButton btnSpeak;
 private ListView listText;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  btnSpeak = (ImageButton) findViewById(R.id.btnSpeak);
  listText = (ListView) findViewById(R.id.listText);

  //Verifica se existe a RecognizerIntent.ACTION_RECOGNIZE_SPEECH na vesão do Device
  //Caso não exista, desabilitamos o botão e evitamos uma ActivityNotFoundException
  if (getPackageManager().queryIntentActivities(
    new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0).size() > 0) {

   btnSpeak.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
     //Criamos a intent
     Intent intent = new Intent(
       RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
     //Informamos que a linguagem será automática
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
       RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
     //Passamos o texto de auxílio ao usuário
     intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
       "Fale que eu te escuto Tutorial");
     //Chama a Activity passando o código identificador de result
     startActivityForResult(intent, RESULT_SPEECH);
    }
   });
  } else {
   btnSpeak.setEnabled(false);
  }
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);

  //Verifica se o retorno é da nossa Intent
  if (requestCode == RESULT_SPEECH && resultCode == RESULT_OK && null != data) {
   //Passa a lista de possíveis resultados e passa para a lista de Textos por um Adapter genérico
   ArrayList listResults = data
     .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
   listText.setAdapter(new ArrayAdapter(this,
     android.R.layout.simple_list_item_1, listResults));
  }
 }
}


Alguns prints da App de exemplo funcionando:




Conclusão
Bem, podemos ver como é simples utilizarmos algo que é tão poderoso.

Usando esta ferramenta, podemos aumentar muito o poder das nossas apps e facilitar muito a vida de nossos usuários.
Use e abuse por que é 0800! hehe

Qualquer dúvida ou comentários, por favor, só escrever na parte de comentários.
Bons estudos.

[]~

Nenhum comentário:

Postar um comentário