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

В Sony Xperia Home некоторые приложения имеют возможность отображать значок пузыря или значок на значке приложения. Facebook и Facebook Messenger делают это, а также встроенное приложение электронной почты.

Это было решение для Samsung launcher, но я не сталкивался с какой-либо документацией о том, как это сделать для Sony launcher.

Как это можно сделать?

Ответ 1

После просмотра решения Daniel Ochoa для планшета Samsung, в котором используется BadgeProvider для обработки значков, я решил сделать то же самое для Sony Xperia Home. Этот ответ берется непосредственно из моего блога.

Как я понял это - для всех, кого интересует

Я наткнулся на Sony AppXplore и использовал его, чтобы проверить разрешение приложения Facebook. Приложение Facebook запрашивает следующее разрешение, которое является ключом к отображению значков на устройствах Sony:

com.sonyericsson.home.permission.BROADCAST_BADGE

Затем я просмотрел всех доступных поставщиков контента, но я не нашел ничего, что связано с значками значков приложений. Я выполнил команду в этом ответе, чтобы получить файл дампа системы и искал "значок" с помощью Notepad ++. Я нашел это:

com.sonyericsson.home.action.UPDATE_BADGE: 41be9a90 com.sonyericsson.home/.BadgeService $Фильтр BadgeReceiver 41be9858

Таким образом, он работал с BroadcastReciever на Sony, в отличие от Samsung Content Provider. Итак, я создал фиктивный собственный BroadcastReciever, прислушиваясь к действию com.sonyericsson.home.action.UPDATE_BADGE и нашел дополнительные функции, переданные Sony BadgeService. Для этого мне также понадобилось разрешение, но это было легко найти в файле дампа:

com.sonyericsson.home.permission.RECEIVE_BADGE

Дополнительные услуги, отправленные Facebook, приложение электронной почты и т.д.:

  • com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME - имя основного действия вашего приложения, android.intent.action.MAIN. Это поэтому пусковая установка знает, какой значок отображает значок.
  • com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE - a boolean, указывающий, хотим ли мы показывать значок или нет (что мы делаем!)
  • com.sonyericsson.home.intent.extra.badge.MESSAGE - строка (а не целое число - мне потребовалось некоторое время, чтобы понять...) с номером для показа.
  • com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME - название вашего пакета приложений.

Как показать значки на значке запуска приложения на устройствах Sony Xperia

Итак, оказывается, что очень просто показать значок на иконке вашего приложения в панели запуска. ИМО это гораздо более прямолинейно, чем для запуска Samsung. Здесь пошаговое руководство (и это не долго!)

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

  • Передайте 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);
    
  • Готово. После того, как этот Intent будет транслироваться, пусковая установка должна показать значок на вашем значке приложения.

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

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

Полезно знать

Сообщение представляет собой строку!

Так как MESSAGE является String, вы можете фактически добавить слова в значок:

intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "Testing");

Но я бы этого не сделал, потому что это выглядит странно.

У вас есть доступ ко всем приложениям!

Разрешение BROADCAST_BADGE не только дает вам доступ к вашему собственному значку приложения, но и ко всем их. Например, здесь вы можете установить значок Facebook:

Intent intent = new Intent();
intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", "com.facebook.katana.LoginActivity");
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.facebook.katana");

sendBroadcast(intent);

Я надеюсь, что это кому-то помогло!:)

Ответ 2

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

Ответ 3

Ну, это довольно сложно сделать. Единственный способ, который я нашел до сих пор, - создать widget, который будет обрабатывать как значок приложения, так и значок.

Я настоятельно рекомендую вам посетить эту страницу, где вы узнаете, как это сделать: Android: можно ли обновить ImageView/ImageButton номером, чтобы показать количество новых сообщений?

Ответ 4

Я понимаю, что этот вопрос довольно старый, но для исторических целей API для сторонних приложений для взаимодействия с Xperia Home API для этой конкретной функции был опубликован в прошлом году:

API-интерфейс Xperia Home badge теперь доступен публично

С примером кода здесь:

sonyxperiadev/home-badge

Существует также сторонняя библиотека, которая поддерживает большинство основных поставщиков телефонов, включая Xperia Home API:

leolin310148/ShortcutBadger