2011-05-24 10 views
14

Estoy tratando de cargar el logotipo asociado con la actividad actual y/o su aplicación principal a partir de la definición en el manifiesto. Esta técnica ya ha trabajado con éxito en cargar el título y el icono asociado con ambos, pero el logotipo está volviendo siempre null ó 0.Actividad de carga y/o logotipo de la aplicación mediante programación desde el manifiesto

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

<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 ser una instancia de la actividad se ha definido anteriormente, he intentado lo siguiente (resultados en línea anotado):

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 de uno o ambos de estos Targ ets?

edición: apoyo Logo requiere el nivel API 9. Los dispositivos que estoy probando en emuladores y dispositivos físicos de todo runing nivel API 10. Este código no se ejecutará en 3.0+.

+0

No puedo probarlo ahora, pero quizás tener un 'android: logo' en la actividad también es un problema? Es un atributo de aplicación, no de actividad. Intenta eliminar el segundo. – Aleadam

+0

@Aleadam Noté que no estaba definido en [la especificación] (http://developer.android.com/guide/topics/manifest/activity-element.html) pero existe el método para cargar el logotipo y tiene se ha utilizado en [ejemplos propios de Google] (http://code.google.com/p/styled-action-bar/source/browse/trunk/AndroidManifest.xml). Voy a probar. –

+0

el método es fin, estoy hablando del manifiesto. Voy a publicar algunos más a continuación (bue a las limitaciones de comentarios) – Aleadam

Respuesta

3

Según mis pruebas, su código funciona correctamente en un dispositivo Honeycomb, pero no en un Gingerbread o dispositivo inferior. Esto parece implicar que la funcionalidad android:logo, aunque 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 conserva el atributo de logotipo, pero sí lo hace un dispositivo de nivel 11. Eso significa que el problema no está en el código o en el AndroidManifest.xml, sino en la plataforma.

+0

Estaba preocupado de que esta fuera la causa. Después de hurgar anoche, ahora estoy de acuerdo en que sin duda es un problema con el sistema operativo. Es una lástima ya que habría habilitado una gran característica en mi biblioteca. –

+2

Para su información, esto * se puede hacer si usa un analizador de extracción para ir directamente al manifiesto. https://github.com/JakeWharton/ActionBarSherlock/blob/c1c187739a1b69340c325577f2f02c8a60dcd717/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java#L267-348 –

1

Si se echa un vistazo al código en android.app.ContextImpl.ApplicationPackageManager (here), se encuentra que el tiempo se 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 ahí que usted puede utilizar para seguir lo que está pasando a través de adb (es decir, Failure retrieving resources for ...)

0

En primer lugar es necesario encontrar todas las aplicaciones que están instaladas. Para este fin nos los siguientes métodos de gestor de paquetes,

public abstract List<PackageInfo> getInstalledPackages (int flags) 

more info here

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

public abstract List<ApplicationInfo> getInstalledApplications (int flags) 

more info here

Ahora después de recibir la lista, iterar usando el siguiente método.

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

more info here

Cada iteración le dará el dibujable respectiva del paquete consultado. aquí Identificación res es el identificador del icono ..

R.drawable.icon 
0

@Jake Wharton, que está tratando de recuperar algo que no existe. A diferencia de applications, activities no tiene 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.

+0

Me conformaría con el logotipo de la aplicación, excepto que no puedo obtener su ID de recurso o dibujable tampoco. Como menciono en un comentario sobre la pregunta, sé que el esquema manifiesto no incluye un atributo 'logo', sino [los propios ejemplos de Google] (http://code.google.com/p/styled-action-bar/source /browse/trunk/AndroidManifest.xml#29) úsalo y funciona perfectamente bien en Android 3.0+. –

Cuestiones relacionadas