web-dev-qa-db-de.com

Wie kann programmgesteuert geprüft werden, ob eine Anwendung in Android installiert ist oder nicht?

Wir haben Anwendungen programmgesteuert installiert.

  1. Wenn die Anwendung bereits auf dem Gerät installiert ist, wird die Anwendung automatisch geöffnet.
  2. Ansonsten installieren Sie die jeweilige Anwendung.

Führe mich. Ich habe keine Ahnung ... Danke.

132
Sathish Sathish

Versuchen Sie es damit:

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

}
292
Aerrow

Etwas sauberere Lösung als die akzeptierte Antwort (basierend auf dieser Frage ):

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

Ich entschied mich für eine Hilfsklasse als statisches Hilfsprogramm. Anwendungsbeispiel:

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

Diese Antwort zeigt, wie Sie die App aus dem Play Store beziehen, wenn die App fehlt, obwohl auf Geräten ohne Play Store Vorsicht geboten ist.

57
Jonik

Der obige Code hat für mich nicht funktioniert. Der folgende Ansatz hat funktioniert.

Erstellen Sie ein Intent-Objekt mit entsprechenden Informationen und prüfen Sie, ob der Intent aufrufbar ist oder die folgende Funktion nicht verwendet:

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

Wenn Sie den Paketnamen kennen, funktioniert dies, ohne einen try-catch-Block zu verwenden oder mehrere Pakete zu durchlaufen:

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

Dieser Code prüft, ob die App installiert ist, stellt jedoch auch sicher, dass sie aktiviert ist. 

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

Sauberere Lösung (ohne Try-Catch) als die akzeptierte Antwort (basierend auf 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;
}
3
Alexander Savin

Ich denke, das Try/Catch-Muster ist nicht sehr gut für die Performance. Ich empfehle, dies zu verwenden:

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;
}
2
Egemen Hamutçu

Versuche dies

Dieser Code wird verwendet, um zu überprüfen, ob Ihre Anwendung mit dem Paketnamen installiert ist oder Wenn nicht, öffnet sich der Playstore-Link Ihrer App, andernfalls Ihre installierte App

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
Sunil

Eine einfachere Implementierung mit Kotlin

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

Und nenne es so (suche Spotify App):

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

Eine coole Antwort auf andere Probleme ... Wenn Sie nicht zwischen "com.myapp.debug" und "com.myapp.release" unterscheiden möchten! 

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

@Egemen Hamutçus Antwort 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
Kishan B

Alle Antworten überprüfen nur, ob die App installiert ist oder nicht. Aber wie wir alle wissen, kann eine App installiert werden, aber vom Benutzer deaktiviert werden.

Daher prüft diese Lösung beide. d. h. installierte UND aktivierte Apps .

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

Rufen Sie die Methode isPackageInstalled() auf:

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

Verwenden Sie nun die boolesche Variable isAppInstalled und machen Sie, was Sie möchten.

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