Jak dodać plakietkę/licznik powiadomień do ikony aplikacji na urządzeniach Sony Xperia?

W Xperia Home Sony niektóre aplikacje mają możliwość wyświetlania bańki licznika lub znaczka na ikonie aplikacji. Facebook i Facebook Messenger robią to, a także wbudowana aplikacja e-mail.

To zostało rozwiązane dla Launchera Samsunga, ale nie natknąłem się na żadnej dokumentacji, jak to zrobić dla Launchera Sony.

Jak to zrobić?

Author: Community, 2013-11-26

4 answers

Po obejrzeniu rozwiązania Daniela Ochoa dla Launchera Samsunga, który używa Badgeprovidera do obsługi odznak, postanowiłem zrobić to samo dla Sony Xperia Home. Ta odpowiedź pochodzi bezpośrednio z mojego bloga .

Jak to rozgryzłem - dla wszystkich zainteresowanych

Natknąłem się na Sony AppXplore i użył go, aby sprawdzić uprawnienia aplikacji Facebook. Aplikacja Facebook wymaga następującego zezwolenia, które jest kluczem do wyświetlania odznak na urządzeniach Sony:

Com.sonyericsson.do domu.pozwolenie.BROADCAST_BADGE

Następnie przejrzałem wszystkich dostępnych dostawców treści , ale nie znalazłem tam nic związanego z plakietkami ikon aplikacji. Uruchomiłem polecenie w tej odpowiedzi , aby uzyskać plik zrzutu systemu i wyszukałem "badge" za pomocą Notepad++. Znalazłem to:

Com.sonyericsson.do domu.akcja.UPDATE_BADGE: 41be9a90sonyericsson.Strona główna/.BadgeService $ badgereceiver filter 41be9858

Więc, jest obsługiwany za pomocą Broadcastreciver na Sony, w przeciwieństwie do dostawcy treści Samsunga. Stworzyłem więc własną audycję, słuchając "action com".sonyericsson.do domu.akcja.UPDATE_BADGE i okazało się, że dodatki zostały przekazane do BadgeService Sony. W tym celu potrzebowałem również pozwolenia, ale łatwo było je znaleźć w pliku zrzutu:

Com.sonyericsson.do domu.pozwolenie.RECEIVE_BADGE

Dodatki wysłane przez Facebook, the Aplikacja e-mail, itp., to:

  • com.sonyericsson.do domu.intencja.extra.odznaka.ACTIVITY_NAME - The nazwa głównej aktywności Twojej aplikacji, android.intencja.akcja.MAIN. To jest więc wyrzutnia wie, na której ikonie pokazać odznakę.
  • com.sonyericsson.do domu.intencja.extra.odznaka.SHOW_MESSAGE - a boolean wskazujący, czy chcemy pokazać odznakę, czy nie (co robimy!)
  • com.sonyericsson.do domu.intencja.extra.odznaka.MESSAGE - ciąg znaków (nie jest liczbą całkowitą - trochę mi to zajęło...) z numerem pokazać.
  • com.sonyericsson.do domu.intencja.extra.odznaka.PACKAGE_NAME - Nazwa pakietu aplikacji.

Jak wyświetlać odznaki na ikonie launchera aplikacji na urządzeniach Sony Xperia]}

Okazuje się więc, że bardzo łatwo jest pokazać odznakę na ikonie aplikacji w launcherze. IMO jest o wiele bardziej prosto niż w przypadku launchera Samsunga. Oto poradnik krok po kroku (i nie jest long!)

  1. Zadeklaruj pozwolenie com.sonyericsson.home.permission.BROADCAST_BADGE w swoim pliku manifestu:

  2. Nadaj Intent do 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. Załatwione. Po emisji Intent launcher powinien pokazać odznakę na ikonie aplikacji.

  4. Aby ponownie usunąć odznakę, po prostu wyślij nową transmisję, tym razem z SHOW_MESSAGE ustawioną na false:
    intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
    

Dobrze wiedzieć

Wiadomość jest ciągiem znaków!

Od MESSAGE jest String, można rzeczywiście dodać słowa do odznaki:

intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "Testing");
Ale nie zrobiłbym tego, bo to wygląda dziwnie.

Masz dostęp do wszystkich aplikacji!

Pozwolenie BROADCAST_BADGE daje nie tylko dostęp do ikony własnej aplikacji, ale do wszystkich z nich. Na przykład, oto jak możesz ustawić plakietkę Facebook ' a:

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);

Mam nadzieję, że to komuś pomogło! :)

 45
Author: Marcus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:09

Używam tej klasy dla urządzeń Samsung, Sony i HTC (dostępne również https://gist.github.com/Tadas44/cdae2f5995f21bf1c27f nie zapomnij dodać <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" /> do 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;
    }
}
 28
Author: Tadas Valaitis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-20 08:52:05

Cóż, to jest dość trudne do zrobienia. Jedynym sposobem, jaki znalazłem do tej pory, jest stworzenie widget, która będzie obsługiwać zarówno ikonę aplikacji, jak i plakietkę.

Gorąco polecam odwiedzić tę stronę, gdzie dowiesz się, jak to osiągnąć: Android: czy można zaktualizować ImageView / ImageButton z numerem, aby pokazać liczbę nowych wiadomości?

 0
Author: Manitoba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:53

Zdaję sobie sprawę, że to pytanie jest dość stare, ale dla celów historycznych, API dla aplikacji innych firm do interakcji z API Xperia Home dla tej konkretnej funkcji zostało upublicznione w zeszłym roku:

Xperia Home badge API teraz publicznie dostępne

Z przykładowym kodem tutaj:

Sonyxperiadev / Home-badge

Istnieje również biblioteka innych firm, która obsługuje większość głównych dostawców telefonów, w tym Xperia Home API:

Leolin310148 / ShortcutBadger

 0
Author: Martin Lindström,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-20 10:49:47