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


147

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

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

Веди меня. Я понятия не имею. Спасибо.


Ответы:


317

Попробуйте с этим:

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

}

1
@Sathish: Я надеюсь, что это может помочь вам
Эрроу

1
Без сомнения, ваш пост действительно полезен, но я получаю исключение «java.lang.RuntimeException: ошибка добавления окна» и «E / AndroidRuntime (7554): вызвано: android.os.TransactionTooLargeException 05-14 11: 37: 25.305 : E / AndroidRuntime (7554): на android.os.BinderProxy.transact (собственный метод) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): на android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession .java: 516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): at android.view.ViewRootImpl.setView (ViewRootImpl.java:494) "
DJhon

2
@BlueGreen: Привет, надеюсь, эта ссылка поможет вам, stackoverflow.com/questions/11451393/… , если вы используете Dialog Class, пожалуйста, проверьте его. :)
Эрроу

1
@ Эрроу .. Предположим, я проверяю, установлен ли мой .apk или нет? во время установки ... Я получаю такое же исключение при проверке моего пакета com.test.installedornot.Мой размер .apk больше 9 МБ, то в таком случае, как я буду управлять этим исключением?
DJhon

@BlueGreen: приведенный выше код будет проверять только установленное приложение, в момент установки это не будет работать. В вашем случае используйте Broadcast receive, чтобы получить уведомление после того, как этот apk установлен.
Эрроу

65

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

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 Store, если оно отсутствует, хотя необходимо соблюдать осторожность на устройствах, на которых нет Play Store.


это требует каких-либо определенных разрешений Android для работы?
Bootstrapper

@Bootstrapper: Нет, для этого не требуется никаких специальных разрешений.
Джоник

Спасибо (рабочее решение)
Навид Ахмад

26

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

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

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

5
Это лучше, потому что не требует использования исключений для управления потоком!
QED

2
@QED ужасает количество людей, использующих исключения как ifзаявления! Это, безусловно, правильный ответ
ILikeTacos

1
какое содержание намерения? строка с packageName не работает
Энрике де Соуза

3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
Доминик К

Если приложение было отключено, это должно быть неправильно.
Хьюго

15

Если вы знаете имя пакета, то это работает без использования блока 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();
}

1
return !list.isEmpty();было бы более дружественным к стилю Java
Headsvk

7

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

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

Это название пакета приложения. Например, «com.example.apps.myapp». Я отредактировал свой ответ, чтобы показать packageName вместо uri.
youravgjoe

3

Я думаю, что использование шаблона 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;
}

Приведенный выше код в kotlin `` `private fun isAppInstalled (context: Context, uri: String): Boolean {val packageInfoList = context.packageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES) возвращает packageInfoList.asSequence (). Filter {it? .PackageName = = uri} .any ()} `` `
Кишан Б

3

Более чистое решение (без 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;
}

2

Проверьте приложение установлено или нет в Android с помощью kotlin.

Создание расширения kotlin.

fun PackageManager.isAppInstalled(packageName: String): Boolean = try {
        getApplicationInfo(packageName, PackageManager.GET_META_DATA)
        true
    } catch (e: Exception) {
        false
    }

Теперь можно проверить, установлено приложение или нет

if (packageManager.isAppInstalled("AppPackageName")) {
    // App is installed
}else{
    // App is not installed
}

1

Попробуй это

Этот код используется для проверки, установлено ли ваше приложение с именем пакета или нет, если нет, то откроется ссылка 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 );
    }

1

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

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

И назовите это так (ищите приложение Spotify):

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

0

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

0

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

Таким образом, это решение проверяет оба. т.е. установленные приложения с поддержкой AND .

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 */
}

0

Классный ответ на другие проблемы. Если вы не хотите различать, например, «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;
}

0

Так приятнее с котлинским шугером

  private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.