Как отобразить количество уведомлений в значке панели запуска приложений

Samsung Galaxy Note 2 Android версии 4.1.2

Я знаю, что этот вопрос задавался ранее, и ответ не был возможен

Как отобразить счетчик над значком панели запуска приложений на Android

Тем не менее вчера я обновил приложение facebook, и оно начало показывать счетчик непрочитанных сообщений личных сообщений. Почему приложение Facebook может, и я не могу сделать это для моего приложения?

значок facebook

Samsung Galaxy Note 2 Android версии 4.1.2

5 ответов

Решение

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 - это открытая операционная система, и мы можем делать с ней все, что захотим, поэтому единственный способ добавить номер значка - это использовать какие-либо сторонние приложения или пользовательские средства запуска, или интерфейс сенсорный. интерфейсы: Samsung TouchWiz или интерфейс Sony Xperia. Другие ответы используют эти возможности, и вы можете искать их в стеке, например, здесь. Но я повторю еще раз: для этого не существует стандартного API, и я хочу сказать, что это плохая практика. Значок уведомления о значке в приложении является шаблоном iOS, и его не следует использовать в приложениях Android в любом случае. В Andrioid для этих целей есть уведомления в строке состояния: http://developer.android.com/guide/topics/ui/notifiers/notifications.html Так что, если Facebook или кто-то другой использует это - это не обычный шаблон или Тенденция, которую мы должны рассмотреть. Но если вы все равно настаиваете и не хотите использовать виджеты на главном экране, посмотрите здесь, пожалуйста:

Как Facebook добавляет номера значков на значок приложения в Android?

Как вы видите, это не настоящее приложение Facebook, это TouchWiz. В ванильном андроиде это может быть достигнуто с помощью Nova Launcher http://forums.androidcentral.com/android-applications/199709-how-guide-global-badge-notifications.html Так что если вы увидите где-нибудь значки значков, убедитесь, что это либо сторонний лаунчер, либо сенсорный интерфейс (оболочка внешнего интерфейса). Возможно, когда-нибудь Google добавит эту возможность в стандартный Android API.

Это работает в Samsung TouchWiz Launcher

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

ShortcutBadger - это библиотека, которая добавляет уровень абстракции над маркой устройства и текущим средством запуска и предлагает отличный результат. Работает с LG, Sony, Samsung, HTC и другими кастомными лаунчерами.

У этого даже есть способ показать Счетчик Жетонов на рабочем столе Чистых устройств Android.

Обновление счетчика значков на значке приложения так же просто, как вызов:

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

Он включает в себя демонстрационное приложение, которое позволяет вам проверить его поведение.

Я разобрался, как это сделать для устройств Sony.

Я писал об этом здесь. Я также разместил отдельный ТАК вопрос об этом здесь.


Устройства Sony используют класс с именем BadgeReciever,

  1. Объявить com.sonyericsson.home.permission.BROADCAST_BADGE разрешение в вашем файле манифеста:

  2. Трансляция Intent к 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. Готово. Однажды это Intent При запуске программы запуска должен отображаться значок на значке вашего приложения.

  4. Чтобы снова удалить значок, просто отправьте новую трансляцию, на этот раз с SHOW_MESSAGE установить в ложь:

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

Я исключил детали того, как я нашел это, чтобы краткий ответ, но все это доступно в блоге. Может быть, интересное чтение для кого-то.

Это пример и лучший способ показать значок на значке панели уведомлений.

Добавить этот класс в ваше приложение

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" />
Другие вопросы по тегам