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

Я пытаюсь загрузить логотип, связанный с текущей деятельностью и / или ее родительским приложением, из определения в манифесте. Этот метод уже успешно работал при загрузке заголовка и значка, связанного с обоими, но логотип всегда возвращает 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; 

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

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

Solutions Collecting From Web of "Загружать активность и / или логотип приложения программно из манифеста"

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

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

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

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

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

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

 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 

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