Comment afficher le nombre de notifications dans l'icône du lanceur d'app [dupliquer]

cette question a déjà une réponse ici:

  • y a-t-il un moyen d'ajouter un badge à une icône D'application dans Android? 4 réponses

samsung galaxy note 2 version android 4.1.2

je sais que cette question a été posée avant et la réponse n'a pas été possible

comment afficher le compteur de ballons au-dessus de l'icône du lanceur d'application sur android

néanmoins hier j'ai mis à jour l'application facebook et il a commencé à montrer un compteur de messages non lus messages privés. Comment se fait-il que l'application facebook peut et je ne peux pas le faire pour mon application?

facebook icon

enter image description here

samsung galaxy note 2 la version android 4.1.2

169
demandé sur Waqleh 2013-07-10 11:58:50

5 réponses

Android ("vanilla" android sans lanceurs personnalisés et interfaces tactiles) ne permet pas changement de l'icône de l'application, parce qu'il est scellé dans le .apk étroitement une fois le programme est compilé. Il n'y a aucun moyen de le changer en un "drawable" programmatically utilisant des API standard. Vous pouvez atteindre votre objectif en utilisant un widget au lieu d'une icône. Les Widgets sont personnalisables. Veuillez lire ceci: http://www.cnet.com/8301-19736_1-10278814-251.html et ce http://developer.android.com/guide/topics/appwidgets/index.html . Regardez aussi ici: https://github.com/jgilfelt/android-viewbadger . Il peut vous aider.

Que pour les numéros de badge. Comme je l'ai déjà dit, il n'y a pas de méthode standard pour le faire. Mais nous savons tous que Android est un système d'exploitation ouvert et nous pouvons faire tout ce que nous voulons avec elle, de sorte que le seul moyen d'ajouter un numéro de badge - est d'utiliser environ 3-rd applications de parti ou lanceurs personnalisés, ou interfaces tactiles front-end: L'interface de Samsung TouchWiz ou Sony Xperia. D'autres réponses utilisent ces capacités et vous pouvez rechercher ceci sur stackoverflow, par exemple ici . Mais je vais répéter encore une fois: il y a Non API standard pour cela et je veux dire que c'est une mauvaise pratique. Le badge de notification d'icône de l'application est un modèle iOS et il ne doit pas être utilisé dans les applications Android de toute façon. Dans Andrioid il y a une barre d'état notifications à ces fins: http://developer.android.com/guide/topics/ui/notifiers/notifications.html Donc, si Facebook ou quelqu'un d'autre utilisent ceci - ce n'est pas un modèle ou une tendance commune que nous devrions considérer. Mais si vous insistez quand même et ne voulez pas utiliser les widgets d'écran d'accueil alors regardez ici, s'il vous plaît:

comment Facebook ajoute-t-il des numéros de badge sur l'icône de l'application Android?

comme vous ce N'est pas une application Facebook, C'est TouchWiz. Dans vanilla android cela peut être réalisé avec le lanceur Nova http://forums.androidcentral.com/android-applications/199709-how-guide-global-badge-notifications.html Donc, si vous voyez des badges d'icône quelque part, assurez-vous qu'il s'agit soit d'un 3-rd party launcher ou d'une interface tactile (frontend wrapper). Peut-être que Google ajoutera cette capacité à L'API Android standard.

112
répondu Oleksandr Karaberov 2017-05-23 12:34:40

Il fonctionne dans touchwiz de samsung lanceur

public static void setBadge(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);
}

public 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;
}
90
répondu ChangUZ 2013-11-28 09:55:43

ShortcutBadger est une bibliothèque qui ajoute une couche d'abstraction sur la marque de l'appareil et le lanceur actuel et offre un grand résultat. Fonctionne avec LG, Sony, Samsung, HTC et D'autres lanceurs personnalisés.

il a même une façon d'afficher le nombre de Badge dans les appareils Android pur bureau.

mettre à jour le nombre de badges dans l'icône de l'application est aussi facile que d'appeler:

int badgeCount = 1;
ShortcutBadger.applyCount(context, badgeCount);

il comprend une démonstration application qui vous permet de tester son comportement.

71
répondu AlexGuti 2016-08-24 12:03:35

j'ai trouvé comment faire pour les appareils de Sony.

j'ai blogué à ce sujet ici . J'ai aussi posté une question séparée sur ce ici .


Sony utilisation de dispositifs d'une classe nommée BadgeReciever .

  1. déclarez la permission com.sonyericsson.home.permission.BROADCAST_BADGE dans votre fichier manifeste:

  2. a diffusé un Intent au 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 doit 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);
    

j'ai exclu les détails sur la façon dont j'ai trouvé ceci à garder la réponse courte, mais tout est disponible sur le blog. Peut-être une lecture intéressante pour quelqu'un.

12
répondu Marcus 2017-05-23 12:34:40

ceci est un exemple et la meilleure façon de montrer le badge sur l'icône de notification de lanceur.

ajouter cette classe à la suite

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;
    }


}

= = > MyGcmListenerService.Java Utilisez la classe BadgeUtils lorsque la notification arrive.

public class MyGcmListenerService extends GcmListenerService { 

    private static final String TAG = "MyGcmListenerService"; 
    @Override
    public void onMessageReceived(String from, Bundle data) {

            String message = data.getString("Msg");
            String Type = data.getString("Type"); 
            Intent intent = new Intent(this, SplashActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                    PendingIntent.FLAG_ONE_SHOT);

            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

            NotificationCompat.BigTextStyle bigTextStyle= new NotificationCompat.BigTextStyle();

            bigTextStyle .setBigContentTitle(getString(R.string.app_name))
                    .bigText(message);
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                    .setSmallIcon(getNotificationIcon())
                    .setContentTitle(getString(R.string.app_name))
                    .setContentText(message)
                    .setStyle(bigTextStyle) 
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);

            int color = getResources().getColor(R.color.appColor);
            notificationBuilder.setColor(color);
            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);


            int unOpenCount=AppUtill.getPreferenceInt("NOTICOUNT",this);
            unOpenCount=unOpenCount+1;

            AppUtill.savePreferenceLong("NOTICOUNT",unOpenCount,this);  
            notificationManager.notify(unOpenCount /* ID of notification */, notificationBuilder.build()); 

// This is for bladge on home icon          
        BadgeUtils.setBadge(MyGcmListenerService.this,(int)unOpenCount);

    }


    private int getNotificationIcon() {
        boolean useWhiteIcon = (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP);
        return useWhiteIcon ? R.drawable.notification_small_icon : R.drawable.icon_launcher;
    }
}

et la notification claire de préférence et aussi avec le compte de badge

 public class SplashActivity extends AppCompatActivity { 
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_splash);

                    AppUtill.savePreferenceLong("NOTICOUNT",0,this);
                    BadgeUtils.clearBadge(this);
            }
    }
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />
7
répondu Jaydeep purohit 2016-12-30 11:25:38