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.
quelle
Antworten:
Versuche dies:
Es wird versucht, Informationen über das Paket abzurufen, dessen Namen Sie übergeben haben. Wenn
NameNotFoundException
dies nicht der Fall ist, bedeutet dies, dass kein Paket mit diesem Namen installiert ist. Daher kehren wir zurückfalse
.Beachten Sie, dass wir a
PackageManager
anstelle von a übergebenContext
, 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 eineContext
Instanz verwenden, solange Sie über einePackageManager
Instanz verfügen .Verwenden Sie es so:
quelle
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:
Sie können diese Methode in eine Klasse wie
Utils
einfügen und sie überall aufrufen, indem Sie:quelle
Versuche dies:
quelle
Schnellere Lösung:
getPackageGids
ist günstiger abgetPackageInfo
, so dass es schneller funktioniert.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
.quelle
quelle
// Methode zum Überprüfen des installierten Pakets true / false
quelle
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
Rufen Sie die folgende Methode auf, um zu überprüfen, ob die App installiert ist
quelle
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
quelle
quelle