web-dev-qa-db-fra.com

Comment afficher le nombre de notifications dans l'icône du lanceur d'application

samsung Galaxy Note 2 Android version 4.1.2

Je sais que cette question a déjà été posée et que la réponse n'était pas possible

Comment afficher le compteur de ballons sur l'icône du lanceur d'applications sur Android

Néanmoins, hier, j'ai mis à jour l'application facebook et elle a commencé à afficher un compteur de messages privés non lus. Comment se fait-il que je puisse et je ne peux pas utiliser l'application facebook pour mon application?

facebook icon

enter image description here

samsung Galaxy Note 2 Android version 4.1.2

180
Waqleh

Android ("Vanilla" Android sans lanceurs personnalisés ni interfaces tactiles) n'autorise pas la modification de l'icône de l'application, car celle-ci est scellée. dans le .apk étroitement une fois le programme compilé. Il n'y a aucun moyen de le changer en un "dessinable" par programme à l'aide d'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 ceci http://developer.Android.com/guide/topics/ appwidgets/index.html . Regardez aussi ici: https://github.com/jgilfelt/Android-viewbadger . Cela peut vous aider.

En ce qui concerne les numéros de badge. Comme je l'ai déjà dit, il n'y a pas de moyen standard pour le faire. Mais nous savons tous que Android est un système d'exploitation ouvert et que nous pouvons faire tout ce que nous voulons avec ce dernier. Le seul moyen d'ajouter un numéro de badge est donc d'utiliser des applications tierces ou des lanceurs personnalisés. , ou interfaces tactiles frontales: interface Samsung TouchWiz ou Sony Xperia. D'autres réponses utilisent ces fonctionnalités et vous pouvez les rechercher 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 un mauvais entraine toi. Le badge de notification d'icône d'application est un modèle iOS et il ne doit en aucun cas être utilisé dans les applications Android. Dans Andrioid, il existe une notification dans la barre d’état à ces fins: http://developer.Android.com/guide/topics/ui/notifiers/notifications.html Donc, si Facebook ou une autre personne l’utilise - ce n'est pas un modèle ou une tendance commune que nous devrions considérer. Mais si vous insistez quand même et que vous ne voulez pas utiliser les widgets de l'écran d'accueil, regardez ici, s'il vous plaît:

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

Comme vous le voyez, ce n’est pas une application Facebook, c’est TouchWiz. Dans Vanilla Android, cela peut être réalisé avec Nova Launcher 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 d’un lanceur tiers ou d’une interface tactile (wrapper frontal). Peut-être que Google ajoutera cette fonctionnalité à l'API Android standard.

114
Oleksandr Karaberov

Cela fonctionne dans le lanceur samsung touchwiz

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

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

Il dispose même d'un moyen d'afficher le nombre de badges dans le bureau Pure Android.

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

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

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

76
AlexGuti

J'ai compris comment cela est fait pour les appareils Sony.

J'ai blogué à ce sujet ici . J'ai également posté une question séparée SO à ce sujet ici .


Les appareils Sony utilisent une classe nommée BadgeReciever.

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

  2. Diffusez un Intent vers le 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. Terminé. Une fois cette Intent diffusée, le lanceur devrait afficher un badge sur l’icône de votre application.

  4. Pour supprimer à nouveau le badge, envoyez simplement une nouvelle diffusion, cette fois avec SHOW_MESSAGE défini sur 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 pour garder la réponse courte, mais tout est disponible dans le blog. Peut-être une lecture intéressante pour quelqu'un.

12
Marcus

Ceci est un exemple et la meilleure façon d’afficher un badge sur l’icône du lanceur de notifications.

Ajouter cette classe dans votre application

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 notification claire par préférence et aussi avec le nombre de badges

 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" />
8
Jaydeep purohit