Verifique se o aplicativo está instalado - Android

104

Estou tentando instalar aplicativos do Google Play. Posso entender que ao abrir o URL da Google Play Store, ele abre o Google Play e quando pressiono o botão Voltar, a atividade é retomada.

Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(appURL));
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(marketIntent);

Quando voltei para a atividade, tentei chamar isso onResume()para verificar se o aplicativo está instalado, mas recebo um erro:

@Override
protected void onResume() {
    super.onResume();
    boolean installed = false;
    while (!installed) {
        installed  =   appInstalledOrNot(APPPACKAGE);
        if (installed) {
             Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show();
        }
    }
}

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

O erro é o seguinte:

E / AndroidRuntime (796): java.lang.RuntimeException: Não foi possível iniciar a atividade ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity}: android.content.ActivityNotFoundException: Nenhuma atividade encontrada para manipular o Intent {act = android .intent.action.VIEW dat = market: // details? id = com.package.name flg = 0x40080000}

Eu acho que a atividade é onPause(). Existe uma maneira melhor de implementá-lo? Estou tentando verificar se a instalação do aplicativo foi concluída.

Siddharthan Asokan
fonte
possível duplicata de Detectar um aplicativo instalado ou não?
Philipp Jahoda
@SiddharthanAsokan Se bem entendi, o que você está tentando conseguir aqui é iniciar seu aplicativo -> ir para a loja de jogo-> clique em instalar -> volte para sua própria atividade -> inicie o aplicativo recém-instalado .. certo?
Varun
Não volte para o aplicativo que abri inicialmente. Preciso obter algumas informações sobre o aplicativo instalado usando o PackageManager. Esta recuperação de informações começa após eu instalar o aplicativo a partir da inicial que usei para abrir o url da web.
Siddharthan Asokan

Respostas:

299

Experimente isto:

private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Ele tenta buscar informações sobre o pacote cujo nome você passou. Caso contrário, se um NameNotFoundExceptionfoi lançado, significa que nenhum pacote com esse nome está instalado, então retornamos false.

Observe que passamos a em PackageManagervez de a Context, de modo que o método seja um pouco mais flexível e não viole a lei de Demeter . Você pode usar o método sem acesso a uma Contextinstância, desde que tenha uma PackageManagerinstância.

Use-o assim:

public void someMethod() {
    // ...

    PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);

    // ...
}
Robin Kanters
fonte
1
A condição é: Preciso verificar se este processo de instalação está concluído. Clico em instalar e, nesse meio tempo, tento verificar a instalação em um loop. O código está bom, mas o método para verificar se a instalação foi concluída é o que estou procurando.
Siddharthan Asokan
3
@SiddharthanAsokan Você pode usar um receptor de transmissão para ação package_added.
Varun
@Varun Acabei de editar o código. Não é mais o nome do pacote do aplicativo que estou usando. Apenas o URL da web do aplicativo na Google Play Store
Siddharthan Asokan,
@Robin Kanters Por favor, revise as mudanças que fiz
Siddharthan Asokan
O que você fez em sua pergunta é igual à minha resposta.
Robin Kanters,
32

A resposta de Robin Kanters está certa, mas verifica se há aplicativos instalados independentemente de seu estado ativado ou desativado.

Todos nós sabemos que um aplicativo pode ser instalado, mas desabilitado pelo usuário, portanto, inutilizável.

Isso verifica se há aplicativos instalados E habilitados:

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

Você pode colocar esse método em uma classe como Utilse chamá-lo em qualquer lugar usando:

boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())
Antonio Papalillo
fonte
5

Experimente isto:

public static boolean isAvailable(Context ctx, Intent intent) {
final PackageManager mgr = ctx.getPackageManager();
List<ResolveInfo> list =   mgr.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
Gopi Cg
fonte
5

Solução mais rápida:

private boolean isPackageInstalled(String packagename, PackageManager packageManager) {
    try {
        packageManager.getPackageGids(packagename);
        return true;
    } catch (NameNotFoundException e) {
        return false;
    }
}

getPackageGidsé mais barato do getPackageInfo, por isso funciona mais rápido.

Run 10000 on API 15
Exists pkg:
getPackageInfo: nanoTime = 930000000
getPackageGids: nanoTime = 350000000
Not exists pkg:
getPackageInfo: nanoTime = 420000000
getPackageGids: nanoTime = 380000000

Run 10000 on API 17
Exists pkg:
getPackageInfo: nanoTime = 2942745517
getPackageGids: nanoTime = 2443716170
Not exists pkg:
getPackageInfo: nanoTime = 2467565849
getPackageGids: nanoTime = 2479833890

Run 10000 on API 22
Exists pkg:
getPackageInfo: nanoTime = 4596551615
getPackageGids: nanoTime = 1864970154
Not exists pkg:
getPackageInfo: nanoTime = 3830033616
getPackageGids: nanoTime = 3789230769

Run 10000 on API 25
Exists pkg:
getPackageInfo: nanoTime = 3436647394
getPackageGids: nanoTime = 2876970397
Not exists pkg:
getPackageInfo: nanoTime = 3252946114
getPackageGids: nanoTime = 3117544269

Nota: Isso não funcionará em alguns espaços virtuais. Eles podem violar a API do Android e sempre retornar uma matriz, mesmo se não houver nenhum aplicativo com esse nome de pacote.
Nesse caso, use getPackageInfo.

Enyby
fonte
0
    private boolean isAppExist() {

    PackageManager pm = getPackageManager();
    try {
        PackageInfo info = pm.getPackageInfo("com.facebook.katana", PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    return true;
}




if (isFacebookExist()) {showToast(" Facebook is  install.");}
     else {showToast(" Facebook is not install.");}
DEVSHK
fonte
0
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

// método para verificar o pacote instalado verdadeiro / falso

  public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    boolean found = true;
    try {
      packageManager.getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
      found = false;
    }

    return found;
  }
Faakhir
fonte
0

Se você quiser tentar sem o bloco try catch, pode usar o seguinte método, Criar um intent e definir o pacote do aplicativo que você deseja verificar

val intent = Intent(Intent.ACTION_VIEW)
intent.data = uri
intent.setPackage("com.example.packageofapp")

e chame o seguinte método para verificar se o aplicativo está instalado

fun isInstalled(intent:Intent) :Boolean{
    val list = context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return list.isNotEmpty()
}
ked
fonte
0

Aqueles que procuram uma solução Kotlin podem usar este método,

Aqui eu compartilhei o código completo e também lidei com o status ativado. Verifique se o aplicativo está instalado no Android Kotlin

fun isAppInstalled(packageName: String, context: Context): Boolean {
        return try {
            val packageManager = context.packageManager
            packageManager.getPackageInfo(packageName, 0)
            true
        } catch (e: PackageManager.NameNotFoundException) {
            false
        }
    }
Asad Ali Choudhry
fonte
-9
@Override 
protected void onResume() {
    super.onResume();
    boolean installed = false;

    while (!installed) {
        installed = appInstalledOrNot (APPPACKAGE);
        if (installed) {
            Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show ();
        }
    }
} 

private boolean appInstalledOrNot (String uri) {
    PackageManager pm = getPackageManager();
    boolean app_installed = false;
    try {
        pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
        app_installed = true;
    } catch (PackageManager.NameNotFoundException e) {
        app_installed = false;
    }
    return app_installed;
}
Pertho
fonte
8
Este é um loop infinito.
Robin Kanters de