it-swarm.com.ru

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

samsung Galaxy Note 2 Android версия 4.1.2

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

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

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

facebook icon

enter image description here

samsung Galaxy Note 2 Android версия 4.1.2

180
Waqleh

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 - это открытая операционная система, и мы можем делать с ней все, что захотим, поэтому единственный способ добавить номер значка - это использовать некоторые сторонние приложения или пользовательские средства запуска или интерфейс сенсорного интерфейса: интерфейс Samsung TouchWiz или Sony 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.

114
Oleksandr Karaberov

Это работает в 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;
}
91
ChangUZ

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

У него даже есть способ отображать количество значков на рабочем столе Pure Android устройств.

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

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

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

76
AlexGuti

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

Я в блоге об этом здесь . Я также опубликовал отдельный 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);
    

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

12
Marcus

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

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

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" />
8
Jaydeep purohit