Jak programowo sprawdzić, czy aplikacja jest zainstalowana na Androidzie?

147

Zainstalowaliśmy aplikacje programowo.

  1. Jeśli aplikacja jest już zainstalowana w urządzeniu, jest ona otwierana automatycznie.
  2. W przeciwnym razie zainstaluj konkretną aplikację.

Prowadź mnie. Nie mam pojęcia. Dzięki.

Sathish Sathish
źródło

Odpowiedzi:

317

Spróbuj z tym:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Add respective layout
        setContentView(R.layout.main_activity);

        // Use package name which we want to check
        boolean isAppInstalled = appInstalledOrNot("com.check.application");  

        if(isAppInstalled) {
            //This intent will help you to launch if the package is already installed
            Intent LaunchIntent = getPackageManager()
                .getLaunchIntentForPackage("com.check.application");
            startActivity(LaunchIntent);

            Log.i("Application is already installed.");       
        } else {
            // Do whatever we want to do if application not installed
            // For example, Redirect to play store

            Log.i("Application is not currently installed.");
        }
    }

    private boolean appInstalledOrNot(String uri) {
        PackageManager pm = getPackageManager();
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
        }

        return false;
    }

}
Aerrow
źródło
1
@Sathish: Mam nadzieję, że to może być pomocne dla Ciebie
Aerrow,
1
Bez wątpienia Twój post jest naprawdę pomocny, ale otrzymuję wyjątek „java.lang.RuntimeException: Nie udało się dodać okna” i „E / AndroidRuntime (7554): Spowodowany przez: android.os.TransactionTooLargeException 05-14 11: 37: 25.305 : E / AndroidRuntime (7554): na android.os.BinderProxy.transact (metoda natywna) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): na android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession .java: 516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): w android.view.ViewRootImpl.setView (ViewRootImpl.java:494) ”
DJhon
2
@BlueGreen: Cześć, mam nadzieję, że ten link może ci pomóc, stackoverflow.com/questions/11451393/… , w przeciwnym razie, jeśli używasz klasy Dialog, uprzejmie sprawdź to. :)
Aerrow
1
@Aerrow .. Załóżmy, że sprawdzam, czy moja aplikacja .apk jest zainstalowana, czy nie? w czasie instalacji ... Otrzymuję ten sam wyjątek podczas sprawdzania mojego pakietu com.test.installedornot.Mój plik .apk ma więcej niż 9 MB, to w takim przypadku jak sobie poradzę z tym wyjątkiem?
DJhon
@BlueGreen: Powyższy kod sprawdzi tylko zainstalowaną aplikację, w momencie instalacji to nie będzie działać. W swoim przypadku użyj odbiornika transmisji, aby otrzymać powiadomienie po zainstalowaniu tego apk.
Aerrow
65

Nieco czystsze rozwiązanie niż przyjęta odpowiedź (na podstawie tego pytania ):

public static boolean isAppInstalled(Context context, String packageName) {
    try {
        context.getPackageManager().getApplicationInfo(packageName, 0);
        return true;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Zdecydowałem się umieścić go w klasie pomocniczej jako statyczne narzędzie. Przykład użycia:

boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");

Ta odpowiedź pokazuje, jak pobrać aplikację ze Sklepu Play, jeśli brakuje aplikacji, ale należy zachować ostrożność na urządzeniach, które nie mają Sklepu Play.

Jonik
źródło
czy wymaga to jakichś określonych uprawnień Androida do działania?
Bootstrapper
@Bootstrapper: Nie, nie wymaga to żadnych specjalnych uprawnień.
Jonik
Dzięki (rozwiązanie robocze)
Naveed Ahmad
26

Powyższy kod nie działa dla mnie. Następujące podejście zadziałało.

Utwórz obiekt intencji z odpowiednimi informacjami, a następnie sprawdź, czy intencja jest wywoływalna, czy nie, używając następującej funkcji:

private boolean isCallable(Intent intent) {  
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,   
        PackageManager.MATCH_DEFAULT_ONLY);  
        return list.size() > 0;  
}
Priyank Desai
źródło
5
Jest to lepsze, ponieważ nie wymaga używania wyjątków do kontroli przepływu!
QED
2
@QED to przerażająca liczba osób używających wyjątków jako ifstwierdzeń! To zdecydowanie właściwa odpowiedź
ILikeTacos
1
jaka jest treść intencji? String z packageName nie działa
Henrique de Sousa
3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
Dominic K
Jeśli aplikacja była wyłączona, powinna być błędna.
Hugo,
15

Jeśli znasz nazwę pakietu, działa to bez użycia bloku try-catch lub iteracji przez kilka pakietów:

public static boolean isPackageInstalled(Context context, String packageName) {
    final PackageManager packageManager = context.getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(packageName);
    if (intent == null) {
        return false;
    }
    List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return !list.isEmpty();
}
Kavi
źródło
1
return !list.isEmpty();byłoby bardziej przyjazne w stylu java
headsvk
7

Ten kod sprawdza, czy aplikacja jest zainstalowana, ale także sprawdza, czy jest włączona.

private boolean isAppInstalled(String packageName) {
    PackageManager pm = getPackageManager();
    try {
        pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return pm.getApplicationInfo(packageName, 0).enabled;
    }
    catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return false;
    }
}
youravgjoe
źródło
To nazwa pakietu aplikacji. Na przykład „com.example.apps.myapp”. Edytowałem moją odpowiedź, aby wyświetlić nazwę pakietu zamiast uri.
youravgjoe
3

Myślę, że użycie wzorca try / catch nie jest dobre dla wydajności. Radzę skorzystać z tego:

public static boolean appInstalledOrNot(Context context, String uri) {
    PackageManager pm = context.getPackageManager();
    List<PackageInfo> packageInfoList = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
    if (packageInfoList != null) {
        for (PackageInfo packageInfo : packageInfoList) {
            String packageName = packageInfo.packageName;
            if (packageName != null && packageName.equals(uri)) {
                return true;
            }
        }
    }
    return false;
}
Egemen Hamutçu
źródło
Powyższy kod w kotlin `` prywatna zabawa isAppInstalled (context: Context, uri: String): Boolean {val packageInfoList = context.packageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES) return packageInfoList.asSequence (). Filter {it? .PackageName = = uri} .any ()} ``
Kishan B
3

Czystsze rozwiązanie (bez try-catch) niż akceptowana odpowiedź (oparta na bibliotece AndroidRate ):

public static boolean isPackageExists(@NonNull final Context context, @NonNull final String targetPackage) {
    List<ApplicationInfo> packages = context.getPackageManager().getInstalledApplications(0);
    for (ApplicationInfo packageInfo : packages) {
        if (targetPackage.equals(packageInfo.packageName)) {
            return true;
        }
    }
    return false;
}
Alexander Savin
źródło
2

Sprawdź, czy aplikacja jest zainstalowana lub nie w systemie Android za pomocą kotlin.

Tworzenie rozszerzenia kotlin.

fun PackageManager.isAppInstalled(packageName: String): Boolean = try {
        getApplicationInfo(packageName, PackageManager.GET_META_DATA)
        true
    } catch (e: Exception) {
        false
    }

Teraz możesz sprawdzić, czy aplikacja jest zainstalowana, czy nie

if (packageManager.isAppInstalled("AppPackageName")) {
    // App is installed
}else{
    // App is not installed
}
Neeraj Dhameliya
źródło
1

Spróbuj tego

Ten kod służy do sprawdzania, czy aplikacja z nazwą pakietu jest zainstalowana lub nie, jeśli nie, otworzy link do sklepu playstore Twojej aplikacji, w przeciwnym razie zainstalowana aplikacja

String your_apppackagename="com.app.testing";
    PackageManager packageManager = getPackageManager();
    ApplicationInfo applicationInfo = null;
    try {
        applicationInfo = packageManager.getApplicationInfo(your_apppackagename, 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    if (applicationInfo == null) {
        // not installed it will open your app directly on playstore
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + your_apppackagename)));
    } else {
        // Installed
        Intent LaunchIntent = packageManager.getLaunchIntentForPackage(your_apppackagename);
        startActivity( LaunchIntent );
    }
Sunil
źródło
1

Prostsza implementacja za pomocą Kotlina

fun PackageManager.isAppInstalled(packageName: String): Boolean =
        getInstalledApplications(PackageManager.GET_META_DATA)
                .firstOrNull { it.packageName == packageName } != null

I nazwij to tak (szukając aplikacji Spotify):

packageManager.isAppInstalled("com.spotify.music")
Víctor Albertos
źródło
0

@Egemen Hamutçu s odpowiedź w kotlin B-)

    private fun isAppInstalled(context: Context, uri: String): Boolean {
        val packageInfoList = context.packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES)
        return packageInfoList.asSequence().filter { it?.packageName == uri }.any()
    }
Kishan B.
źródło
0

Wszystkie odpowiedzi tylko sprawdzają, czy dana aplikacja jest zainstalowana, czy nie. Ale, jak wszyscy wiemy, aplikacja może być zainstalowana, ale wyłączona przez użytkownika, bezużyteczna.

Dlatego to rozwiązanie sprawdza oba. tj. zainstalowane i włączone aplikacje .

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

Wywołaj metodę isPackageInstalled():

boolean isAppInstalled = isPackageInstalled("com.android.app" , this.getPackageManager());

Teraz użyj zmiennej boolowskiej isAppInstalledi rób, co chcesz.

if(isAppInstalled ) {
    /* do whatever you want */
}
Aashish
źródło
0

Fajna odpowiedź na inne problemy. Jeśli nie chcesz na przykład rozróżniać „com.myapp.debug” i „com.myapp.release”!

public static boolean isAppInstalled(final Context context, final String packageName) {
    final List<ApplicationInfo> appsInfo = context.getPackageManager().getInstalledApplications(0);
    for (final ApplicationInfo appInfo : appsInfo) {
        if (appInfo.packageName.contains(packageName)) return true;
    }
    return false;
}
Nicolas Duponchel
źródło
0

Tak ładniej z Kotlin suger:

  private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
David
źródło