Как проверить программно, если приложение установлено или нет в Android?

Мы программно установили приложения.

  • Если приложение уже установлено в устройстве, приложение открывается автоматически.
  • В противном случае установите конкретное приложение.

Направляй меня. Понятия не имею. Спасибо.

Ответ 1

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

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

}

Ответ 2

Несколько более чистое решение, чем принятый ответ (на основе этого вопроса):

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

Я решил поместить его в вспомогательный класс как статическую утилиту. Пример использования:

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

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

Ответ 3

Приведенный выше код не работал у меня. Работал следующий подход.

Создайте объект Intent с соответствующей информацией, а затем проверьте, может ли Intent быть вызванным или нет, используя следующую функцию:

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

Ответ 4

Если вы знаете имя пакета, то это работает без использования блока try-catch или итерации через кучу пакетов:

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

Ответ 5

Этот код проверяет, установлено ли приложение, но также проверяет его включение.

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

Ответ 6

Чистое решение (без try-catch), чем принятый ответ (на основе библиотеки AndroidRate):

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

Ответ 7

Я думаю, что использование шаблона try/catch не очень хорошо для производительности. Я советую использовать это:

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

Ответ 8

Попробуйте

Этот код используется для проверки погоды, в которой установлено ваше приложение с именем пакета или если нет, то он откроет ссылку на playstore вашего приложения, иначе установленное приложение

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

Ответ 9

@Эгемен Хамутсу ответит в Котлин 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()
    }

Ответ 10

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

Поэтому это решение проверяет оба. т.е. установлены и включены приложения.

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

Вызовите метод isPackageInstalled():

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

Теперь используйте логическую переменную isAppInstalled и сделайте все, что хотите.

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

Ответ 11

Крутой ответ на другие проблемы. Если вы не хотите дифференцировать "com.myapp.debug" и "com.myapp.release", например!

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

Ответ 12

Простая реализация с использованием Kotlin

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

И назовите его так (поиск приложения Spotify):

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