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.

Aplicação de Exemplo 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:

Layout da Aplicação

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!!!

12 Replies to “Checar se pacote está instalado no Android com Delphi XE7”

  1. 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!!

    1. 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!

      1. 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.

  2. 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!!

    1. 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í.

  3. 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

    1. 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.

      1. 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.

        1. 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;

  4. 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 !

      1. 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.

Deixe um comentário