Como verificar programaticamente se um aplicativo está instalado ou não no Android?

147

Instalamos aplicativos programaticamente.

  1. Se o aplicativo já estiver instalado no dispositivo, ele será aberto automaticamente.
  2. Caso contrário, instale o aplicativo específico.

Guie-me. Eu não faço ideia. Obrigado.

Sathish Sathish
fonte

Respostas:

317

Tente com isto:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Add respective layout
        setContentView(R.layout.main_activity);

        // Use package name which we want to check
        boolean isAppInstalled = appInstalledOrNot("com.check.application");  

        if(isAppInstalled) {
            //This intent will help you to launch if the package is already installed
            Intent LaunchIntent = getPackageManager()
                .getLaunchIntentForPackage("com.check.application");
            startActivity(LaunchIntent);

            Log.i("Application is already installed.");       
        } else {
            // Do whatever we want to do if application not installed
            // For example, Redirect to play store

            Log.i("Application is not currently installed.");
        }
    }

    private boolean appInstalledOrNot(String uri) {
        PackageManager pm = getPackageManager();
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
        }

        return false;
    }

}
Aerrow
fonte
1
@Sathish: Espero que possa ser útil para você
Aerrow
1
Sem dúvida, sua postagem é realmente útil, mas estou recebendo uma exceção "java.lang.RuntimeException: Falha na adição da janela" e "E / AndroidRuntime (7554): Causada por: android.os.TransactionTooLargeException 05-14 11: 37: 25.305 : E / AndroidRuntime (7554): em android.os.BinderProxy.transact (método nativo) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): em android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession .java: 516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): em android.view.ViewRootImpl.setView (ViewRootImpl.java:494) "
DJhon
2
@BlueGreen: Olá, espero que este link possa ajudá-lo, stackoverflow.com/questions/11451393/… ; caso contrário, se você estiver usando a Dialog Class, verifique-o. :)
Aerrow
1
@Aerrow .. Suponha que eu esteja verificando se meu .apk está instalado ou não? no momento da instalação ... Estou recebendo a mesma exceção ao verificar meu pacote com.test.installedornot. Meu tamanho de .apk é superior a 9 MB; nesse caso, como vou gerenciar essa exceção?
DJhon 14/05
@BlueGreen: o código acima verificará apenas o aplicativo instalado; no momento da instalação, isso não funcionará. Para o seu caso, use o Broadcast receiver para receber a notificação após a instalação do apk.
Aerrow
65

Solução um pouco mais limpa que a resposta aceita (com base nesta pergunta ):

public static boolean isAppInstalled(Context context, String packageName) {
    try {
        context.getPackageManager().getApplicationInfo(packageName, 0);
        return true;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Eu escolhi colocá-lo em uma classe auxiliar como um utilitário estático. Exemplo de uso:

boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");

Esta resposta mostra como obter o aplicativo da Play Store, se o aplicativo estiver ausente, embora seja necessário tomar cuidado em dispositivos que não possuem a Play Store.

Jonik
fonte
isso requer permissões específicas do Android para funcionar?
Bootstrapper
@ Bootstrapper: Não, não requer permissões especiais.
Jonik
Obrigado (Solução de Trabalho)
Naveed Ahmad
26

O código acima não funcionou para mim. A seguinte abordagem funcionou.

Crie um objeto Intent com informações apropriadas e verifique se o Intent pode ser chamado ou não usando a seguinte função:

private boolean isCallable(Intent intent) {  
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,   
        PackageManager.MATCH_DEFAULT_ONLY);  
        return list.size() > 0;  
}
Priyank Desai
fonte
5
Isso é melhor porque não requer o uso de exceções para controle de fluxo!
QED
2
@QED é assustador a quantidade de pessoas que usam Exceções como ifdeclarações! Definitivamente, esta é a resposta certa
ILikeTacos 7/15
1
qual é o conteúdo da intenção? String com o packageName não funciona
Henrique de Sousa
3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
Dominic K
Se o aplicativo foi desativado, ele deve estar errado.
Hugo
15

Se você souber o nome do pacote, isso funcionará sem o uso de um bloco try-catch ou a iteração de vários pacotes:

public static boolean isPackageInstalled(Context context, String packageName) {
    final PackageManager packageManager = context.getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(packageName);
    if (intent == null) {
        return false;
    }
    List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return !list.isEmpty();
}
Kavi
fonte
1
return !list.isEmpty();seria mais estilo java amigável
headsvk
7

Esse código verifica se o aplicativo está instalado, mas também para garantir que ele esteja ativado.

private boolean isAppInstalled(String packageName) {
    PackageManager pm = getPackageManager();
    try {
        pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return pm.getApplicationInfo(packageName, 0).enabled;
    }
    catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return false;
    }
}
youravgjoe
fonte
É o nome do pacote do aplicativo. Por exemplo, "com.example.apps.myapp". Eu editei minha resposta para mostrar packageName em vez de uri.
youravgjoe
3

Eu acho que usar o padrão try / catch não é muito bom para o desempenho. Eu aconselho a usar isso:

public static boolean appInstalledOrNot(Context context, String uri) {
    PackageManager pm = context.getPackageManager();
    List<PackageInfo> packageInfoList = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
    if (packageInfoList != null) {
        for (PackageInfo packageInfo : packageInfoList) {
            String packageName = packageInfo.packageName;
            if (packageName != null && packageName.equals(uri)) {
                return true;
            }
        }
    }
    return false;
}
Egemen Hamutçu
fonte
O código acima no kotlin `` `private fun isAppInstalled (context: Context, uri: String): Booleano {val packageInfoList = context.packageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES) retorna packageInfoList.asSequence (). Filter {it? .PackageName = = uri} .any ()} `` `
Kishan B
3

Solução mais limpa (sem tentativa de captura) do que a resposta aceita (com base na AndroidRate Library ):

public static boolean isPackageExists(@NonNull final Context context, @NonNull final String targetPackage) {
    List<ApplicationInfo> packages = context.getPackageManager().getInstalledApplications(0);
    for (ApplicationInfo packageInfo : packages) {
        if (targetPackage.equals(packageInfo.packageName)) {
            return true;
        }
    }
    return false;
}
Alexander Savin
fonte
2

O aplicativo Check está instalado ou não no Android usando o kotlin.

Criando extensão kotlin.

fun PackageManager.isAppInstalled(packageName: String): Boolean = try {
        getApplicationInfo(packageName, PackageManager.GET_META_DATA)
        true
    } catch (e: Exception) {
        false
    }

Agora, pode verificar se o aplicativo está instalado ou não

if (packageManager.isAppInstalled("AppPackageName")) {
    // App is installed
}else{
    // App is not installed
}
Neeraj Dhameliya
fonte
1

Tente isto

Este código é usado para verificar se seu aplicativo com o nome do pacote está instalado ou não, caso contrário, ele abrirá o link playstore do seu aplicativo, caso contrário, o aplicativo instalado

String your_apppackagename="com.app.testing";
    PackageManager packageManager = getPackageManager();
    ApplicationInfo applicationInfo = null;
    try {
        applicationInfo = packageManager.getApplicationInfo(your_apppackagename, 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    if (applicationInfo == null) {
        // not installed it will open your app directly on playstore
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + your_apppackagename)));
    } else {
        // Installed
        Intent LaunchIntent = packageManager.getLaunchIntentForPackage(your_apppackagename);
        startActivity( LaunchIntent );
    }
Sunil
fonte
1

Uma implementação mais simples usando Kotlin

fun PackageManager.isAppInstalled(packageName: String): Boolean =
        getInstalledApplications(PackageManager.GET_META_DATA)
                .firstOrNull { it.packageName == packageName } != null

E chame assim (procurando pelo aplicativo Spotify):

packageManager.isAppInstalled("com.spotify.music")
Víctor Albertos
fonte
0

Resposta de @Egemen Hamutçu em kotlin B-)

    private fun isAppInstalled(context: Context, uri: String): Boolean {
        val packageInfoList = context.packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES)
        return packageInfoList.asSequence().filter { it?.packageName == uri }.any()
    }
Kishan B
fonte
0

Todas as respostas apenas verificam se determinado aplicativo está instalado ou não. Mas, como todos sabemos, um aplicativo pode ser instalado, mas desativado pelo usuário, inutilizável.

Portanto, esta solução verifica os dois. ou seja, aplicativos AND habilitados e instalados .

public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
     try {
          return packageManager.getApplicationInfo(packageName, 0).enabled;
     }
     catch (PackageManager.NameNotFoundException e) {
          return false;
     }
}

Chame o método isPackageInstalled():

boolean isAppInstalled = isPackageInstalled("com.android.app" , this.getPackageManager());

Agora, use a variável booleana isAppInstallede faça o que quiser.

if(isAppInstalled ) {
    /* do whatever you want */
}
Aashish
fonte
0

Uma resposta legal para outros problemas. Se você não deseja diferenciar "com.myapp.debug" e "com.myapp.release", por exemplo!

public static boolean isAppInstalled(final Context context, final String packageName) {
    final List<ApplicationInfo> appsInfo = context.getPackageManager().getInstalledApplications(0);
    for (final ApplicationInfo appInfo : appsInfo) {
        if (appInfo.packageName.contains(packageName)) return true;
    }
    return false;
}
Nicolas Duponchel
fonte
0

Tão agradável com Kotlin suger:

  private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
David
fonte