Uygulamanın yüklü olup olmadığını kontrol edin - Android


105

Google Play'den uygulama yüklemeye çalışıyorum. Google Play Store URL'sini açtığımda bunun Google Play'i açtığını ve geri düğmesine bastığımda etkinliğin devam ettiğini anlayabiliyorum.

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

Aktiviteye geri döndüğümde onResume(), uygulamanın yüklenip yüklenmediğini kontrol etmek için bunu aramayı denedim , ancak bir hata alıyorum:

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

Hata aşağıdaki gibidir:

E / AndroidRuntime (796): java.lang.RuntimeException: ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity} aktivitesi başlatılamıyor: android.content.ActivityNotFoundException: Intent {act = android'i işleyecek Etkinlik bulunamadı .intent.action.VIEW dat = market: // ayrıntılar? id = com.package.name flg = 0x40080000}

Sanırım etkinlik öyle onPause(). Bunu uygulamanın daha iyi bir yolu var mı? Uygulamanın yüklemeyi bitirip bitirmediğini kontrol etmeye çalışıyorum.



@SiddharthanAsokan Doğru anladıysam, burada başarmaya çalıştığınız şey şu: uygulamanızı başlatın -> oyun mağazasına gidin -> kur'a tıklayın -> kendi etkinliğinize geri dönün -> yeni yüklenen uygulamayı başlatın .. doğru mu?
Varun

Hayır, başlangıçta açtığım uygulamaya geri dönün. PackageManager'ı kullanarak yüklü uygulama hakkında biraz bilgi almam gerekiyor. Bu bilgi alma, uygulamayı web url'sini açan kullanılan ilk uygulamadan yükledikten sonra başlar.
Siddharthan Asokan

Yanıtlar:


306

Bunu dene:

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

Adını aktardığınız paket hakkında bilgi almaya çalışır. Başarısız olursa, eğer bir NameNotFoundExceptionatılırsa, bu isimde hiçbir paketin kurulu olmadığı anlamına gelir, bu yüzden geri döneriz false.

Yöntemin biraz daha esnek bir şekilde kullanılabilir olması ve Demeter yasasını ihlal etmemesi için a PackageManageryerine a geçtiğimize Contextdikkat edin . Bir örneğiniz olduğu sürece , yöntemi bir örneğe erişim olmadan kullanabilirsiniz .ContextPackageManager

Bunu şu şekilde kullanın:

public void someMethod() {
    // ...

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

    // ...
}

1
Koşul şudur: Bitmişse bu yükleme işlemini kontrol etmem gerekir. Kur'a tıklıyorum ve bu arada bir döngüde kurulumu kontrol etmeye çalışıyorum. Kod gayet iyi, ancak kurulumun tamamlanıp tamamlanmadığını kontrol etme yöntemi aradığım şey.
Siddharthan Asokan

3
@SiddharthanAsokan package_added işlemi için bir yayın alıcısı kullanabilirsiniz.
Varun

@Varun Kodu az önce düzenledim. Artık kullanmadığınız uygulama paketi adı yok. Uygulamanın Google Play Store'daki web url'si
Siddharthan Asokan

@Robin Kanters Lütfen yaptığım değişiklikleri gözden
geçirin

Sorunuzda yaptığınız şey cevabımla aynı.
Robin Kanters

35

Robin Kanters'ın cevabı doğru, ancak etkin veya devre dışı durumlarına bakılmaksızın yüklü uygulamaları kontrol ediyor.

Hepimiz bir uygulamanın yüklenebileceğini ancak kullanıcı tarafından devre dışı bırakılabileceğini, dolayısıyla kullanılamayacağını biliyoruz.

Bu, yüklü VE etkin uygulamaları kontrol eder :

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

Bu yöntemi aşağıdaki gibi bir sınıfa koyabilir Utilsve şunu kullanarak her yerde çağırabilirsiniz:

boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())

7

Daha hızlı çözüm:

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

getPackageGidsdaha ucuzdur getPackageInfo, bu nedenle daha hızlı çalışır.

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

Not: Bu, bazı sanal alanlarda çalışmayacaktır. Android API'yi ihlal edebilir ve bu paket adına sahip bir uygulama olmasa bile her zaman bir dizi döndürebilirler.
Bu durumda kullanın getPackageInfo.


5

Bunu dene:

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

2

Android 11'den (API seviyesi 30) beri, kullanıcı tarafından yüklenen uygulamaların çoğu varsayılan olarak görünmez. Bildiriminizde, aşağıdaki gibi hangi uygulamalar hakkında bilgi alacağınızı statik olarak beyan etmelisiniz:

<manifest>
    <queries>
        <!-- Explicit apps you know in advance about: -->
        <package android:name="com.example.this.app"/>
        <package android:name="com.example.this.other.app"/>
    </queries>
    
    ...
</manifest>

Ardından, @RobinKanters'ın cevabı çalışır:

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

// ...
// This will return true on Android 11 if the app is installed,
// since we declared it above in the manifest.
isPackageInstalled("com.example.this.app", pm); 
// This will return false on Android 11 even if the app is installed:
isPackageInstalled("another.random.app", pm); 

Buradan daha fazla bilgi edinin:


0

Try catch bloğu olmadan denemek istiyorsanız, aşağıdaki yöntemi kullanabilirsiniz, Bir amaç oluşturun ve doğrulamak istediğiniz uygulamanın paketini ayarlayın.

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

ve uygulamanın yüklenip yüklenmediğini kontrol etmek için aşağıdaki yöntemi çağırın

fun isInstalled(intent:Intent) :Boolean{
    val list = context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return list.isNotEmpty()
}


0

Bunu Kotlin'de kullanabilirsiniz extentions.kt

fun Context.isPackageInstalled(packageName: String): Boolean {
    return try {
        packageManager.getPackageInfo(packageName, 0)
        true
    } catch (e: PackageManager.NameNotFoundException) {
        false
    }
}

Kullanım

context.isPackageInstalled("com.somepackage.name")

-1
    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.");}

Bu kabul edilen cevapla aynı
user13044086

-1
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

// kurulu paketi kontrol etme yöntemi true / false

  public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    boolean found = true;
    try {
      packageManager.getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
      found = false;
    }

    return found;
  }

Bu kabul edilen cevapla aynı
user13044086

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

8
Bu sonsuz bir döngüdür.
Robin Kanters
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.