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:
- Fragment Compatability onActivityResult () No funciona
- Cómo resolver No se puede encontrar la actividad explícita en firebase AuthUi?
- ¿Agregar actividad automáticamente a Manifest?
- Reinicie la aplicación después de que Android la mate
- Establecer el nombre de la aplicación en la etiqueta de la aplicación no funciona
<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+.
- Más permisos en apk cargado que en archivo de manifiesto
- Apagar o reiniciar un dispositivo Android a través de código / programa?
- Cambiar el estilo del botón en toda la aplicación
- Accede a la clave larga de los metadatos desde AndroidManifeast.xml
- ¿Cómo agregar Actividad a manifest.xml de manera correcta?
- Aplicación de Android vs. Actividad
- Cómo decir AndroidManifest.xml de la aplicación take @string desde un paquete específico
- Android Market dice que mi aplicación "no está en el grupo de destino" o que "no se puede instalar en este dispositivo"
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.
- Archivo de clase para android.support.v4.widget.DrawerLayoutImpl no se encuentra en travis support-v4 21.0
- NetBeans y parada / interrupción en todas las excepciones?