Você está na página 1de 25

OBTER O IMEI DE DISPOSITIVO ANDROID COM DELPHI XE5

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.

IMEI a identificao do dispositivo


IMEI o acrnimo de Mobile Equipment Identity (Identificao Internacional de Equipamento Mvel). Trata-se de uma sequncia de nmeros e caracteres especiais nica para cada dispositivo. A ideia bem parecida com o MAC address das placas de rede. Isso facilita na hora de localizar um aparelho especfico em meio s centenas de dispositivos colocados no mercado todos os meses.

Criando a aplicao Mobile Delphi XE5


Crie um novo projeto Mobile no Delphi XE5. No fonte do form da aplicao vamos adicionar as seguintes referncias na clausula uses:
uses FMX.Platform.Android, Androidapi.JNI.Telephony, Androidapi.JNI.Provider , Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, FMX.Helpers.Android;

No form vamos adicionar um Button, alterar sua propriedade Textpara Capturar IMEI e a propriedade Name para btnCapturarIMEI.

Vamos codificar seu evento onClick como abaixo:


procedure TForm1.btnCapturarIMEIClick(Sender: TObject); var obj: JObject; tm: JTelephonyManager; IMEI: String; begin obj := SharedActivityContext.getSystemService(TJContext.JavaClass.TELEPHONY_SERVICE); if obj <> nil then begin tm := TJTelephonyManager.Wrap( (obj as ILocalObject).GetObjectID ); if tm <> nil then IMEI := JStringToString(tm.getDeviceId); end; if IMEI = '' then IMEI := JStringToString(TJSettings_Secure.JavaClass.getString(SharedActivity.getContentResolver, TJSettings_Secure.JavaClass.ANDROID_ID)); ShowMessage('IMEI :' + #13 + IMEI); end;

Fcil extremamente fcil


Execute a aplicao e clicando sobre o boto o IMEI do seu dispositivo ser exibido.

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.

isso simples assim! At a prxima!

CONTROLE DE GESTOS NO ANDROID COM DELPHI XE5


Com a popularizao dos smartfones e consolidao das telas touch screen ter em sua aplicao funes acionadas pelo comportamento de deslizar o dedo sobre a tela pode representar um grande diferencial de sua aplicao.
Nessa postagem vamos criar uma aplicao Android com Delphi XE5que ser capaz de captar os gestos do usurio na tela do dispositivo.

Criando a aplicao e adicionando os componentes


Vamos iniciar uma nova aplicao Mobile em Branco no Delphi XE5, como j fizemos este procedimento em vrias postagens anteriores vamos pular essa parte, e nesta aplicao vamos inserir os componentes: 1 ToolBar, 1 Label(insira dentro da ToolBar), 1 TabControl, e 1Panel.

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:

TabItem1.Text > Esquerda TabItem2.Text > Central TabItem3.Text > Direita

GestureManager a gesto dos gestos


Para que os gestos sejam interpretados por nossa aplicao precisamos adicionar ainda um GestureManager. Selecione o Panel1e vamos associar sua propriedade Touch.GestureManager e habilitar suas Gestures Standard: Left, Right, Down e Up. Veja na imagem abaixo:

Codificando a captao do Gestos


Apenas para garantir que nossa aplicao sempre seja inicializada com a TabItemCentral ativa em nosso TabControl vamos inserir o seguinte cdigo no evento onActivate do Form1:
procedure TForm1.FormActivate(Sender: TObject); begin TabControl1.TabIndex := 1; end;

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

Executar e entender o funcionamento da aplicao


Agora basta executar a aplicao no emulador ou diretamente no seu dispositivo Android e conferir o resultado. Basicamente trocamos asTabItens com o movimento dos dedos sobre o Panel1:

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

Agora adaptar o modelo sua necessidade e mandar ver!

INTENTS COM DELPHI XE5 COMUNICANDO APPS ATRAVS DO ANDROID


Tanto em desktop quanto mobile, no desenvolvimento por diversas vezes temos a necessidade de nossa aplicao interagir com outras aplicaes da plataforma alvo de nosso desenvolvimento.
Aquele relatrio que precisa ser exportado e visualizado em Excel na plataforma Desktop um exemplo que quase todo desenvolvedor j teve implementar.

Intent, aqui bate o corao


Quando falamos de mobile, em Android sendo mais especfico, poder interagir com os recursos do sistema por si s, j pode dar ao usurio de nossa aplicao um ganho significativo de experincia de uso. J citamos aqui alguns casos de como fazer nossa aplicao interagir com o Android, porm na postagem de hoje traremos a tona a classe que tida como o corao do sistema Android: a Classe Intent. A classe Intent (android.content.Intent) est presente em todos os lugares e representa uma mensagem da aplicao para o sistema operacional solicitando a este que realize algo. Atravs dela possvel integrar diferentes aplicaes 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 aplicao at mesmo efetuar uma chamada telefnica.

Delphi: criando a interface da aplicao.


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 > Intents no Delphi TextAling = taCenter Itens


ComboBox1

Mapa Telefone Navegador Contatos

Button1

Text > Executar

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;

E como usar as Intents na prtica? E no Delphi como seria isso?


Nossa aplicao enviar chamadas ao sistema operacional invocando os aplicativos do Google atravs de pares Ao / URI que definem qual aplicativo est sendo chamado e seu comportamento ao receber a inteno 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. Ento vamos fazer as coisas acontecerem por aqui! No evento OnClick do nosso Button1 vamos inserir umas variveis:
var uri : string; Intent : JIntent; idContato : Integer;

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.

Explicando os pares: Ao / Uri


Como dito acima, os aplicativos do tm sua chamada e comportamentos estabelecidos atravs dos pares Ao/ Uri, abaixo vamos descrever cada um dos pares utilizados por ns em cada Intent de nossa aplicao:

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.

D sua aplicao a inteno de interagir com o Android.


Agora, vale a pena dar uma olhada na Lista de Intents para invocar aplicativos do Google e adaptar sua aplicao para essas possveis interaes com o Android. Lista completa de Intents: http://developer.android.com/guide/components/intents-common.html At a prxima.

DELPHI XE5 ENVIANDO SMS DIRETO DE SUA APLICAO ANDROID


Nessa postagem vamos enviar SMS atravs de uma aplicao Delphi XE5 para Android. Poucas linhas de cdigos que podem ser adaptadas realidade de sua aplicao mobile e torn-la ainda mais agradvel a seus usurios.

Criao da Interface da aplicao e Conceder Permisso para Envio de SMS


Inicie o Delphi XE5 e crie um novo projeto Mobile em Branco como j fizemos em outras postagens, acesse Menu File > New > FireMonkey Mobile Application e em seguida selecione a opoBlank Template . Vamos inserir em nosso formulrio 1 Label, 1 Edit, 1 Memo e 1 Button. Alteraremos a propriedade Text do Label para Destinatrio. Ao final teremos a interface da aplicao assemelhando-se figura abaixo:

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.

Feito isso basta clicar em OK e vamos iniciar a codificao de nosso projeto.

Cdigo Delphi funcionalidade Android


Na seo Implementation, em sua clusula uses vamos adicionar 2 Namespaces que fazem referncias a Classes Android e faro com que nosso projeto se comunique com o telefone e reconhea os tipos de dados do Android/Java, so eles respectivamente abaixo:
implementation {$R *.fmx} uses Androidapi.Jni.Telephony, Androidapi.Jni.JavaTypes;

No evento OnClick do Button vamos inserir o seguinte cdigo:


procedure TForm1.btnEnviarClick(Sender: TObject); var GerenciadorSMS : JSmsManager; begin GerenciadorSMS := TJSmsManager.JavaClass.getDefault; if not Edit1.Text.IsEmpty then begin if not Memo1.Lines.Text.IsEmpty then GerenciadorSMS.sendTextMessage(StringToJString(Edit1.Text), nil, StringToJString(Memo1.Lines.Text), nil, nil ) else ShowMessage('Escreva a mensagem.'); end else ShowMessage('Informe o nmero de destino para a mensagem.'); end;

J est pronta nossa aplicao. Acione o Emulador ou conecte um dispositivo Android e execute para conferir o funcionamento.

Traga para sua realidade


Na minha postagem Delphi XE5 Efetuando chamadas telefnicas direto de sua aplicao mvel, populamos um ListBox com elementos de um cadastro de fornecedores fictcio e a partir dali efetuvamos chamadas telefnicas. Na postagem de hoje, poderamos pensar de igual forma, com um cadastro de Gerentes ou Vendedores de sua empresa por exemplo e que voc precise enviar um SMS a eles. Enfim, a facilidade est disponvel, adapte-a realidade de seu usurio. At a prxima.

DELPHI XE5 EFETUANDO CHAMADAS TELEFNICAS DIRETO DE SUA APLICAO MVEL


Sua aplicao Mobile DelphiXE5 efetuando chamada telefnica sem necessidade de consultar a agenda ou outro aplicativo. De a seus usurios tima experincia.
Imagine que voc tem uma aplicao mvel que carrega a lista de fornecedores de seu cliente, nessa lista h informaes como Nome, Telefone, e-mail, etc. Voc pega a informao de telefone e gostaria de us-la para efetuar uma ligao para esse fornecedor. Voc memoriza esse telefone e no aplicativo de discagem do seu smartphone digita esse nmero para efetuar a chamada. Por que no fazer isso direto de seu aplicativo? O nmero do fornecedor j est armazenado l Vamos ao Delphi XE 5 ento?!

Criando a UI (User Interface Interface do Usurio)


Abra o Delphi XE5 e crie Novo Projeto Mvel atravs do menu File> New Project > Delphi Projects > Mobile Projects. Utilizaremos novamente o modelo de aplicao em branco (Blank Application). Vamos salvar nosso projeto atravs do Menu File > Save All (SHIFT +CTRL + S), crie uma pasta denominada prjDiscador para salvarmos nossos arquivos dentro dela. Chamaremos a Unit do formulrio defrmDiscadorUnt e o projeto chamaremos Discador. Insira no formulrio um Listbox, renomeie-o para lbxFornecedores, clique com o boto direito sobre ele e selecione a opo Add Item.

Vamos adiconar 1 TListBoxHeader e 3 TListboxItem. E configurar suas propriedades como abaixo:

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

ItemData.Detail > StyleLookup > listboxitembottomdetail

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.

Funcionamento e Codificao da aplicao


Basicamente a aplicao efetuar a discagem para o item selecionado no lbxFornecedores vamos fazer alguns ajustes no cdigo. Pressione F12 para visualizarmos a Unit e nela vamos inserir na clusula uses da seo Interface vamos adicionar os seguintes Namespaces:
//Namespaces adicionados FMX.PhoneDialer, FMX.Platform;

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!

SENSOR DE LOCALIZAO DE DISPOSITIVOS MVEIS COM DELPHI XE5


Nesta postagem acessaremos o Sensor de Localizao de dispositivos mveis atravs de uma aplicao desenvolvida com Delphi XE5.
Neste tutorial daremos prosseguimento a nossa srie de desenvolvimento de aplicaes de exemplos utilizando Delphi XE5 para acessar funcionalidades de dispositivos mveis com poucas linhas de cdigo. Nele faremos acesso ao sensor de localizao do dispositivo fazendo com que a sua localizao seja plotada no mapas atravs de integrao com o Google Maps.

Iniciando o Delphi e preparando a aplicao


Iniciaremos o Delphi XE5 e criaremos um Novo Projeto Mvel atravs do menu File> New Project > Delphi Projects > Mobile Projects. Adotaremos o modelo de aplicao em branco (Blank Application).

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.

Ativando e desativando o sensor


O objeto Switch1, no alteramos nenhuma de suas propriedades mas ser ele o nosso interruptor para ligar e desligar o Sensor de Localizao LocationSensor1. Para o Switch1 vamos codificar seu evento OnSwitch, que seria o seu ativar/desativar propriamente dito, esse o cdigo:
procedure TForm1.Switch1Switch(Sender: TObject); begin LocationSensor1.Active := Switch1.IsChecked; if LocationSensor1.Active = False then begin Label2.Text := 'landersongomes.vivaitaocara.com.br'; WebBrowser1.Navigate(Label2.Text); end; end;

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.

Atualizar a Localizao e Exibir o Mapa


Para exibirmos a localizao, trataremos o evento OnLocationChanged, que acionado sempre que sensor se movimenta superando o limite estabelecido em sua propriedade Distance, que em nosso caso setamos para 50 metros. Passaremos nesse evento a linha do Google citada na sesso anterior e receberemos as coordenadas por parte do LocationSensor1, veja como ficar o cdigo a ser chamado no evento:
procedure TForm1.LocationSensor1LocationChanged(Sender: TObject; const OldLocation, NewLocation: TLocationCoord2D); const Navegar : string = 'https://maps.google.com/?q=%s,%s&&t=h&&z=13&&hl=ptBR&&output=embed'; begin Label2.Text := Format(navegar, [ Format('%2.6f', [NewLocation.Latitude]), Format('%2.6f', [NewLocation.Longitude])]); WebBrowser1.Navigate(Format(navegar, [Format('%2.6f', [NewLocation.Latitude]), Format('%2.6f', [NewLocation.Longitude])])); end;

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.

O ponto chave da localizao


Certamente, se voc est no Brasil, perceber que o separado de decimais e inteiros adotados no aqui a vrgula(,), porm quando passamos as coordenadas com vrgula o GoogleMaps no consegue entender, uma vez que seus servidores esto em solo norte-americanos e l o separador decimal o ponto (.). Para resolvermos esse impasse basta setarmos o separador decimal dentro de nossa aplicao para ponto ., sendo assim vamos inserir imediatamente aps o begin da codificao do eventoOnLocationChanged essa linha FormatSettings.DecimalSeparator := .; . Com isso devemos salvar nossa aplicao e execut-la novamente para conferir o resultado.

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.

DELPHI XE5 ACESSANDO A CMERA E COMPARTILHANDO IMAGENS DO DISPOSITIVO ANDROID


Acessar a cmera, a galeria de imagens do dispositivo Android e compartilhar atravs do Delphi XE5 com pouqussimas linhas de cdigo.
Bem como mencionei na postagem anterior a ansiedade grande para cont-la a melhor soluo que encontrei foi colocar a mo na massa e codificar alguns exemplos. Para comear vamos fazer uma pequena aplicao mobile na qual iremos capturar e compartilhar imagens da cmera e da galeria do dispositivo. Nossa aplicao ser toda escrita em cdigos Delphi e rodar num dispositivo Android.

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

StyleLookup > actiontoolbutton Name > imgFoto Align > alClient

Image1

Atribuindo cdigos e Aes


Com a aplicao tendo o layout j definido fica faltando apenas inserir nossas linhas de cdigo, porm juntamente com esse processo faremos atribiues das aes pr-definidas que sero capazes de permitir nossa aplicao acessar as funcionalidades do dispositivo Android. Selecione o btnCam e no Object Inspector, clique sobre a propriedade Action, selecione ento New Standard Action > Media Library > TTakePhotoFromCameraAction.

Ainda no Object Inspector, acesse a guia Events e expanda a propriedade Action , vide imagem abaixo:

a partir da selecione o evento onDidFinishTaking e seu cdigo ficar:


procedure TfrmAndPrincipal.TakePhotoFromCameraAction1DidFinishTaking(Image: TBitmap); begin imgFoto.Bitmap.Assign(Image); end;

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;

Compilar distribuir e usar


Finalizado o nosso processo de codificao da aplicao vamos agora compilar e fazer o deploy de nossa aplicao. Selecione o dispositivo de destino para nossa aplicao, no meu caso escolhi um Motorola XT920, o Razr D3. Aqui temos que lembrar que o aparelho deve estar com o modo de Depurao USB ativo e aceitando fontes desconhecidas de aplicativos. D um Build no projeto e vamos madar Rodar sem depurar (Run without debugging). Aguarde que o prprio Delphi XE5 se encarregar de instalar o apk em seu dispositivo.

Agora s conferir o resultado.

At a prxima.