Come verificare a livello di programmazione se un'applicazione è installata o meno in Android?


Risposte:


317

Prova con questo:

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;
    }

}

1
@Sathish: spero possa esserti utile
Aerrow,

1
Senza dubbio il tuo post è davvero utile, ma sto ricevendo un'eccezione "java.lang.RuntimeException: aggiunta finestra non riuscita" e "E / AndroidRuntime (7554): causato da: android.os.TransactionTooLargeException 05-14 11: 37: 25.305 : E / AndroidRuntime (7554): su android.os.BinderProxy.transact (metodo nativo) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): su android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession .java: 516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): at android.view.ViewRootImpl.setView (ViewRootImpl.java:494) "
DJhon

2
@BlueGreen: Ciao, spero che questo link ti possa aiutare, stackoverflow.com/questions/11451393/… , altrimenti se stai usando Dialog Class significa gentilmente controllarlo. :)
Aerrow,

1
@Aerrow .. Supponiamo che io stia verificando che il mio .apk sia installato o no? al momento dell'installazione ... Ricevo la stessa eccezione durante il controllo del mio pacchetto com.test.installedornot.La mia dimensione .apk è superiore a 9 MB, in tal caso come gestirò questa eccezione?
DJhon

@BlueGreen: il codice sopra controlla solo l'app installata, al momento dell'installazione questo non funzionerà. Nel tuo caso, usa il ricevitore Broadcast per ottenere la notifica dopo aver installato l'apk.
Aerrow,

65

Soluzione un po 'più pulita della risposta accettata (basata su questa domanda ):

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

Ho scelto di inserirlo in una classe di supporto come utility statica. Esempio di utilizzo:

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

Questa risposta mostra come ottenere l'app dal Play Store se l'app è mancante, anche se è necessario prestare attenzione sui dispositivi che non dispongono del Play Store.


questo richiede autorizzazioni Android specifiche per funzionare?
Bootstrapper,

@Bootstrapper: No, non richiede autorizzazioni speciali.
Jonik,

Grazie (soluzione di lavoro)
Naveed Ahmad,

26

Il codice sopra non ha funzionato per me. Il seguente approccio ha funzionato.

Creare un oggetto Intent con le informazioni appropriate e quindi verificare se Intent è richiamabile o non utilizza la seguente funzione:

private boolean isCallable(Intent intent) {  
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,   
        PackageManager.MATCH_DEFAULT_ONLY);  
        return list.size() > 0;  
}

5
Questo è meglio perché non richiede l'utilizzo di eccezioni per il controllo del flusso!
QED

2
@QED sta spaventando la quantità di persone che usano le Eccezioni come ifdichiarazioni! Questa è sicuramente la risposta giusta
ILikeTacos

1
qual è il contenuto dell'intento? la stringa con il nome del pacchetto non funziona
Henrique de Sousa il

3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
Dominic K,

Se l'applicazione è stata disabilitata, dovrebbe essere errata.
Hugo,

15

Se conosci il nome del pacchetto, questo funziona senza usare un blocco try-catch o iterando attraverso un mucchio di pacchetti:

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();
}

1
return !list.isEmpty();sarebbe più amichevole in stile java
headsvk

7

Questo codice verifica che l'app sia installata, ma verifica anche che sia abilitata.

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;
    }
}

È il nome del pacchetto dell'app. Ad esempio, "com.example.apps.myapp". Ho modificato la mia risposta per mostrare packageName anziché uri.
Youravgjoe,

3

Penso che usare il modello try / catch non sia molto buono per le prestazioni. Consiglio di usare questo:

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;
}

Il codice sopra in kotlin `` `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

3

Soluzione più pulita (senza try-catch) rispetto alla risposta accettata (basata su 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;
}

2

Controlla che l'app sia installata o meno in Android usando kotlin.

Creazione dell'estensione kotlin.

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

Ora, posso verificare se l'app è installata o meno

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

1

Prova questo

Questo codice viene utilizzato per verificare se la tua applicazione con il nome del pacchetto è installata o meno, in caso contrario aprirà il link playstore della tua app, altrimenti l'app installata

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 );
    }

1

Un'implementazione più semplice con Kotlin

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

E chiamalo così (cercando l'app Spotify):

packageManager.isAppInstalled("com.spotify.music")

0

@Egemen Hamutçu's answer in 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()
    }

0

Tutte le risposte verificano solo che determinate app siano installate o meno. Ma, come tutti sappiamo, un'app può essere installata ma disabilitata dall'utente, inutilizzabile.

Pertanto, questa soluzione controlla entrambi. ovvero app installate e abilitate .

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

Chiama il metodo isPackageInstalled():

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

Ora usa la variabile booleana isAppInstallede fai quello che vuoi.

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

0

Una bella risposta ad altri problemi. Se non vuoi differenziare "com.myapp.debug" e "com.myapp.release" per esempio!

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;
}

0

Così più bello con suot Kotlin:

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

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.