Добавление значка уведомления на значок приложения в Android

Вы можете подумать, что это дублирующий вопрос, но я хочу, чтобы ответы были более конкретными, чем любые подобные вопросы.

Сначала это говорит, что, как Facebook, имеющий значок уведомления с устройством Samsung. Как Facebook добавляет номера значков на значок приложения в Android?, и это, оказывается, пусковая установка touchwiz, которая может быть пусковой установкой по умолчанию для устройств Samsung. когда я попытался протестировать свое устройство Samsung с помощью nova launcher. для этого нужно установить какое-нибудь стороннее программное обеспечение или Nova TestlaUnread.

Вот факт. я думал, что touchWiz добавляет значок для всех приложений, но когда я пытаюсь протестировать свое приложение, чтобы получить какое-либо уведомление, он не показывает никакого значка. как я узнал, что Samsung 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?Это для устройства Samsung,

с этими предыдущими аргументами кажется, что за значки в иконке приложения в android ответственны программы запуска разных производителей. Sony Experia использует Experia Home/Launcher в качестве запуска по умолчанию. в моем устройстве sony у них был какой-то значок в виде смс или пропущенных звонков или фейсбука.

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"

Спасибо вперед

2 ответа

Я использую этот класс для устройств Samsung и Sony (также доступен 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;
    }
}

В дополнение к решению Даниэля Очоа для Samsung (см. Комментарий к OP), я выяснил, как это сделать для устройств 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);
    

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

Другие вопросы по тегам