5

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

首先它说就像 facebook 有三星设备的通知徽章。 Facebook 如何在 Android 中的应用图标上添加徽章编号?. 原来是touchwiz启动器,它可能是三星设备的默认启动器。当我尝试使用 nova 启动器测试我的三星设备时。它需要安装一些第三方软件或 Nova TestlaUnread。

这是事实。我认为 touchWiz 正在为所有应用程序添加徽章,但是当我尝试使用我的应用程序进行测试以获得一些通知时,它没有显示任何徽章。正如我发现三星 TouchWiz 只向选定的应用程序显示应用程序,如此处所述: 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? 那是三星设备的,

有了之前的论点,似乎不同供应商的启动器是负责 android 应用程序图标中的徽章的人。Sony Experia 使用 Experia Home/Launcher 作为其默认启动器。在我的索尼设备中,他们在短信或未接电话或 Facebook 上有一些徽章。

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

因为我在想也许与启动器交互似乎是这个“将徽章添加到应用程序图标”的解决方案。

还有这个关于这个活动别名的解决方案,并且不时更改应用程序图标,我认为这是垃圾。 有没有办法将徽章添加到 Android 中的应用程序图标?

所以我正在寻找与供应商特定的启动器交互的解决方案。

“任何解决方案都会受到赞赏,即使我会深入使用 android 中的原生开发”

提前谢谢

4

2 回答 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;
    }
}
于 2014-09-15T13:29:04.227 回答
0

除了 Daniel Ochoa 为三星提供的解决方案(请参阅对 OP 的评论),我还弄清楚了索尼设备是如何做到这一点的。

我在这里写过博客。我还在这里发布了一个单独的 SO 问题。


Sony 设备使用一个名为BadgeReciever.

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

  2. 广播一个IntentBadgeReceiver

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

我已排除有关如何找到此问题的详细信息以保持答案简短,但所有内容都可以在博客中找到。对某人来说可能是一本有趣的书。

于 2013-11-26T14:49:03.463 回答