Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Quando se fala de Mobilidade garantir que informaes corporativas sejam visualizadas apenas por pessoal autorizado essencial. Nessa postagem vamos implementar a autenticao de uma aplicao Delphi XE5 Android atravs doIMEI do dispositivo.
No form vamos adicionar um Button, alterar sua propriedade Textpara Capturar IMEI e a propriedade Name para btnCapturarIMEI.
Vimos como fcil capturar o IMEI atravs de uma aplicao Android Delphi XE5.
Implementando um banco de dados contendo os IMEI's autorizados e fazendo uma pesquisa neles voc pode garantir o acesso apenas aos dispositivos previamente cadastrados no seu servidor de aplicao.
Uma vez adicionados os componentes em nossa aplicao, para que sua interface fique parecida com a figura acima vamos configurar suas propriedades como abaixo:
ToolBar1
Align > alTop Text > Gestos com Delphi XE5 TextAlign > taCenter Align > alBottom TabPosition > tpBottom Align > alClient StyleLookup > calloutpanelstyle
Label1
TabControl1
Panel1
Agora vamos clicar com o boto direito do mouse sobre oTabControl1 e adicionar 3 novos TabItem, aps adicionados vamos alterar a propriedade Text de cada um deles:
E para os gestos serem interpretados pela aplicao vamos inserir no evento onGesture do Painel1 o cdigo:
procedure TForm1.Panel1Gesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); var Gesto : string; begin if GestureToIdent(EventInfo.GestureID, Gesto) then begin case EventInfo.GestureID of sgiLeft : TabControl1.TabIndex := 0; sgiRight: TabControl1.TabIndex := 2; sgiDown : TabControl1.TabIndex := 1; sgiUp : ShowMessage('Voc utilizou o gesto para cima: ' + Gesto); end; end; end;
Aps a todos os componentes configurados e os cdigos acima inseridos essa ser a aparncia do projeto
Deslizando para a direita acionamos a TabItem Direita Deslizando para a esquerda acionamos a TabItem Esquerda Deslizando para baixo vamos para a TabItem Central Deslizando para cima exibida uma mensagem contendo a constante que denomina o gesto acionado
Label1
ComboBox1
Button1
Em nosso projeto iremos utilizar alguns namespaces para utilizarmos funes do Android, para isso na clausula Uses da seoimplementation vamos incluir: Ao final desta etapa teremos nossa aplicao visualmente parecendo-se com a imagem abaixo:
uses IdURI, FMX.Helpers.Android, Androidapi.Jni.GraphicsContentViewText, Androidapi.Jni.Net, Androidapi.Jni.JavaTypes;
Basicamente ao clicar no boto o usurio estar solicitando ao dispositivo que execute uma intent prselecionada no ComboBox1. Sendo assim o iremos verificar qual a intent chamada e passar os comandos para a aplicao do Google que desejamos executar. Veja o cdigo (que deve vir imediatamente aps a declarao das varieis 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 :='http://landersongomes.vivaitaocara.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 aplicao interagindo com as aplicaes do Google que acompanham os dispositivos Android.
A Intent Action (Ao) View combinada com a Intent URI (Uri) Geoabre o Google Maps do dispositivo passando a ele as coordenadas ou endereo contidos no restante da URI. Este par foi utilizado ento por nossa aplicao quando clicamos no Button1 e o ComboBox teve a opo Mapa selecionada. Fica bem claro quando separamos o cdigo que inicializa nossa varivel 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 a Tel acrescida de um nmero de telefone, com isso nossa aplicao efetuar a chamada telefnica para o nmero informado. Enfim, tudo fica bem mais claro aps o entendimento do primeiro caso.
Como vamos enviar SMS, precisamos solicitar essa permisso ao Android. Abre-se aqui um parntese, quando voc instala uma aplicao no Android ele sempre informa os recursos que essa aplicao vai usar, por isso vamos setar a permisso para Envio de SMS como verdadeira. No Project Manager selecione o nosso Projeto e clique com o boto direito para que seja exibido o Popup Menu e nele selecione Options (a penltima opo do menu popup).
As opes do Projeto sero abertas e a procuraremos por Uses Permissions, note que no quadro direita esto todas as opes de permisses possveis a um projeto Android. Vamos procurar nas permisses por Send SMS e set-la para True, ou seja, acabamos de dizer para o Android que usaremos o envio de SMS.
J est pronta nossa aplicao. Acione o Emulador ou conecte um dispositivo Android e execute para conferir o funcionamento.
ListBoxItem1
ItemData.Text > Banco do Brasil ItemData.Detail > 0800 729 0722 StyleLookup > listboxitembottomdetail ItemData.Text > Caixa ItemData.Detail > 0800 726 0101 StyleLookup > listboxitembottomdetail ItemData.Text > Loja da Esquina
ListBoxItem2
ListBoxItem3
Altere a propriedade Align do lbxFornecedores para alClient, assim ele passar a ocupar toda a tela do aplicativo. Quando alteramos as propriedades StyleLookup dos ListBoxItens listboxitembottomdetailfizemos com que a informao do campo Detail passe a ser exibida abaixo do texto principal do item. Agora que j temos os dados de nossos fornecedores vamos codificar nossa aplicao dando a ela a funcionalidade proposta na postagem.
Vamos ainda acrescentar definio de nosso Formulrio (frmDiscador) uma varivel Discador em sua seo private como segue:
private { Private declarations } Discador : IFMXPhoneDialerService;
Assim j temos tudo pronto para inserir o cdigo que efetuar a chamada telefnica propriamente dita, para isso codificaremos o evento OnItemClick do lbxFornecedores como abaixo:
procedure TfrmDiscador.ListBox1ItemClick(const Sender: TCustomListBox; const Item: TListBoxItem); begin if not Item.ItemData.Detail.IsEmpty then begin TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(Discador)); if Assigned(Discador) then begin Discador.Call(Item.ItemData.Detail); end; end else begin Discador.Call(InputBox('Fornecedor sem nmero.', 'Informe o nmero a ser discado', '' )); end; end;
voil
Execute a aplicao e ver que j temos a chamadas telefnicas acontecendo ao clicar sobre os itens da nossa lista de fornecedores.
Faz-se notar que nosso ltimo fornecedor no tem informado seu nmero de telefone, quando o campo Detail do item estiver vazio, ser exibida uma InputBox solicitando o nmero a ser discado.
A simplicidade de implementar essa funcionalidade em sua aplicao pode fazer a diferena no cotidiano de seu usurio/cliente, pense nisso. At a prxima e bons cdigos!
Feito isso salvaremos nosso projeto atravs do menu File > Save All. Chamaremos a Unit de frmLocalizacaoUnt e o projeto chamaremos de prjLocalizeMe. Agora vamos inserir em nossa aplicao os componentes que faro com que ela fique funcional. Vamos adicionar 2 Labels, 1 WebBrowser, 1 ToolBar, 1 Switch e um LocationSensor. Ento teremos
ToolBar1
Align > alTop Text > Localizao Align > alBotton Text > www.landersongomes.vivaitaocara.com.br Align > alClient Distance > 50
Label1 Label2
WebBrowser1
LocationSensor1
Ao final do processo acima nossa tela de design ficar semelhante figura abaixo.
Note que atribumos ao Sensor de Localizao (LocationSensor1) atividade ou no de acordo com a ativao ou no do Switch, assim sendo, ativado o Switch ativamos consequentemente o Sensor. Em seguida, apenas por esttica, verificamos se o sensor est inativo, caso esteja, passamos o endereo do meu blog para a propriedade Text do Label2 e em seguida, passamos ela como URL para o WebBrowser1 Navegar. Ento se o sensor estiver desativado, o WebBrowser1 abrir meu blog.
Ajuda do GoogleMaps
J configuramos o comportamento da aplicao quando o sensor estiver desligado, agora vamos configur-la para o funcionamento com o sensor ligado dando-lhe a funcionalidade de exibir nossa posio no Mapa. Antes de mais nada precisamos pegar uma linha com o GoogleMaps, ser a linha que passaremos para nossa aplicao conseguir desenhar o mapa, e nossa aplicao por sua vez passar para o GoogleMaps a localizao do ponto que queremos desenhar. bem simples, veja a linha: https://maps.google.com/?q=%s,%s&&t=h&&z=13&&hl=pt-BR&&output=embed Basicamente, chamamos o GoogleMaps, informamos a ele a parte do mapa que queremos, representada na linha por: ?q=%s,%s, cada um dos %s ser trocado por sua respectiva coordenada a ser fornecida pelo sensor quando ativado. O restante so variveis capazes de mudar o comportamento do mapa: &t=h > indica o tipo do mapa, nesse caso hbrido.
&z=13 > indica que nosso mapa ser exibido com 13 de zoom. &output=embed > quer dizer que nosso mapa estar embarcado no navegador, sem exibir recursos especficos de tela do GoogleMaps.
Com isso j temos o necessrio para rodar a aplicao. Apenas explicando o contedo do cdigo adicionado: Declaramos a constante Navegar do tipo string e atribumos a ela a linha que pegamos emprestada do GoogleMaps. Em seguida usamos a funo Format encadeadamente, uma vez passando valores do tipo Float, Latitude e Longitude do NewLocation passado no Evento sempre que a localizao mudar. Utilizamos a o formato de 2 casas inteiras e 6 casas decimais expressas pela string %2.6f, assim foramos as coordenadas a serem exibidas sob essa formatao. Exibimos esse resultado na propriedade Text do Label2, este contedo a url a qual o Webbrowser1 logo em seguida recebe como parmetro informando o destino da sua navegao. Executando a aplicao percebemos que a mesma j funciona, entretanto pode ocorrer de o mapa no estar representando sua real localizao.
A chave para que a aplicao realmente funcione no Brasil termos o Separador de decimal alterado simples assim, fazendo isso o exemplo postado pela Embarcadero em vdeo, ou o exemplo que acompanha o Delphi XE5 disponibilizado em sua Welcome Page funcionaro perfeitamente.
Iniciando o desenvolvimento
Primeiro passo que tomaremos ser iniciar o Delphi XE5 e criar nossa aplicao atravs do nenu File> New Project > Delphi Projects > Mobile Projects. Vale notar que existem vrios modelos de layout de aplicaes prontos que podem ser selecionados, no nosso caso escolheremos um modelo de aplicao em branco (Blank Application).
Vamos salvar o projeto atravs da opo File > Save All. Para a unit, atribua o nome de frmAndPrincipalUnt o projeto em si chamaremos de prjCamShare. Incluiremos em nosso projeto um TImage, um TToolBar, trs TButton e um TActionList. Precisamos agora alterar algumas propriedades dos objetos em nosso projeto, comeamos pelo formulrio, seria o display do dispositivo exibido na IDE, altere sua propriedade Name para frmAndPrincipal. Os demais objetos vamos seguir a lista abaixo:
Button1
Name > btnCam StyleLookup > cameratoolbutton Name > btnArquivo StyleLookup > searchtoolbutton Name > btnCompartilhar
Button2
Button3
Image1
Ainda no Object Inspector, acesse a guia Events e expanda a propriedade Action , vide imagem abaixo:
Com esse cdigo nossa aplicao j capaz de capturar imagens da cmera do dispositivo. Mas como queremos algo mais, vamos continuar o trabalho. Para o boto btnArquivo, faremos o mesmo procedimento, entretanto usando New Standard Action > Media Library > TTakePhotoFromLibraryAction. Para este boto tambm utilizaremos o mesmo evento onDidFinishTaking e seu cdigo para obtnArquivo ser:
procedure TfrmAndPrincipal.TakePhotoFromLibraryAction1DidFinishTaking(Image: TBitmap); begin imgFoto.Bitmap.Assign(Image); end;
E por fim vamos atribuir ao btnCompartilhar a New Standard Action > Media Library > TShowShareSheetAction e nesse caso codificaremos seu evento onBeforeExecute:
procedure TfrmAndPrincipal.ShowShareSheetAction1BeforeExecute(Sender: TObject); begin ShowShareSheetAction1.Bitmap.Assign(imgFoto.Bitmap); end;
At a prxima.