Программное определение того, установлено ли приложение на Android

Я зарегистрировал схему URL для своего приложения для Android (скажем, myapp://host).

В другом моем приложении я могу запустить это приложение с помощью Intent, но как проверить, установлено ли первое приложение, не запуская его?

в iOS это так же просто, как

[[UIApplication sharedApplication] canOpenUrl:@"myapp://"];

есть ли аналог в андроиде? (Простой способ)

Я хотел бы проверить, используя схему URL. Я знаю, как проверить, используя имя пакета, но я не знаю, как получить схему URL-адреса из PackageInfo... (более сложный способ)

    PackageManager pm = m_cContext.getPackageManager();
    boolean installed = false;
    try {
        @SuppressWarnings("unused")
        PackageInfo pInfo = pm.getPackageInfo(szPackageName, PackageManager.GET_ACTIVITIES);
        installed = true;
    } 
    catch (PackageManager.NameNotFoundException e) {
        installed = false;
    }

Заранее спасибо!

Примечание. Это версия того же вопроса для Android для iOS: Программное определение того, установлено ли приложение на iPhone


person Zennichimaro    schedule 05.09.2012    source источник


Ответы (2)


Если вы знаете, как запустить приложение, создайте намерение, которое запускает ваше приложение, а затем вызовите queryIntentActivities.

 Intent intent = //your app launching intent goes here
 PackageManager packageManager = mContext.getPackageManager();
 List<ResolveInfo> resolvedActivities = packageManager.queryIntentActivities(intent,0);
 if(resolvedActivities.size() >0)
     \\present
person nandeesh    schedule 05.09.2012
comment
Как правило, это будет работать, однако может быть несколько действий, которые могут обрабатывать URL-адрес, поэтому лучше проверить имя пакета (ResolveInfo.activityInfo.packageName). Это еще больше осложняется некоторыми изменениями, которые вносят поставщики, чтобы избежать (как обычно, сомнительных) патентов на апплеты. Подробнее здесь: commonsware.com/blog/2012 /24/07/ - person Nikolay Elenkov; 05.09.2012

Я использую queryIntentActivities из класса PackageManager в статическом методе:

public static boolean canOpenIntent(Context context, Intent intent)
{
    boolean canOpenUrl = false;
    PackageManager    packageManager     = context.getPackageManager();
    List<ResolveInfo> resolvedActivities = packageManager.queryIntentActivities(intent, 0);
    if(resolvedActivities.size() > 0)
        canOpenUrl = true;
    return canOpenUrl;
}
person Vincent Ducastel    schedule 27.11.2014