Перевірте, чи встановлено додаток - Android


104

Я намагаюся встановити додатки з Google Play. Я можу зрозуміти, що після відкриття URL-адреси магазину Google Play він відкриває Google Play, і коли я натискаю кнопку "назад", активність відновлюється.

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

Коли я повернувся до активності, я спробував зателефонувати цьому, onResume()щоб перевірити, чи встановлено додаток, але я отримав помилку:

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

Помилка така:

E / AndroidRuntime (796): java.lang. .intent.action.VIEW dat = market: // деталі? id = com.package.name flg = 0x40080000}

Я здогадуюсь діяльність onPause(). Чи є кращий спосіб її реалізації? Я намагаюся перевірити, чи додаток закінчено встановлювати.



@SiddharthanAsokan Якщо я правильно розумію, чого ви намагаєтесь досягти тут, запустіть свою програму -> перейдіть до магазину відтворення -> натисніть встановити -> поверніться до власної активності -> запустіть щойно встановлену програму .. це правильно?
Варун,

Ніяк не поверніться до програми, яку я відкрив спочатку. Мені потрібно отримати інформацію про встановлений додаток за допомогою PackageManager. Пошук даних починається після того, як я встановив додаток із початкового, який використовувався, відкрив веб-адресу.
Сиддхартан Асокан

Відповіді:


299

Спробуйте це:

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

Він намагається отримати інформацію про пакет, ім'я якого ви передали. Якщо цього не NameNotFoundExceptionбуло, це означає, що жоден пакет із цим ім'ям не встановлений, тому ми повертаємось false.

Зверніть увагу, що ми передаємо PackageManagerзамість a Context, щоб метод був дещо гнучкішим і не порушував закон Деметри . Ви можете використовувати метод без доступу до Contextекземпляра, якщо у вас є PackageManagerекземпляр.

Використовуйте його так:

public void someMethod() {
    // ...

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

    // ...
}

1
Умовою є: мені потрібно перевірити цей процес встановлення, якщо це зроблено. Я натискаю на install і тим часом намагаюся перевірити наявність інсталяції в циклі. Код чудовий, але саме спосіб перевірити, чи встановлення завершено - це те, що я шукаю.
Сіддхартан Асокан

3
@SiddharthanAsokan Ви можете використовувати приймач широкомовної передачі для пакетних дій.
Варун

@Varun Я щойно відредагував код. Її більше не використовується ім'я пакету додатків. Просто веб-адреса додатка в магазині Google Play
Siddharthan Asokan

@Robin Kanters Будь ласка, перегляньте внесені
мною

Що ви зробили у своєму запитанні - це те саме, що і моя відповідь.
Робін Кантерс

32

Відповідь Робіна Кантера є правильною, але вона перевіряє наявність встановлених додатків незалежно від їх включеного або відключеного стану.

Ми всі знаємо, що програму можна встановити, але відключити користувачем, тому вона непридатна для використання.

Це перевіряє наявність встановлених ТА включених програм:

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

Ви можете помістити цей метод у клас типу like Utilsі викликати його скрізь, використовуючи:

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

5

Спробуйте це:

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

5

Швидше рішення:

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

getPackageGidsдешевше getPackageInfo, тому працює швидше.

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

Примітка. Це не працюватиме у деяких віртуальних просторах. Вони можуть порушувати API Android і завжди повертати масив, навіть якщо немає програми з цим іменем пакета.
У цьому випадку використовуйте getPackageInfo.


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

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

// метод перевірки встановленого пакету 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;
  }

0

Якщо ви хочете спробувати його без блоку спробу захоплення, можете скористатися наступним методом: Створіть намір і встановіть пакет програми, який ви хочете перевірити

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

і зателефонуйте наступному методу, щоб перевірити, чи встановлено додаток

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

0

Ті, хто шукає рішення Котліна, можуть використовувати цей метод,

Тут я поділився повним кодом, а також обробляв увімкнений статус. Перевірте, чи програма встановлена ​​в 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
        }
    }

-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
Це нескінченна петля.
Робін Кантерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.