200

三星 Galaxy Note 2 安卓版本 4.1.2

我知道之前有人问过这个问题,但无法回复

如何在android上的应用程序启动器图标上显示气球计数器

尽管如此,昨天我更新了 facebook 应用程序,它开始显示未读消息的私人消息计数器。为什么 facebook 应用程序可以而且我不能为我的应用程序这样做?

脸书图标

在此处输入图像描述

三星 Galaxy Note 2 安卓版本 4.1.2

4

5 回答 5

127

Android(没有自定义启动器和触摸界面的“vanilla” android)不允许更改应用程序图标,因为.apk一旦程序编译,它就会被紧紧地密封。无法使用标准 API 以编程方式将其更改为“可绘制”。您可以通过使用小部件而不是图标来实现您的目标。小部件是可定制的。请阅读此:http ://www.cnet.com/8301-19736_1-10278814-251.html和此http://developer.android.com/guide/topics/appwidgets/index.html。也看这里:https ://github.com/jgilfelt/android-viewbadger 。它可以帮助你。

至于徽章编号。正如我之前所说 - 没有标准的方法可以做到这一点。但我们都知道 Android 是一个开放的操作系统,我们可以用它做任何我们想做的事情,所以添加徽章编号的唯一方法是使用一些 3-rd 方应用程序或自定义启动器,或者前端触摸界面:三星 TouchWiz 或索尼 Xperia 的界面。其他答案使用此功能,您可以在 stackoverflow 上搜索此功能,例如此处。但我会再重复一遍:没有标准的 API,我想说这是一种不好的做法。应用程序的图标通知徽章是一种 iOS 模式,无论如何都不应该在 Android 应用程序中使用。在 Andrioid 中有一个用于这些目的的状态栏通知:http://developer.android.com/guide/topics/ui/notifiers/notifications.html 所以,如果 Facebook 或其他人使用它 - 这不是我们应该考虑的常见模式或趋势。但是,如果您仍然坚持并且不想使用主屏幕小部件,那么请看这里:

Facebook 如何在 Android 中的应用图标上添加徽章编号?

如您所见,这不是真正的 Facebook 应用程序,它是 TouchWiz。在 vanilla android 中,这可以通过 Nova Launcher http://forums.androidcentral.com/android-applications/199709-how-guide-global-badge-notifications.html来实现 所以如果你会在某处看到图标徽章,请确保它是第三方启动器或触摸界面(前端包装器)。有时 Google 可能会将此功能添加到标准 Android API 中。

于 2013-07-10T08:09:34.887 回答
94

它适用于三星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;
}
于 2013-11-28T09:08:58.470 回答
82

ShortcutBadger是一个库,它在设备品牌和当前启动器上添加了一个抽象层,并提供了很好的结果。适用于 LG、索尼、三星、HTC 和其他自定义启动器。

它甚至可以在纯 Android 设备桌面中显示徽章计数。

更新应用程序图标中的徽章计数就像调用一样简单:

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

它包含一个演示应用程序,可让您测试其行为。

于 2014-11-06T12:58:06.933 回答
12

我已经弄清楚索尼设备是如何做到这一点的。

我在这里写过博客。我还在这里发布了一个单独的 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:03:17.853 回答
11

这是在通知启动器图标上显示徽章的示例和最佳方式。

在您的应用程序中添加此类

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 在通知到来时使用 BadgeUtils 类。

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

以及来自偏好的明确通知以及徽章计数

 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" />
于 2016-12-30T11:25:38.943 回答