Comment ajouter un badge de notification / count à l'icône de l'application sur les appareils Xperia de Sony?

avec Xperia Home de Sony, certaines applications ont la possibilité d'afficher une bulle de comptage ou un badge sur l'icône de l'application. Facebook et facebook Messenger le font tous les deux, ainsi que l'application e-mail intégrée.

cela a été résolu pour le lanceur de Samsung , mais je n'ai pas trouvé de documentation sur la façon de le faire pour le lanceur de Sony.

Comment faire?

33
demandé sur Community 2013-11-26 16:13:52

4 réponses

après avoir vu la solution de Daniel Ochoa pour le lanceur de Samsung, qui utilise un BadgeProvider pour manipuler les badges, j'ai entrepris de faire la même chose pour la maison Xperia de Sony. Cette réponse est prise directement de mon blog .

Comment je me suis dit elle - Pour toute personne intéressée

je suis tombé sur AppXplore de Sony et l'ai utilisé pour vérifier les autorisations de L'application Facebook. Le Facebook app demande la permission suivante, qui est la clé pour afficher des badges sur les appareils de Sony:

com.sonyericsson.maison.autorisation.BROADCAST_BADGE

ensuite, j'ai regardé tous les fournisseurs de contenu disponibles mais je n'ai rien trouvé en rapport avec les badges d'icône d'application. J'ai lancé la commande dans cette réponse pour obtenir un fichier de dump système et j'ai cherché" badge " en utilisant le bloc-notes++. J'ai trouvé ceci:

com.sonyericsson.maison.action.UPDATE_BADGE: 41be9a90 com.sonyericsson.maison./BadgeService$BadgeReceiver filter 41be9858

donc, il est géré en utilisant un diffuseur sur Sony par opposition au fournisseur de contenu de Samsung. Donc, j'ai créé un faux diffuseur de mon propre chef, en écoutant pour l'action com.sonyericsson.maison.action.UPDATE_BADGE, et a trouvé les extras passés au service de badges de Sony. Pour ce, J'avais aussi besoin d'une permission, mais c'était facile à trouver dans le fichier dump:

com.sonyericsson.maison.autorisation.RECEIVE_BADGE

les extras envoyés par Facebook, l'application e-mail, etc, sont:

  • com.sonyericsson.maison.intention.supplémentaire.insigne.ACTIVITY_NAME - le nom de l'activité principale de votre application, android.intention.action.PRINCIPAL. C'est donc le lanceur sait quelle icône pour montrer le badge.
  • com.sonyericsson.maison.intention.supplémentaire.insigne.SHOW_MESSAGE - a booléen indiquant si nous voulons montrer le badge ou pas (ce que nous faisons!)
  • com.sonyericsson.maison.intention.supplémentaire.insigne.MESSAGE - une chaîne (pas un nombre entier - qui m'a pris un certain temps à réaliser...) avec le nombre montrer.
  • com.sonyericsson.maison.intention.supplémentaire.insigne.PACKAGE_NAME - le nom de votre dossier de demande.

Comment afficher des badges sur l'icône de lanceur de votre application sur les appareils Xperia de Sony

donc, il s'avère qu'il est très simple de montrer un badge sur votre icône d'application dans le lanceur. C'est beaucoup plus simple que pour le lanceur de Samsung. Voici un guide étape par étape (et il n'est pas long!)

  1. , Déclarent les com.sonyericsson.home.permission.BROADCAST_BADGE permission dans votre manifeste:

  2. "1519120920 de la" Diffusion Intent à la BadgeReceiver :

    Intent intent = new Intent();
    
    intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
    intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", "com.yourdomain.yourapp.MainActivity");
    intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
    intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "99");
    intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", "com.yourdomain.yourapp");
    
    sendBroadcast(intent);
    
  3. fait. Une fois que ce Intent est diffusé, le lanceur devrait afficher un badge sur l'icône de votre application.

  4. pour retirer à nouveau l'insigne, il suffit d'envoyer une nouvelle émission, cette fois avec SHOW_MESSAGE mis à false:

    intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
    

bon à savoir

le message est une chaîne de caractères!

depuis MESSAGE est un String , vous pouvez en fait ajouter des mots à l'insigne:

intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "Testing");

mais je ne ferais pas ça parce que ça a l'air bizarre.

Vous avez accès à toutes les applications!

la permission BROADCAST_BADGE ne vous donne pas seulement accédez à l'icône de votre propre application, mais à toutes. Par exemple, voici comment vous pouvez définir le badge de Facebook:

Intent intent = new Intent();
intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", "com.facebook.katana.LoginActivity");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "99");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", "com.facebook.katana");

sendBroadcast(intent);

j'espère que ce sera utile à quelqu'un! :)

45
répondu Marcus 2017-05-23 10:31:09

j'utilise cette classe pour les appareils Samsung, Sony et HTC (également disponible https://gist.github.com/Tadas44/cdae2f5995f21bf1c27f ). N'oubliez pas d'ajouter <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" /> à Androïdmanifest.xml

public class BadgeUtils {


    public static void setBadge(Context context, int count) {
        setBadgeSamsung(context, count);
        setBadgeSony(context, count);
    }

    public static void clearBadge(Context context) {
        setBadgeSamsung(context, 0);
        clearBadgeSony(context);
    }


    private static void setBadgeSamsung(Context context, int count) {
        String launcherClassName = getLauncherClassName(context);
        if (launcherClassName == null) {
            return;
        }
        Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
        intent.putExtra("badge_count", count);
        intent.putExtra("badge_count_package_name", context.getPackageName());
        intent.putExtra("badge_count_class_name", launcherClassName);
        context.sendBroadcast(intent);
    }

    private static void setBadgeSony(Context context, int count) {
        String launcherClassName = getLauncherClassName(context);
        if (launcherClassName == null) {
            return;
        }

        Intent intent = new Intent();
        intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(count));
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());

        context.sendBroadcast(intent);
    }


    private static void clearBadgeSony(Context context) {
        String launcherClassName = getLauncherClassName(context);
        if (launcherClassName == null) {
            return;
        }

        Intent intent = new Intent();
        intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(0));
        intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());

        context.sendBroadcast(intent);
    }

    private static String getLauncherClassName(Context context) {

        PackageManager pm = context.getPackageManager();

        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);

        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
        for (ResolveInfo resolveInfo : resolveInfos) {
            String pkgName = resolveInfo.activityInfo.applicationInfo.packageName;
            if (pkgName.equalsIgnoreCase(context.getPackageName())) {
                String className = resolveInfo.activityInfo.name;
                return className;
            }
        }
        return null;
    }
}
28
répondu Tadas Valaitis 2015-04-20 08:52:05

eh Bien, c'est assez difficile à faire. Le seul moyen que j'ai trouvé jusqu'à présent est de créer un widget qui traitera à la fois l'icône de l'application et le badge.

je vous conseille vivement de visiter cette page où vous apprendrez comment y parvenir: Android: est-il possible de mettre à jour un ImageView/ImageButton avec un numéro pour afficher le nombre de nouveaux messages?

0
répondu Manitoba 2017-05-23 12:17:53

je me rends compte que cette question est assez ancienne, mais pour des raisons historiques, L'API pour les applications tierces pour interagir avec L'API Xperia Home pour cette fonctionnalité particulière a été rendue publique l'année dernière:

Xperia Maison insigne de l'API désormais accessible au public

avec code d'échantillon ici:

sonyxperiadev / home-badge

Il ya aussi un tiers bibliothèque qui prend en charge la plupart des principaux fournisseurs de téléphones, y compris L'API Xperia Home:

leolin310148/ShortcutBadger

0
répondu Martin Lindström 2017-07-20 10:49:47