Cargar actividad y / o el logotipo de la aplicación mediante programación de Manifest

Estoy intentando cargar el logotipo asociado con la actividad actual y / o su aplicación principal desde la definición en el manifiesto. Esta técnica ya ha funcionado correctamente al cargar el título y el icono asociados a ambos, pero el logotipo siempre devuelve null o 0.

Aquí está la información relevante del manifiesto con el que estoy trabajando:

 <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"> 

Con activity siendo una instancia de la actividad definida anteriormente, he intentado lo siguiente (resultados anotados en línea):

 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; 

¿Alguien sabe cómo cargar correctamente el logotipo para uno o ambos de estos objetivos?

Editar : El soporte de logotipo requiere el nivel de API 9. Los dispositivos en los que estoy probando son emuladores y dispositivos físicos todos con nivel API 10. Este código nunca se ejecutará en 3.0+.

De mis pruebas, su código funciona correctamente en un dispositivo Honeycomb, pero no en un Gingerbread o dispositivo por debajo. Esto parece implicar que la funcionalidad del android:logo aunque esté presente en el Nivel 8 de API, no se implementa correctamente en la plataforma subyacente. Es decir, la misma aplicación apk en un dispositivo de nivel 8-10 no está conservando el atributo de logotipo, pero sí un dispositivo de nivel 11. Eso significa que el problema no es con el código o el AndroidManifest.xml, sino con la plataforma.

Si echa un vistazo al código en android.app.ContextImpl.ApplicationPackageManager ( aquí ), encontrará que finalmente utiliza el método

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

(Líneas 2131 a 2173 en 2.3).

Hay varias llamadas Log.w allí que puede utilizar para seguir lo que está pasando a través de adb (es decir, la Failure retrieving resources for …)

Primero necesitas encontrar todas las aplicaciones que están instaladas. Para ello usamos los siguientes métodos del gestor de paquetes,

 public abstract List<PackageInfo> getInstalledPackages (int flags) 

Más información aquí

También puede utilizar el siguiente método para obtener información sobre los paquetes instalados.

 public abstract List<ApplicationInfo> getInstalledApplications (int flags) 

Más información aquí

Ahora, después de obtener la lista, iterarla utilizando el siguiente método.

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

Más información aquí

Cada iteración le dará el respectivo dibujable del paquete consultado. Aquí res id es el id del icono ..

 R.drawable.icon 

@ Jake Wharton, que está tratando de recuperar algo que no existe. A diferencia de las aplicaciones , las actividades no tienen un atributo de logotipo separado (el logotipo definido en la aplicación se convierte en el atributo predeterminado para todas las actividades). Es por eso que no puede recuperar uno de una actividad.

  • Número de construcción iónico equivocado en el archivo config.xml
  • Subido APK a Play Store, tiene 0 dispositivos compatibles, pero no hay error
  • Actividad infantil en Android
  • Permitir permiso para crear y administrar llamadas telefónicas y READ_PHONE_STATE
  • El directorio de datos no tiene permiso de lectura / escritura en Android
  • no manifiesto jar no está firmado. (las firmas faltan o no se pueden analizar)
  • No se puede resolver el símbolo 'OnMapReadyCallback' Problema
  • AutoStart La aplicación no funciona correctamente
  • Android: theme = "@ android: style / Theme.NoTitleBar.Fullscreen" funciona en nivel de aplicación pero no en el nivel de actividad. ¿Cualquier pista?
  • Publicación a granel de aplicaciones de Android
  • Clonación de fuentes de Android a un servidor de repositorio local
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.