adding notification badge on app icon in android

Vik2r picture Vik2r · Sep 30, 2013 · Viewed 15.7k times · Source

you may think that this is a duplicate question but i want answers to be more specific than any questions that are similar to this.

first it says that like facebook having notification badge with samsung device. How does Facebook add badge numbers on app icon in Android?. and it turns out to be the touchwiz launcher which may be the default launcher of samsung devices. when i tried to test my samsung device with nova launcher. it needs to install some third party software or Nova TestlaUnread.

Heres the fact. i thought the touchWiz is adding badge for all application, but when i try to test with my app to have some notification, it doesn't show any badge. as i found out that samsung TouchWiz only showing app to selected app as stated here: UI help for Notification on icon

The question is: is there any way to let know the touchWiz to add badge to my app-icon? That's for the samsung device,

with that previous arguments, it seems like the launcher of different vendors are the one responsible for the badges in app icon in android. Sony Experia uses Experia Home/Launcher as its default launcher. in my sony device, they had some badge in there sms or miss calls or facebook.

The question is: like the previous question, is there any way to let know experia home to add badge to my app icon?

because i was thinking maybe interacting with the launcher seems the solution of this "adding badge to app icon".

and there's this solution about this activity alias and changing the app icon from time to time which i think is rubbish. Is there a way to add a badge to an application icon in Android?

so i'm seeking solution on interacting with the launchers which is vendor specific.

'any solution will be appreciated even i would go deep with using native development in android'

Thanks ahead

Answer

Tadas Valaitis picture Tadas Valaitis · Sep 15, 2014

I use this class for Samsung and Sony devices (also available https://gist.github.com/Tadas44/cdae2f5995f21bf1c27f). Don't forget to add <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" /> to AndroidManifest.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;
    }
}