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


этот вопрос уже есть ответ здесь:

samsung galaxy note 2 android версии 4.1.2

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

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

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

samsung galaxy note 2 android версии 4.1.2

5 169

5 ответов:

Android ("ванильный" 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-сторонние приложения или пользовательские пусковые установки, либо сенсорный интерфейс интерфейсы: интерфейс Samsung TouchWiz или Sony Xperia. Другие ответы используют эти возможности, и вы можете искать это на stackoverflow, например здесь. Но повторю еще раз: есть нет стандартные 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 Поэтому, если вы где-то увидите значки значков, убедитесь, что это либо 3-й партийный лаунчер, либо сенсорный интерфейс (frontend wrapper). Может быть, когда-нибудь 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 значение false:

    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.Ява Используйте класс 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" />