Überprüfen Sie, ob die Anwendung installiert ist - Android


104

Ich versuche, Apps von Google Play zu installieren. Ich kann verstehen, dass beim Öffnen der Google Play Store-URL Google Play geöffnet wird und die Aktivität fortgesetzt wird, wenn ich die Zurück-Taste drücke.

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

Als ich zur Aktivität zurückkehrte, habe ich versucht, dies aufzurufen onResume(), um zu überprüfen, ob die App installiert ist. Es wird jedoch eine Fehlermeldung angezeigt:

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

Der Fehler ist wie folgt:

E / AndroidRuntime (796): java.lang.RuntimeException: Aktivität ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity} kann nicht gestartet werden: android.content.ActivityNotFoundException: Es wurde keine Aktivität für Intent {act = android gefunden .intent.action.VIEW dat = market: // details? id = com.package.name flg = 0x40080000}

Ich denke die Aktivität ist onPause(). Gibt es einen besseren Weg, um es umzusetzen? Ich versuche zu überprüfen, ob die Installation der App abgeschlossen ist.



@SiddharthanAsokan Wenn ich richtig verstehe, was Sie hier erreichen möchten, starten Sie Ihre App -> gehen Sie zum Play Store -> klicken Sie auf Installieren -> kehren Sie zu Ihrer eigenen Aktivität zurück -> starten Sie die neu installierte App .. stimmt das?
Varun

Nein, gehe zurück zu der App, die ich ursprünglich geöffnet habe. Ich muss einige Informationen über die installierte App mit PackageManager erhalten. Dieser Informationsabruf beginnt, nachdem ich die App von der Initiale installiert habe, die die Web-URL geöffnet hat.
Siddharthan Asokan

Antworten:


298

Versuche dies:

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

Es wird versucht, Informationen über das Paket abzurufen, dessen Namen Sie übergeben haben. Wenn NameNotFoundExceptiondies nicht der Fall ist, bedeutet dies, dass kein Paket mit diesem Namen installiert ist. Daher kehren wir zurück false.

Beachten Sie, dass wir a PackageManageranstelle von a übergeben Context, damit die Methode etwas flexibler verwendet werden kann und nicht gegen das Gesetz von Demeter verstößt . Sie können die Methode ohne Zugriff auf eine ContextInstanz verwenden, solange Sie über eine PackageManagerInstanz verfügen .

Verwenden Sie es so:

public void someMethod() {
    // ...

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

    // ...
}

1
Die Bedingung ist: Ich muss diesen Installationsprozess überprüfen, wenn er abgeschlossen ist. Ich klicke auf Installieren und versuche in der Zwischenzeit, die Installation in einer Schleife zu überprüfen. Der Code ist in Ordnung, aber die Methode, um zu überprüfen, ob die Installation abgeschlossen ist, ist das, wonach ich suche.
Siddharthan Asokan

3
@SiddharthanAsokan Sie können einen Broadcast-Empfänger für die Aktion package_added verwenden.
Varun

@ Varun Ich habe gerade den Code bearbeitet. Es ist kein App-Paketname mehr, den ich benutze. Nur die Web-URL der App im Google Play Store
Siddharthan Asokan

@ Robin Kanters Bitte überprüfen Sie die Änderungen, die ich vorgenommen habe
Siddharthan Asokan

Was Sie in Ihrer Frage getan haben, entspricht meiner Antwort.
Robin Kanters

32

Die Antwort von Robin Kanters ist richtig, sucht jedoch nach installierten Apps, unabhängig von deren aktiviertem oder deaktiviertem Status.

Wir alle wissen, dass eine App installiert, aber vom Benutzer deaktiviert werden kann und daher unbrauchbar ist.

Dies sucht nach installierten UND aktivierten Apps:

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

Sie können diese Methode in eine Klasse wie Utilseinfügen und sie überall aufrufen, indem Sie:

boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())

5

Versuche dies:

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

5

Schnellere Lösung:

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

getPackageGidsist günstiger ab getPackageInfo, so dass es schneller funktioniert.

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

Hinweis: Dies funktioniert in einigen virtuellen Räumen nicht. Sie können die Android-API verletzen und immer ein Array zurückgeben, auch wenn es keine Anwendung mit diesem Paketnamen gibt.
In diesem Fall verwenden getPackageInfo.


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

0
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

// Methode zum Überprüfen des installierten Pakets true / false

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

    return found;
  }

0

Wenn Sie es ohne den try catch-Block versuchen möchten, können Sie die folgende Methode verwenden: Erstellen Sie eine Absicht und legen Sie das Paket der App fest, das Sie überprüfen möchten

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

Rufen Sie die folgende Methode auf, um zu überprüfen, ob die App installiert ist

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

0

Diejenigen, die nach einer Kotlin-Lösung suchen, können diese Methode verwenden:

Hier habe ich den vollständigen Code freigegeben und auch den aktivierten Status behandelt. Überprüfen Sie, ob die Anwendung in Android Kotlin installiert ist

fun isAppInstalled(packageName: String, context: Context): Boolean {
        return try {
            val packageManager = context.packageManager
            packageManager.getPackageInfo(packageName, 0)
            true
        } catch (e: PackageManager.NameNotFoundException) {
            false
        }
    }

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

8
Dies ist eine Endlosschleife.
Robin Kanters
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.