Android'de bir uygulama yüklü olup olmadığını programlı olarak nasıl kontrol edebilirim?


147

Uygulamaları programlı olarak yükledik.

  1. Uygulama cihaza zaten yüklüyse, uygulama otomatik olarak açılır.
  2. Aksi takdirde ilgili uygulamayı yükleyin.

Beni yönlendir. Hiç bir fikrim yok. Teşekkürler.


Yanıtlar:


317

Şunu deneyin:

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;
    }

}

1
@Sathish: Umarım sizin için yararlı olabilir
Aerrow

1
Şüphesiz gönderiniz gerçekten yararlı, ancak bir istisna alıyorum "java.lang.RuntimeException: Pencere ekleme başarısız oldu" ve "E / AndroidRuntime (7554): Neden: android.os.TransactionTooLargeException 05-14 11: 37: 25.305 : E / AndroidRuntime (7554): android.os.'da.BinderProxy.transact (Yerel Yöntem) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): android.view.IWindowSession'da $ Stub $ Proxy.add (IWindowSession .java: 516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): android.view.ViewRootImpl.setView (ViewRootImpl.java:494) "
DJhon

2
@MaviGreen: Merhaba, umarım bu bağlantı size yardımcı olabilir, stackoverflow.com/questions/11451393/… , aksi takdirde Dialog Sınıfı kullanıyorsanız lütfen kontrol edin. :)
Aerrow

1
@Aerrow .. Varsayalım .apk yüklü mü yoksa ne? kurulum sırasında ... Benim paket com.test.installedornot.My .apk boyutu 9MB daha fazla olduğunu kontrol ederken aynı istisna alıyorum o zaman bu durumda nasıl bu istisnayı yönetecek?
DJhon

@MaviYeşil: Yukarıdaki kod sadece yüklü uygulamayı kontrol eder, kurulum sırasında bu çalışmaz. Durumunuz için, bu apk yüklendikten sonra bildirim almak için Yayın alıcısını kullanın.
Aerrow

65

Kabul edilen cevaptan biraz daha temiz bir çözüm ( bu soruya dayanarak ):

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

Statik bir yardımcı program olarak yardımcı bir sınıfa koymayı seçtim. Kullanım örneği:

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

Bu cevap , uygulama eksikse uygulamanın Play Store'dan nasıl alınacağını gösterir, ancak Play Store'a sahip olmayan cihazlara dikkat edilmelidir.


bunun çalışması için belirli bir Android izni gerekiyor mu?
Bootstrapper

@Bootstrapper: Hayır, herhangi bir özel izin gerektirmez.
Jonik

Teşekkürler (Çalışma Çözümü)
Naveed Ahmad

26

Yukarıdaki kod benim için çalışmadı. Aşağıdaki yaklaşım işe yaradı.

Uygun bilgileri içeren bir Intent nesnesi oluşturun ve ardından Intent'in aşağıdaki işlevi kullanarak çağrılabilir olup olmadığını kontrol edin:

private boolean isCallable(Intent intent) {  
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,   
        PackageManager.MATCH_DEFAULT_ONLY);  
        return list.size() > 0;  
}

5
Bu daha iyidir çünkü akış kontrolü için istisnalar kullanılmasını gerektirmez!
QED

2
@QED, İstisnalar'ı ifade olarak kullananların sayısını dehşete düşürüyor if! Bu kesinlikle doğru cevap
ILikeTacos

1
Niyetin içeriği nedir? paketi ile Dize çalışmıyor
Henrique de Sousa

3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
Dominic K

Uygulama devre dışı bırakılmışsa, yanlış olmalıdır.
Hugo

15

Paket adını biliyorsanız, bu bir try-catch bloğu kullanmadan veya bir grup paket üzerinden yineleme yapmadan çalışır:

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();
}

1
return !list.isEmpty();daha fazla java tarzı dostu olurdu
headsvk

7

Bu kod, uygulamanın yüklendiğinden emin olmakla birlikte etkinleştirildiğinden emin olur.

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;
    }
}

Uygulamanın paket adı. Örneğin, "com.example.apps.myapp". Cevabımı uri yerine packageName'i göstermek için düzenledim.
youravgjoe

3

Deneme / yakalama desenini kullanmak performans için çok iyi değil. Bunu kullanmanızı tavsiye ederim:

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;
}

Yukarıdaki kodlin `` `private fun isAppInstalled (context: Context, uri: String): Boolean {val packageInfoList = context.packageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES) packageInfoList.asSequence () öğesini döndürür. = uri}. any ()} ``
Kishan B

3

Kabul edilen yanıttan daha temiz bir çözüm (try-catch olmadan) ( AndroidRate Library'ye dayanarak ):

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;
}

2

Check App kotlin kullanarak Android yüklü veya yüklü değil.

Kotlin uzantısı oluşturma.

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

Şimdi, uygulamanın yüklenip yüklenmediğini kontrol edebilir

if (packageManager.isAppInstalled("AppPackageName")) {
    // App is installed
}else{
    // App is not installed
}

1

Bunu dene

Bu kod, paket adıyla uygulamanızın hava durumunu kontrol etmek için kullanılır veya değilse, uygulamanızın playstore bağlantısını açar, aksi takdirde yüklü uygulamanız

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 );
    }

1

Kotlin kullanarak daha basit bir uygulama

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

Ve şöyle deyin (Spotify uygulaması arıyor):

packageManager.isAppInstalled("com.spotify.music")

0

@Egemen Hamutçu'nun kotlin'deki cevabı 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()
    }

0

Tüm cevaplar sadece belirli uygulamanın yüklü olup olmadığını kontrol eder. Ancak, hepimizin bildiği gibi, bir uygulama kullanıcı tarafından yüklenebilir ancak devre dışı bırakılabilir, kullanılamaz.

Bu nedenle, bu çözüm her ikisini de kontrol eder. ör. yüklü VE etkin uygulamalar .

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

Yöntemi çağırın isPackageInstalled():

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

Şimdi, boolean değişkenini kullanın ve isAppInstalledistediğinizi yapın.

if(isAppInstalled ) {
    /* do whatever you want */
}

0

Diğer sorunlara harika bir cevap. Örneğin "com.myapp.debug" ve "com.myapp.release" ifadelerini birbirinden ayırmak istemiyorsanız!

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;
}

0

Kotlin suger ile çok daha güzel:

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

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.