在安卓应用程序图标上添加通知徽章

5

你可能认为这是一个重复的问题,但我希望回答比任何类似问题更具体。

首先,它说像Facebook一样,在三星设备上有通知徽章。Facebook在Android应用程序图标上添加徽章数字的方法是什么? 结果是TouchWiz启动器,可能是三星设备的默认启动器。当我尝试使用Nova Launcher测试我的三星设备时,需要安装一些第三方软件或Nova TestlaUnread。

事实是,我认为TouchWiz会为所有应用程序添加徽章,但当我尝试使用我的应用程序进行一些通知测试时,它并没有显示任何徽章。正如我发现的那样,三星TouchWiz仅显示选定的应用程序,如此处所述:图标通知的UI帮助

问题是:是否有任何方法可以让TouchWiz知道将徽章添加到我的应用程序图标中? 针对三星设备。

根据先前的论点,不同供应商的启动器似乎是安卓应用图标徽章的责任方。Sony Experia 使用 Experia Home/Launcher 作为默认启动器。在我的 Sony 设备上,短信、未接来电或 Facebook 等应用中都有徽章。
问题是:和之前的问题一样,有没有办法让 Experia Home 添加徽章到我的应用程序图标上?
因为我想也许与启动器交互似乎是这个“添加应用图标徽章”的解决方法。
还有这个解决方案,关于使用活动别名和不断更换应用程序图标,我认为是垃圾。 Is there a way to add a badge to an application icon in Android? 所以我正在寻求特定于供应商的启动器交互解决方案。
“任何解决方案都将不胜感激,即使我会深入使用 Android 的本机开发。”
提前致谢。

是的,我已经在这里写了一个如何操作的指南:https://dev59.com/dmIj5IYBdhLWcg3wilvB#20136484 - Daniel Ochoa
可能是在Android中为应用程序图标添加徽章的方法?的重复问题。 - Shirish Herwade
2个回答

4

我在三星和索尼设备上使用这个类(还可以从https://gist.github.com/Tadas44/cdae2f5995f21bf1c27f获得)。不要忘记将<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />添加到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;
    }
}

1
在我的情况下,它对三星设备运行良好,但现在似乎只适用于三星和索尼设备。因此,我们需要更新这个答案,使其适用于其他制造商。 - Harpreet

0
除了Daniel Ochoa在Samsung设备上的解决方案(请参见OP评论)之外,我已经找到了如何在Sony设备上完成此操作。
我在这里写了一篇博客文章。我还在这里发布了一个单独的SO问题。

Sony设备使用名为BadgeReciever的类。

  1. 在您的清单文件中声明com.sonyericsson.home.permission.BROADCAST_BADGE权限:

  2. BadgeReceiver广播一个Intent

    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. 完成。一旦广播了这个Intent,启动器应该会在您的应用程序图标上显示一个徽章。

  4. 要再次删除徽章,只需发送一个新的广播,这次将SHOW_MESSAGE设置为false:

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

为了保持答案简短,我省略了如何发现这个问题的细节,但这些都可以在博客中找到。对于某些人来说,这可能是一篇有趣的阅读。


由于这个问题没有答案,而且你的声望也不高,我不会标记它(我已经收到了你的回答进行审核)。不过我建议你从那些链接中添加一些相关信息来补充问题。我已经给你的另一个问题点赞了,所以你可以回答它。 - OGHaza
感谢@OGHaza。我已经添加了一些代码到这个答案中,现在将回答我的主要问题。 - Marcus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接