Sprawdź, czy aplikacja jest zainstalowana - Android

104

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.

Siddharthan Asokan
źródło
możliwy duplikat Wykryj aplikację jest zainstalowana czy nie?
Philipp Jahoda,
@SiddharthanAsokan Jeśli dobrze rozumiem, to, co próbujesz tutaj osiągnąć, to: uruchom swoją aplikację -> przejdź do sklepu Play -> kliknij zainstaluj -> wróć do własnej aktywności -> uruchom nowo zainstalowaną aplikację… czy to prawda?
Varun
Nie, wróć do aplikacji, którą otworzyłem na początku. Muszę uzyskać informacje o zainstalowanej aplikacji za pomocą PackageManager. Pobieranie tych informacji rozpoczyna się po zainstalowaniu aplikacji z początkowej wersji, która otworzyła adres URL.
Siddharthan Asokan

Odpowiedzi:

300

Spróbuj tego:

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

Próbuje pobrać informacje o pakiecie, którego nazwę podałeś. Jeśli to się nie powiedzie, jeśli zostanie NameNotFoundExceptionwyrzucony, oznacza to, że żaden pakiet o tej nazwie nie jest zainstalowany, więc zwracamy false.

Zauważ, że przekazujemy a PackageManagerzamiast a Context, dzięki czemu metoda jest nieco bardziej elastyczna i nie narusza prawa Demeter . Możesz użyć tej metody bez dostępu do Contextinstancji, o ile masz PackageManagerinstancję.

Użyj tego w ten sposób:

public void someMethod() {
    // ...

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

    // ...
}
Robin Kanters
źródło
1
Warunek jest taki: muszę sprawdzić ten proces instalacji, jeśli został zakończony. Klikam na zainstaluj iw międzyczasie próbuję sprawdzić instalację w pętli. Kod jest w porządku, ale szukam metody sprawdzania, czy instalacja została zakończona.
Siddharthan Asokan
3
@SiddharthanAsokan Możesz użyć odbiornika rozgłoszeniowego dla akcji package_added.
Varun
@Varun Właśnie zredagowałem kod. Nie używam już nazwy pakietu aplikacji. Tylko URL aplikacji w sklepie Google Play
Siddharthan Asokan
@Robin Kanters Proszę przejrzyj zmiany, które wprowadziłem
Siddharthan Asokan
To, co zrobiłeś w swoim pytaniu, jest takie samo jak moja odpowiedź.
Robin Kanters,
33

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:

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

Możesz umieścić tę metodę w klasie Utilsi wywoływać ją wszędzie za pomocą:

boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())
Antonio Papalillo
źródło
5

Spróbuj tego:

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
źródło
5

Szybsze rozwiązanie:

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

getPackageGidsjest tańszy od getPackageInfo, więc działa szybciej.

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

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.

Enyby
źródło
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
źródło
0
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

// metoda sprawdzenia zainstalowanego pakietu prawda / fałsz

  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
źródło
0

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ć

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

i wywołaj następującą metodę, aby sprawdzić, czy aplikacja jest zainstalowana

fun isInstalled(intent:Intent) :Boolean{
    val list = context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return list.isNotEmpty()
}
ked
źródło
0

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

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
źródło
-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
źródło
8
To jest nieskończona pętla.
Robin Kanters,