Próbuję zainstalować aplikacje z Google Play. Rozumiem, że po otwarciu adresu URL sklepu Google Play otwiera Google Play, a po naciśnięciu przycisku Wstecz aktywność zostaje wznowiona.
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);
Kiedy wróciłem do tej czynności, próbowałem zadzwonić pod ten onResume()
numer, aby sprawdzić, czy aplikacja jest zainstalowana, ale pojawia się błąd:
@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 ;
}
Błąd jest następujący:
E / AndroidRuntime (796): java.lang.RuntimeException: Nie można rozpocząć działania ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity}: android.content.ActivityNotFoundException: Nie znaleziono działania obsługującego zamiar {act = android .intent.action.VIEW dat = market: // details? id = com.package.name flg = 0x40080000}
Myślę, że aktywność jest onPause()
. Czy jest lepszy sposób na jego wdrożenie? Próbuję sprawdzić, czy aplikacja została zainstalowana.
źródło
Odpowiedzi:
Spróbuj tego:
Próbuje pobrać informacje o pakiecie, którego nazwę podałeś. Jeśli to się nie powiedzie, jeśli zostanie
NameNotFoundException
wyrzucony, oznacza to, że żaden pakiet o tej nazwie nie jest zainstalowany, więc zwracamyfalse
.Zauważ, że przekazujemy a
PackageManager
zamiast aContext
, dzięki czemu metoda jest nieco bardziej elastyczna i nie narusza prawa Demeter . Możesz użyć tej metody bez dostępu doContext
instancji, o ile maszPackageManager
instancję.Użyj tego w ten sposób:
źródło
Odpowiedź Robina Kantersa jest poprawna, ale sprawdza, czy są zainstalowane aplikacje, niezależnie od ich stanu włączenia lub wyłączenia.
Wszyscy wiemy, że aplikacja może zostać zainstalowana, ale wyłączona przez użytkownika, przez co nie nadaje się do użytku.
To sprawdza, czy aplikacje są zainstalowane ORAZ włączone:
Możesz umieścić tę metodę w klasie
Utils
i wywoływać ją wszędzie za pomocą:źródło
Spróbuj tego:
źródło
Szybsze rozwiązanie:
getPackageGids
jest tańszy odgetPackageInfo
, więc działa szybciej.Uwaga: to nie zadziała w niektórych przestrzeniach wirtualnych. Mogą naruszać Android API i zawsze zwracać tablicę, nawet jeśli nie ma aplikacji o tej nazwie pakietu.
W takim przypadku użyj
getPackageInfo
.źródło
źródło
// metoda sprawdzenia zainstalowanego pakietu prawda / fałsz
źródło
Jeśli chcesz wypróbować to bez bloku try catch, możesz użyć następującej metody: Utwórz intencję i ustaw pakiet aplikacji, którą chcesz zweryfikować
i wywołaj następującą metodę, aby sprawdzić, czy aplikacja jest zainstalowana
źródło
Poszukujący rozwiązania Kotlin mogą skorzystać z tej metody,
Tutaj udostępniłem pełny kod, a także obsłużyłem status włączony. Sprawdź, czy aplikacja jest zainstalowana w systemie Android Kotlin
źródło
źródło