web-dev-qa-db-fra.com

Existe-t-il un moyen de modifier dynamiquement une icône d'application Android, comme le fait l'application Calendrier?

Je souhaite créer une application Android et je souhaite mettre à jour l'icône de l'application de manière dynamique et automatique, de la même manière que l'icône du calendrier se met à jour sur l'écran d'accueil d'un utilisateur.

Le calendrier change d'icône pour chaque jour affichant le jour du numéro du mois. Il existe également une application Alarm Clock qui modifie son icône en réglant l'heure actuelle, autrement dit en la changeant toutes les minutes.

Ce n'est pas un widget, mais une véritable icône d'application. Ensuite, il doit avoir un moyen de le faire. Comment puis-je le faire dans mon application?

14
Lennon Petrick

Quel que soit votre écran d'accueil, il comporte des points d'ancrage spéciaux pour votre application de calendrier et votre application de réveil. En général, les applications ne peuvent pas mettre à jour leurs icônes.

Qu'entendez-vous par crochets?

Par exemple, Samsung peut expédier une application de calendrier Samsung sur des appareils Samsung. L'écran d'accueil de Samsung sur ces mêmes appareils Samsung peut avoir des règles spéciales pour le rendu d'une icône pour l'application de calendrier de Samsung, règles qui consistent à afficher le jour du mois. C'est parce que Samsung a écrit l'écran d'accueil. Si vous installez un écran d'accueil tiers, il se peut qu'il ne fasse pas la même chose. Après tout, je peux écrire un écran d'accueil en une heure environ et je suis assez confiant pour ne rien avoir à faire avec l'application Calendrier de Samsung.

Rien n'empêche Samsung d'exposer une sorte d'API permettant aux développeurs de se connecter à l'écran d'accueil de Samsung et de l'informer de ce genre de choses. Je ne saurais dire si Samsung a l'intention que des tiers utilisent cette API ou qu'il s'agisse d'une personne qui détaille comment Samsung le fait pour ses propres applications.

(BTW, je cite Samsung ici comme exemple possible - je ne sais pas qu'ils ont réellement ce genre de fonctionnalité, et si oui sur quels appareils ils l'ont.)

Il me semble me rappeler que quelqu'un a un projet GitHub qui tente de boucler les API propriétaires de différents écrans d'accueil. IIRC, certaines fonctionnalités prises en charge comprenaient le remplacement de l'icône de l'application ou l'ajout d'un badge (par exemple, le nombre de messages non lus). Toutefois:

  • Seul un faible pourcentage de périphériques prend en charge ces API propriétaires

  • Les API non documentées et non prises en charge, découvertes via des applications de reverse engineering, sont sujettes à modification et peuvent se rompre de manière inattendue.

Je suis presque certain que rien dans le SDK Android ne prend en charge les icônes d'application dynamiques. La seule chose que je connaisse, que les gens ont essayée, utilise <activity-alias> pour avoir N "activités" différentes, pointant toutes vers la même implémentation, mais ayant des icônes différentes. En utilisant PackageManager et setComponentEnabledSetting(), l'application désactive l'ancien alias du lanceur et en active un autre, dans l'espoir que les écrans d'accueil le détectent et affichent la nouvelle icône. Quelques-uns. D'autres ne découvriraient le changement que lors d'un redémarrage.

Pour inverser le problème, je peux écrire un écran d'accueil. Je souhaite peut-être proposer aux applications un moyen de changer d'icônes à la volée, même s'il n'existe aucune norme. Peut-être que non. Je n’ai peut-être pas du tout l’intention d’utiliser des icônes, mon écran d’accueil étant optimisé pour les malvoyants, il utilise donc la saisie textuelle et la saisie de clé matérielle. C'est la mise en œuvre de mon écran d'accueil et je peux faire ce que je veux.

18
CommonsWare

En effet, même dans le tiroir d'applications sous Android O, l'icône de l'application Horloge indique l'heure actuelle et l'icône de l'application Calendrier, le jour du mois en cours.

Cet article explique :

Chris Lacy, le développeur derrière le célèbre Action Launcher, a découvert quelque chose dans le fichier APK de l'application Clock disponible sous Android O: le fichier manifest.xml mentionne les heures, les minutes et les secondes sous forme de couches avec des valeurs par défaut a des images séparées pour le fond et les différents éléments.

Cela le conduit logiquement à déduire que, à partir d'Android O, l'icône de l'application Clock s'anime pour afficher l'heure actuelle. Cela se produira à la fois lorsque l’horloge est placée en tant que raccourci sur l’écran d’accueil et lorsqu’elle se trouve dans le tiroir de l’application.

Il semble que le programme de lancement de pixels sélectionne différentes ressources de calque d'image d'icône en fonction de l'heure et de la date.

2
Jerry101

J'ai la même question mais la réponse fournie ici ne répond pas.
J'ai Google Pixel 2 avec Android Android 8.1 brut et deux applications qui changent avec le temps: Calendrier et Horloge . Les aiguilles de l’horloge de Horloge app affichent l’heure actuelle et le numéro sur l’icône Calendrier / correspond à la date du mois de aujourd'hui.
Donc, étant donné que c'est un lanceur par défaut, il y a probablement une API pour faire la même chose.

Par exemple, l'application planétaire peut refléter les positions des planètes sur l'icône. Ou un nettoyeur de mémoire qui affiche le pourcentage de mémoire utilisée ...

2
oleg.semen

Le lanceur gère le calendrier dynamique en accédant à une icône pour chaque jour à partir de l'application de calendrier. Par exemple, avec Google Agenda, un développeur Launcher peut effectuer les opérations suivantes:

Resources res = activity.getPackageManager()
                            .getResourcesForApplication("com.google.Android.calendar");
int resId = res.getIdentifier("logo_calendar_01_regular", "drawable"
                            , "com.google.Android.calendar");
Drawable icon = res.getDrawable(resId);

Cela permettrait d'accéder à l'icône du calendrier pour le jour 1 du mois. Pour accéder à un autre jour, "logo_calendar_01_regular" serait modifié pour le jour en cours. Par exemple, le jour 7 serait "logo_calendar_07_regular". De plus, Google agenda a deux styles, "logo_calendar_01_regular" et "logo_calendar_01_round".

Les thèmes d'icônes contiennent également des icônes distinctes pour chaque date.

1
Michael Kern