Tanto em desktop quanto mobile, no desenvolvimento por diversas vezes temos a necessidade de nossa aplicação interagir com outras aplicações da plataforma alvo de nosso desenvolvimento.
Aquele relatório que precisa ser exportado e visualizado em Excel na plataforma Desktop é um exemplo que quase todo desenvolvedor já teve implementar.
Intent, aqui bate o coração
Quando falamos de mobile, em Android sendo mais específico, poder interagir com os recursos do sistema por si só, já pode dar ao usuário de nossa aplicação um ganho significativo de experiência de uso. Já citamos aqui alguns casos de como fazer nossa aplicação interagir com o Android, porém na postagem de hoje traremos a tona a classe que é tida como o coração do sistema Android: a Classe Intent.
A classe Intent (android.content.Intent) está presente em todos os lugares e representa uma mensagem da aplicação para o sistema operacional solicitando a este que realize algo. Através dela é possível integrar diferentes aplicações trocando essas mensagens e resultados entre si. O sistema operacional por sua vez interpreta essas mensagens efetuando o que está sendo solicitado, desde a abertura de uma aplicação até mesmo efetuar uma chamada telefônica.
Delphi: criando a interface da aplicação.
Inicie um novo projeto Mobile em branco, nele vamos inserir 1 Label, 1 ComboBox, 1 Button. Vamos alterar as propriedades dos componentes como abaixo:
- Label1
- Text –> Intent’s no Delphi
- TextAling = taCenter
- ComboBox1
- Itens
- Mapa
- Telefone
- Navegador
- Contatos
- Itens
- Button1
- Text –> Executar
Em nosso projeto iremos utilizar alguns namespaces para utilizarmos funções do Android, para isso na clausula Uses da seção implementation vamos incluir:
uses IdURI, FMX.Helpers.Android, Androidapi.Jni.GraphicsContentViewText, Androidapi.Jni.Net, Androidapi.Jni.JavaTypes;
Ao final desta etapa teremos nossa aplicação visualmente parecendo-se com a imagem abaixo:
E como usar as Intents na prática? E no Delphi como seria isso?
Nossa aplicação enviará chamadas ao sistema operacional invocando os aplicativos do Google através de pares Ação / URI que definem qual aplicativo está sendo chamado e seu comportamento ao receber a intenção de chamada. A lista completa de Intents para invocar aplicativos do Google em dispositivos Android pode ser checada no link:
http://developer.android.com/guide/appendix/g-app-intents.html.
Então vamos fazer as coisas acontecerem por aqui!
No evento OnClick do nosso Button1 vamos inserir umas variáveis:
var uri : string; Intent : JIntent; idContato : Integer;
Basicamente ao clicar no botão o usuário estará solicitando ao dispositivo que execute uma intent pré-selecionada no ComboBox1. Sendo assim o iremos verificar qual a intent chamada e passar os comandos para a aplicação do Google que desejamos executar. Veja o código (que deve vir imediatamente após a declaração das variáeis acima):
begin case ComboBox1.ItemIndex of -1: begin ShowMessage('Selecione uma Intent'); ComboBox1.SetFocus; end; 0: //Mapa begin uri :='geo://0,0?q=Maracana, Rio de Janeiro'; try Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(uri)))); SharedActivity.startActivity(Intent); except on E: Exception do ShowMessage(E.Message); end; end; 1: // Telefone begin uri :='tel://98390170'; try Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_CALL, TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(uri)))); SharedActivity.startActivity(Intent); except on E: Exception do ShowMessage(E.Message); end; end; 2: begin uri:= 'content://com.android.contacts/contacts/'; try Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_PICK, TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(uri)))); SharedActivity.startActivityForResult(Intent, 0); except on E: Exception do ShowMessage(E.Message); end; end; 3: // Navegador begin uri :='https://landersongomes.com.br'; try Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(uri)))); SharedActivity.startActivity(Intent); except on E: Exception do ShowMessage(E.Message); end; end; end; // case end;
Agora basta executar o programa no dispositivo ou no emulador que já temos nossa aplicação interagindo com as aplicações do Google que acompanham os dispositivos Android.
Explicando os pares: Ação / Uri
Os aplicativos do têm sua chamada e comportamentos estabelecidos através dos pares Ação/ Uri. Abaixo vamos descrever cada um dos pares utilizados por nós em cada Intent de nossa aplicação:
A Intent Action (Ação) View combinada com a Intent URI (Uri) Geo abre o Google Maps do dispositivo passando a ele as coordenadas ou endereço contidos no restante da URI. Este par foi utilizado então por nossa aplicação quando clicamos no Button1 e o ComboBox teve a opção Mapa selecionada.
Fica bem claro quando separamos o código que inicializa nossa variável Intent, veja:
Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(uri))));
Os demais casos, acabam tornando-se óbvios, temos:
ACTION_CALL combinada com a URI Tel acrescida de um número de telefone, com isso nossa aplicação efetuará a chamada telefônica para o número informado.
Enfim, tudo fica bem mais claro após o entendimento do primeiro caso.
Dê à sua aplicação a “intenção” de interagir com o Android.
Agora, vale a pena dar uma olhada na Lista de Intents para invocar aplicativos do Google e adaptar sua aplicação para essas possíveis interações com o Android.
Até a próxima.