it-swarm.com.de

Hinzufügen eines Benachrichtigungs-Badges/einer Benachrichtigungsanzahl zu einem Anwendungssymbol auf Sony Xperia-Geräten

Mit Xperia Home von Sony können bestimmte Apps eine Zählblase oder ein Abzeichen auf dem App-Symbol anzeigen. Facebook und Facebook Messenger tun dies ebenso wie die integrierte E-Mail-App. 

Dies wurde für Samsungs Launcher gelöst , aber ich habe keine Dokumentation darüber erhalten, wie man dies für Sonys Launcher macht. 

Wie geht das?

33
Marcus

Nachdem ich Daniel Ochoas Lösung für Samsungs Launcher gesehen hatte, bei der ein BadgeProvider für die Abzeichen verwendet wurde, wollte ich dasselbe für Sony Xperia Home tun. Diese Antwort wird direkt aus meinem Blog übernommen.

Wie ich es herausgefunden habe - Für alle Interessierten

Ich bin über Sonys AppXplore gestolpert und habe die Berechtigung der Facebook-App ausgecheckt. Die Facebook-App fordert die folgende Berechtigung an. Dies ist der Schlüssel zum Anzeigen von Badges auf Sony-Geräten:

com.sonyericsson.home.permission.BROADCAST_BADGE

Als Nächstes habe ich alle verfügbaren Inhaltsanbieter durchgesehen, aber nichts gefunden, was mit App-Symbol-Badges zu tun hat .. _ Ich habe den Befehl Befehl in dieser Antwort ausgeführt, um eine Systemspeicherdatei zu erhalten und suchte nach "Abzeichen" mit Notepad ++. Ich habe das gefunden:

com.sonyericsson.home.action.UPDATE_BADGE: 41be9a90 com.sonyericsson.home/.BadgeService $ BadgeReceiver-Filter 41be9858

Im Gegensatz zu dem Content-Provider von Samsung wird dies mit einem BroadcastReciever von Sony durchgeführt. Also habe ich einen eigenen Dummy-BroadcastReciever erstellt, der auf die Aktion com.sonyericsson.home.action.UPDATE_BADGE wartete, und fand die Extras, die an Sonys BadgeService übergeben wurden ..__ Ich brauchte auch eine Erlaubnis, aber das war einfach in der Dump-Datei suchen:

com.sonyericsson.home.permission.RECEIVE_BADGE

Die von Facebook gesendeten Extras, die E-Mail-App usw. sind:

  • com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME - Dername der Hauptaktivität Ihrer App, Android.intent.action.MAIN. Dies ist Der Launcher weiß also, auf welchem ​​Symbol das Abzeichen angezeigt werden soll.
  • com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE - ein Boolescher Wert, der angibt, ob wir das Abzeichen anzeigen möchten oder nicht (was wir tun!)
  • com.sonyericsson.home.intent.extra.badge.MESSAGE - eine Zeichenfolge (keine ganze Zahl - das hat eine Weile gedauert ...) mit der Nummerzu zeigen.
  • com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME - Der Name Ihres Anwendungspakets.

So zeigen Sie Abzeichen auf dem Startsymbol Ihrer App auf Sony Xperia-Geräten an

Es stellt sich also heraus, dass es sehr einfach ist, im Startprogramm ein Symbol für Ihr Anwendungssymbol anzuzeigen. IMO ist viel einfacher als für Samsungs Launcher ... Hier ist eine Schritt-für-Schritt-Anleitung (und es ist nicht lang!)

  1. Deklarieren Sie die com.sonyericsson.home.permission.BROADCAST_BADGE-Berechtigung in Ihrer Manifestdatei:

  2. Senden Sie eine Intent an die 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. Erledigt. Sobald diese Intent-Sendung ausgestrahlt wird, sollte auf dem Anwendungssymbol ein Startbild angezeigt werden.

  4. Um das Abzeichen wieder zu entfernen, senden Sie einfach eine neue Sendung, diesmal mit SHOW_MESSAGE auf false:

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

Gut zu wissen

Die Nachricht ist eine Zeichenfolge!

Da MESSAGE ein String ist, können Sie dem Badge tatsächlich Wörter hinzufügen:

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

Aber ich würde das nicht tun, weil es einfach komisch aussieht.

Sie haben Zugriff auf alle Apps!

Mit der BROADCAST_BADGE-Berechtigung haben Sie nicht nur Zugriff auf das Symbol Ihrer eigenen App, sondern auf ALLE. Zum Beispiel können Sie das Abzeichen von Facebook festlegen:

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

Ich hoffe, das hat jemandem geholfen! :)

45
Marcus

Ich verwende diese Klasse für Samsung-, Sony- und HTC-Geräte (ebenfalls verfügbar https://Gist.github.com/Tadas44/cdae2f5995f21bf1c27f ). Vergessen Sie nicht, <uses-permission Android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" /> zu AndroidManifest.xml hinzuzufügen

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
Tadas Valaitis

Nun, das ist ziemlich schwierig. Der einzige Weg, den ich bisher gefunden habe, ist das Erstellen einer widget, die sowohl das App-Symbol als auch das Badge behandelt.

Ich empfehle Ihnen dringend, diese Seite zu besuchen, auf der Sie erfahren, wie Sie dies erreichen können: Android: Kann ein ImageView/ImageButton mit einer Nummer aktualisiert werden, um die Anzahl der neuen Nachrichten anzuzeigen?

0
Manitoba

Mir ist klar, dass diese Frage ziemlich alt ist, aber aus historischen Gründen wurde die API für Drittanbieteranwendungen für die Interaktion mit der Xperia Home-API für diese bestimmte Funktion im letzten Jahr veröffentlicht:

Xperia Home Badge API jetzt öffentlich verfügbar

Mit Beispielcode hier:

sonyxperiadev/home-badge

Es gibt auch eine Bibliothek von Drittanbietern, die die meisten großen Telefonanbieter unterstützt, einschließlich der Xperia Home API:

leolin310148/ShortcutBadger

0