С Xperia Home от Sony некоторые приложения имеют возможность отображать значок пузыря или значок на значке приложения. Facebook и Facebook Messenger делают это, а также встроенное приложение электронной почты.
Это было решено для запуска программы Samsung , но я не сталкивался с какой-либо документацией о том, как это сделать для пусковой установки Sony.
Как это можно сделать?
Выбрав решение Daniel Ochoa для запуска программы Samsung, которое использует BadgeProvider для обработки значков, я решил сделать то же самое для Xperia Home от Sony. Этот ответ берется непосредственно из моего блога .
Я наткнулся на AppXplore от Sony и использовал его, чтобы проверить разрешение приложения 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. Итак, я создал фиктивный собственный BroadcastReciever, прислушиваясь к действию com.sonyericsson.home.action.UPDATE_BADGE и обнаружил, что дополнительные функции переданы в BadgeService от Sony. Для этого мне также понадобилось разрешение, но это было легко найти в файле дампа:
com.sonyericsson.home.permission.RECEIVE_BADGE
Дополнительные услуги, отправленные Facebook, приложение электронной почты и т. Д.:
Таким образом, оказывается, что очень просто показать значок на вашем значке приложения в панели запуска. ИМО это гораздо более прямолинейно, чем для запуска в Samsung. Вот пошаговое руководство (и это не долго!)
com.sonyericsson.home.permission.BROADCAST_BADGE
разрешение 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);
Надеюсь, это помогло кому-то! 🙂
Я использую этот класс для устройств 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; } }
Ну, это довольно сложно сделать. Единственный способ, который я нашел до сих пор, – создать widget
который будет обрабатывать значок приложения и значок.
Я настоятельно рекомендую вам посетить эту страницу, где вы узнаете, как это сделать: Android: можно ли обновить ImageView / ImageButton с номером, чтобы показать количество новых сообщений?
Я понимаю, что этот вопрос довольно старый, но для исторических целей API для сторонних приложений для взаимодействия с Xperia Home API для этой конкретной функции был обнародован в прошлом году:
API-интерфейс API-интерфейса Xperia теперь общедоступен
С примером кода здесь:
sonyxperiadev / домашний значок
Существует также сторонняя библиотека, которая поддерживает большинство основных поставщиков телефонов, включая Xperia Home API:
leolin310148 / ShortcutBadger