Проверить, установлено ли приложение - 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.RuntimeException: не удалось запустить действие ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity}: android.content.ActivityNotFoundException: не обнаружено действие для обработки намерения {act = android .intent.action.VIEW dat = market: // подробности? id = com.package.name flg = 0x40080000}

Думаю, активность есть onPause(). Есть ли лучший способ реализовать это? Я пытаюсь проверить, завершена ли установка приложения.



@SiddharthanAsokan Если я правильно понимаю, то, чего вы здесь пытаетесь достичь, запустите свое приложение -> перейдите в магазин воспроизведения -> нажмите «Установить» -> вернитесь к своей деятельности -> запустите только что установленное приложение .. это верно?
Варун

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

Ответы:


300

Попробуй это:

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

Он пытается получить информацию о пакете, имя которого вы передали. В противном случае, если NameNotFoundExceptionбыл сгенерирован a , это означает, что пакет с таким именем не установлен, поэтому мы возвращаемся false.

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

Используйте это так:

public void someMethod() {
    // ...

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

    // ...
}

1
Условие: мне нужно проверить этот процесс установки, если он завершен. Я нажимаю на кнопку «Установить» и тем временем пытаюсь проверить установку в цикле. Код в порядке, но я ищу способ проверить, завершена ли установка.
Сиддхартхан Асокан

3
@SiddharthanAsokan Вы можете использовать широковещательный приемник для действия package_added.
Варун

@Varun Я только что отредактировал код. Я больше не использую имя пакета приложения. Просто веб-адрес приложения в магазине Google Play
Сиддхартан Асокан,

@Robin Kanters Пожалуйста, ознакомьтесь с внесенными
мной

То, что вы сделали в своем вопросе, совпадает с моим.
Робин Кантерс,

33

Ответ Робина Кантерса правильный, но он проверяет наличие установленных приложений независимо от их включенного или отключенного состояния.

Все мы знаем, что приложение может быть установлено, но отключено пользователем, поэтому его нельзя использовать.

Это проверяет наличие установленных И включенных приложений:

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

Вы можете поместить этот метод в класс вроде 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

Примечание: это не будет работать в некоторых виртуальных пространствах. Они могут нарушать Android API и всегда возвращать массив, даже если нет приложения с таким именем пакета.
В этом случае используйте 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

Если вы хотите попробовать его без блока try catch, вы можете использовать следующий метод: создать намерение и установить пакет приложения, которое вы хотите проверить.

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

Те, кто ищет решение Kotlin, могут использовать этот метод,

Здесь я поделился полным кодом, а также обработал статус включения. Проверьте, установлено ли приложение в 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.