Подтвердить что ты не робот

Проверьте, установлено ли приложение - Android

Я пытаюсь установить приложения из 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:     Активность не найдена для операции Intent {act = android.intent.action.VIEW dat = market://details? id = com.package.name flg = 0x40080000}

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

4b9b3361

Ответ 1

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

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

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

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

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

public void someMethod() {
    // ...

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

    // ...
}

Ответ 2

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

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

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

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

Ответ 3

Попробуйте следующее:

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

Ответ 4

Более быстрое решение:

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.

Ответ 5

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

Ответ 6

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

Ответ 7

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