Загрузить активность и/или логотип приложения программно из манифеста

Я пытаюсь загрузить логотип, связанный с текущей деятельностью, и/или его родительское приложение из определения в манифесте. Этот метод уже успешно работал при загрузке заголовка и значка, связанного с обоими, но логотип всегда возвращает null или 0.

Вот соответствующая информация из манифеста, с которым я работаю:

<application
    android:icon="@drawable/ic_launcher"
    android:logo="@drawable/ad_logo"
    android:label="@string/app_name"
    android:hardwareAccelerated="true">

    <activity
        android:name=".MainActivity" 
        android:label="@string/app_name"
        android:logo="@drawable/ad_logo">

Если activity является экземпляром указанного выше действия, я попробовал следующее (результаты аннотированные inline):

PackageManager pm = activity.getPackageManager();
ComponentName cn = activity.getComponentName();
ApplicationInfo ai = activity.getApplicationInfo();

//ACTIVITY LABEL: Works
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).loadLabel(pm);

//APPLICATION LABEL: Works
ai.loadLabel(pm);
//APPLICATION LABEL: Works
pm.getApplicationLabel(ai);

//ACTIVITY ICON: Works
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).loadIcon(pm);
//ACTIVITTY ICON: Works
pm.getActivityIcon(cn);

//APPLICATION ICON: Works
pm.getApplicationIcon(ai);
//APPLICATION ICON: Works
ai.loadIcon(pm);

//ACTIVITY LOGO: Does not work
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).loadLogo(pm);
//ACTIVITY LOGO: Does not work
pm.getActivityInfo(cn, PackageManager.GET_ACTIVITIES).logo
//ACTIVITY LOGO: Does not work
pm.getActivityLogo(cn);

//APPLICATION LOGO: Does not work
pm.getApplicationLogo(ai);
//APPLICATION LOGO: Does not work
pm.getApplicationLogo(activity.getApplication().getPackageName());
//APPLICATION LOGO: Does not work
ai.loadLogo(pm);

//APPLICATION LOGO: Does not work
pm.getApplicationInfo(ai.packageName, 0).loadLogo(pm);
//APPLICATION LOGO: Does not work
ai.logo;

Кто-нибудь знает, как правильно загрузить логотип для обеих или обеих этих целей?

изменить: Поддержка логотипа требует уровня API 9. Устройства, на которых я тестирую, - это эмуляторы и физические устройства, на которых запущен API-уровень 10. Этот код никогда не будет выполнен в версии 3.0 +.

Ответ 1

Из моих тестов ваш код работает правильно на устройстве Honeycomb, но не на Gingerbread или ниже устройства. Это, по-видимому, означает, что функциональность android:logo, хотя и присутствует в уровне API 8, неправильно реализована на базовой платформе. То есть, одно и то же приложение apk на устройстве уровня 8-10 не сохраняет атрибут логотипа, а устройство уровня 11. Это означает, что проблема не в коде или AndroidManifest.xml, а на платформе.

Ответ 2

Если вы посмотрите на код в android.app.ContextImpl.ApplicationPackageManager (здесь), вы обнаружите, что в конечном итоге он использует метод

public Drawable getDrawable(String packageName,int resid,ApplicationInfo appInfo)

(строки с 2131 по 2173 в 2.3).

Существует несколько вызовов Log.w, которые вы можете использовать, чтобы следить за тем, что происходит через adb (т.е. Failure retrieving resources for...)

Ответ 3

Сначала вам нужно найти все приложения, которые установлены. Для этого мы предлагаем следующие методы из диспетчера пакетов,

public abstract List<PackageInfo> getInstalledPackages (int flags)

подробнее здесь

Вы также можете использовать следующий метод для получения информации об установленных пакетах.

public abstract List<ApplicationInfo> getInstalledApplications (int flags)

подробнее здесь

Теперь, получив список, повторите его, используя следующий метод.

public Drawable getDrawable(String packageName,int resid,ApplicationInfo appInfo)

подробнее здесь

Каждая итерация даст вам соответствующий доступный запрос пакета. здесь res id - это идентификатор значка.

R.drawable.icon

Ответ 4

@Джейк Уортон, вы пытаетесь найти то, чего не существует. В отличие от приложений, действия не имеют отдельного атрибута логотипа ( логотип, определенный в приложении, становится атрибутом по умолчанию для всех видов деятельности). Вот почему вы не можете извлечь из него действие.