Ü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.

Siddharthan Asokan
quelle
Mögliches Duplikat von Erkennen, dass eine Anwendung installiert ist oder nicht?
Philipp Jahoda
@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);

    // ...
}
Robin Kanters
quelle
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())
Antonio Papalillo
quelle
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;
}
Gopi Cg
quelle
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.

Enyby
quelle
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
quelle
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;
  }
Faakhir
quelle
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()
}
ked
quelle
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
        }
    }
Asad Ali Choudhry
quelle
-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
quelle
8
Dies ist eine Endlosschleife.
Robin Kanters