Volta e meia precisamos interagir nossa aplicação com outras aplicações, mas como saber se esta aplicação que precisamos chamar está ou não instalada no Android.
Nesta postagem veremos como checar com uma aplicação Delphi XE7 se um determinado pacote encontra-se instalado no dispositivo Android.
Contextualizando com um exemplo prático
Digamos que precisamos verificar através de nossa aplicação Android desenvolvida com Delphi XE7 se o dispositivo possui instalado o pacote da Aplicação de Exemplo de minha apresentação na Embarcadero Conference BR 2014. Esta aplicação lembrando que esta aplicação encontra-se disponível para download na Google Play com o nome de Intents XE7.
Direto ao Delphi XE7
Iniciaremos o Delphi XE7 e criaremos uma nova aplicação Delphi Multi-Device em branco, e como temos apenas fins didáticos vamos apenas inserir 1 Button e 1 Image. Configure as propriedades dos componentes como segue:
- Image1
- MultiResBitmap –> [Uma imagem de sua preferência]
- WrapMode –> Stretch
- Button1
- Text –> ‘Verificar existência Intents XE7’
Após isso feito teremos nossa aplicação com a tela bem próxima à imagem abaixo:
Codificando
Teremos apenas o clique do botão sendo responsável por executar a verificação da existência do aplicativo desejado. Esta verificação se dará consultando o pacote, Package Name, da aplicação Intents XE7 já encontra-se instalado no dispositivo. Lembrando que o pacote em questão é: br.landersongomes.Intent_xe7 .
Na cláusula uses da seção implementation adicionamos as seguinte units:
implementation
{$R *.fmx}
uses
Androidapi.Jni.GraphicsContentViewText,
Androidapi.Helpers,
Androidapi.NativeActivity,
Androidapi.JNIBridge,
IdURI,
Androidapi.Jni.Net;
Para o clique do botão teremos o seguinte código:
procedure TForm1.Button1Click(Sender: TObject);
var
Intent : JIntent;
Info: JApplicationInfo;
begin
try
Info := SharedActivityContext.getPackageManager.getApplicationInfo(
StringToJString('br.landersongomes.Intent_xe7'),0);
if Info.packageName.equals(StringToJString('br.landersongomes.Intent_xe7')) then
begin
ShowMessage('Intents XE7 já instalado');
end;
except on E: Exception do
begin
Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
Intent.setData(TJnet_Uri.JavaClass.parse(StringToJString(
'https://play.google.com/store/apps/details?id=br.landersongomes.Intent_xe7')));
Intent.setPackage(StringToJString('com.android.vending'));
SharedActivity.startActivity(intent);
end;
end;
end;
Entendendo o código
Bem, agora que já fizemos a parte difícil… vamos entender a que se propõe o código implementado. Ao clicar no botão a aplicação receberá as informações da aplicação cujo pacote tem o nome que estamos buscando, no nosso caso: br.landersongomes.Intent_xe7 . Se esta informação trazida for igual ao nome que informamos agora através de uma string: ‘br.landersongomes.Intent_xe7’, será exibida uma mensagem de que a aplicação já encontra-se instalada no dispositivo. Caso não encontre ocorrerá uma Exception, com isso vamos sugerir que nossa aplicação vá ao Google Play e mostre este pacote lá para que possamos efetuar seu download.
Rodando e conferindo o resultado
Execute a aplicação e confira o resultado, na prática fica mais fácil a compreensão!
Veja o funcionamento detalhado também no vídeo abaixo:
Até a próxima!!!










Gostaria de deixar aqui os meus parabéns pela sua iniciativa em divulgar esses videos. Esse exemplo pode ser usado no XE6?? Outra coisa, vc tem exemplos de relatórios e gráficos?? Obrigado!!
Olá Eduardo… obrigado pela parabenização, mas é só um passatempo e aqui compartilho alguns temas que passo na minha “brincadeira” de desenvolver!
Ainda não fiz nada com gráficos, mas num projeto que está em mente aqui terei o tema abordado sim, então logo teremos um post sobre o assunto!
Mais uma vez obrigado pelos parabéns, mas acima de tudo por sua participação!
Abraço!
Olá, boa noite.
Preciso fazer o seguinte: Tenho um registro para ser trafegado de um aparelho para outro. Existem alguma forma de fazermos tipo por um beep de um aparelho e o outro aparelho reconhece esse beep e traduz a informação trafegada nele?
Ou algo melhor que bluetooth?
Aguardo retorno, caso saiba como me ajudar, posso pagar pela consultoria. Abraços e sucesso.
Olá Landerson, você já me ajudou muito com seus posts.
Queria saber se você sabe algo sobre a propriedade StyleLookup de um Button ou SpeedButton. Ali tem alguns icones, queria saber se tem como colocar mais icones ali, ou tem alguma outra forma de colocar icones novos nos botões sem ser colocando um image dentro de um speedbutton..?
Muito Obrigado!!
Olá Yago, que bom que as postagens têm te ajudado, afinal esse é o propósito!
Bem com relação a sua pergunta sobre os styleLookups eu nunca tentei nada nesse sentido, mas a Sarina DuPont lançou uma série de postagens sobre como criar e personalizar os Styles… talvez lá você tenha algo que seja útil na sua busca. Dá uma conferida, apesar de estarem em inglês são bem intuitivos os tutorias dela, até eu consegui entender alguns (rs).
Abração e sucesso aí.
Boa noite Landerson, muito bom o artigo, porém tentei usar o exemplo juntamente com um outro tópico seu sobre leitura de Código de Barras para testar se o App “Barcode Scanner” ta instalado porém não conseguir implementar, pois ele sempre cai no except, mais o app já ta instalado.
Segue a linha onde testo o código:
const
pacote = ‘com.google.zxing.client.android.SCAN’;
link = ‘https://play.google.com/store/apps/details?id=com.google.zxing.client.android’;
{$IFDEF ANDROID}
var
Intent : JIntent;
Info : JApplicationInfo;
{$ENDIF}
begin
{$IFDEF ANDROID}
try
Info := SharedActivityContext.getPackageManager.getApplicationInfo(StringToJString(pacote),0);
if Info.packageName.equals(StringToJString(pacote)) then
begin
TKRBarCodeScanner.Scan;
end;
except on E: Exception do
begin
Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
Intent.setData(TJnet_Uri.JavaClass.parse(StringToJString(link)));
Intent.setPackage(StringToJString(‘com.android.vending’));
SharedActivity.startActivity(intent);
end;
end;
https://landersongomes.com.br/delphi/leitura-de-codigo-de-barras-em-android-com-delphi-xe5
Olá Warquia, seja bem vindo!
Bem eu tenho um projeto aqui eu ele faz exatamente o que você quer, porém não deu problema algum.
Para tentar auxiliá-lo aí segue abaixo a Unit em que utilizo este processo, exatamente com o Código de Barras:
unit frmXXXUnt;
interface
uses
...
Androidapi.Helpers,
FMX.Platform.Android,
Androidapi.JNIBridge,
IdURI, Androidapi.Jni.Net, FMX.Controls.Presentation, FMX.Edit, FMX.Layouts,
FMX.Objects;
type
TfrmXXX = class(TForm)
...
private
{ Private declarations }
ClipService: IFMXClipboardService;
Elapsed: integer;
...
implementation
{$R *.fmx}
uses Androidapi.NativeActivity;
procedure TfrmXXX.btnEANClick(Sender: TObject);
var
Intent : JIntent;
Info : JApplicationInfo;
Ok : Boolean;
begin
Ok := False;
try
Info := SharedActivityContext.getPackageManager.getApplicationInfo(
StringToJString('com.google.zxing.client.android'),0);
if Info.packageName.equals(StringToJString('com.google.zxing.client.android')) then
begin
Ok := True;
// if OK then
// begin
// if Assigned(ClipService) then
// begin
// ClipService.SetClipboard('nil');
// Intent := TJIntent.Create;
// Intent.setAction(stringtojstring('com.google.zxing.client.android.SCAN'));
// SharedActivity.startActivityForResult(intent,0);
// Elapsed := 0;
// timer1.Enabled := true;
// end;
// end;
end;
except on E: Exception do
begin
Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
Intent.setData(TJnet_Uri.JavaClass.parse(StringToJString(
'https://play.google.com/store/apps/details?id=com.google.zxing.client.android')));
Intent.setPackage(StringToJString('com.android.vending'));
SharedActivity.startActivity(intent);
end;
end;
if OK then
begin
if Assigned(ClipService) then
begin
ClipService.SetClipboard('nil');
Intent := TJIntent.Create;
Intent.setAction(stringtojstring('com.google.zxing.client.android.SCAN'));
SharedActivity.startActivityForResult(intent,0);
Elapsed := 0;
Timer1.Enabled := true;
end;
end;
end;
Espero que possa ser útil.
Obrigado por sua participação e poste um feedback depois sinalizando se correu tudo bem.
Boa noite Landerson, muito obrigado pelas considerações. amigo, peguei o seu exemplo e mesmo assim não conseguiu encontrar o pacote ou seja sempre é redirecionado para o PlayStore, já tentei mudar o caminho do pacote nos seguintes modos abaixo porém sem resultado:
“com.google.zxing”
“com.google.zxing.client”
“com.google.zxing.client.android”
“com.google.zxing.client.android.SCAN”
uso o Delphi XE7 juntamente com um galaxy S2 DUOS.
segue o link do projeto com a sua unit proposta.
https://mega.co.nz/#!FthWXbgL!CYG-xfejySanXf6QEe0X-7zT89_rthLh2bbVGXc-K0k
Muito Agradecido por ter respondido,
Att.
Warquia P.
Bom dia,
Se você não conseguiu resolver ainda, ou para quem precisar…
Info := SharedActivityContext.getPackageManager.getApplicationInfo(StringToJString(‘com.google.zxing.client.android’), 0);
{ Para descobrir o “endereço” do aplicativo dentro do celular, basta ir nas configurações de desenvolvedor e habilitar a opção:
“Exibir uso de CPU – Sobrepor tela para exibir o uso da CPU atual”.
Quando você habilitar, do lado direito irá apareceber uma lista com os endereços dos aplicativos que estão executando, tanto em primeiro quanto em segundo plano.
então basta abrir o que você precisa saber e pronto. }
if Info.packageName.equals(StringToJString(‘com.google.zxing.client.android’)) then
vContinua := True;
Prezado, parabéns pelos posts. Verdadeiras aulas !!!!
Gostaria de ver esse exemplo funcionando da seguinte maneira: Se o App está instalado, gostaria de executá-lo. Poderia dar uma sugestão de como fazer ?
Grato !
Você encontrou uma solução Srader ? Também gostaria de saber a mesma coisa .
Carolina, olá novamente!
Uma vez verificado o nome do pacote basta “chamá-lo” através de intent, pode ser como nos exemplos desta postagem: https://landersongomes.com.br/embarcadero/delphi/intents-com-delphi-xe5-comunicando-apps-atraves-do-android.
Caso não tenha conseguido, por favor me envie o nome do app que você está tentando fazer a busca, a versão do Delphi para eu tentar te auxiliar mais pontualmente.
Mais uma vez obrigado por sua participação.