Bei Sonys Xperia Home haben bestimmte Apps die Möglichkeit, eine Zählblase oder ein Abzeichen auf dem App-Symbol anzuzeigen. Facebook und Facebook Messenger tun dies ebenso wie die eingebaute E-Mail-App.
Dies wurde für den Launcher von Samsung gelöst, aber ich habe keine Dokumentation darüber gefunden, wie dies für den Launcher von Sony zu tun ist.
Wie kann es gemacht werden?
Nachdem ich die Lösung von Daniel Ochoa für Samsungs Launcher gesehen hatte, die einen BadgeProvider verwendet, um die Abzeichen zu handhaben, machte ich mich daran, dasselbe für Sonys Xperia Home zu tun. Diese Antwort wird direkt übernommen aus meinem Blog.
Wie ich es herausgefunden habe – Für alle Interessierten
Ich bin darüber gestolpert Sonys AppXplore und benutzte es, um die Erlaubnis der Facebook-App zu überprüfen. Die Facebook-App fordert die folgende Berechtigung an, die der Schlüssel zum Anzeigen von Badges auf Sony-Geräten ist:
com.sonyericsson.home.permission.BROADCAST_BADGE
Als nächstes habe ich alle verfügbaren Inhaltsanbieter durchgesehen, aber ich habe dort nichts gefunden, was mit App-Icon-Badges zu tun hat. Ich habe den Befehl in dieser Antwort ausgeführt, um eine System-Dump-Datei zu erhalten, und mit Notepad ++ nach „Badge“ gesucht. Ich habe das gefunden:
com.sonyericsson.home.action.UPDATE_BADGE: 41be9a90 com.sonyericsson.home/.BadgeService$BadgeReceiver filter 41be9858
Es wird also mit einem BroadcastReciever auf Sony gehandhabt, im Gegensatz zu Samsungs Content Provider. Also habe ich einen eigenen Dummy-BroadcastReciever erstellt, der auf die Aktion com.sonyericsson.home.action.UPDATE_BADGE lauscht, und festgestellt, dass die Extras an Sonys BadgeService übergeben wurden. Dafür brauchte ich auch eine Berechtigung, aber die war in der Dump-Datei leicht zu finden:
com.sonyericsson.home.permission.RECEIVE_BADGE
Die von Facebook, der E-Mail-App usw. gesendeten Extras sind:
- com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME – Der Name der Hauptaktivität Ihrer App, android.intent.action.MAIN. Auf diese Weise weiß der Launcher, 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 zeigen wollen oder nicht (was wir tun!)
- com.sonyericsson.home.intent.extra.badge.MESSAGE – ein String (kein Integer – das hat eine Weile gedauert, bis ich es erkannt habe …) mit der Zahl, die angezeigt werden soll.
- 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, ein Abzeichen auf Ihrem Anwendungssymbol im Launcher anzuzeigen. IMO ist es viel einfacher als für Samsungs Launcher. Hier ist eine Schritt-für-Schritt-Anleitung (und es ist nicht lang!)
-
Deklarieren Sie die com.sonyericsson.home.permission.BROADCAST_BADGE
Berechtigung in Ihrer Manifestdatei:
-
Sendung ein Intent
zum 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);
-
Fertig. Einmal dies Intent
gesendet wird, sollte der Launcher ein Abzeichen auf Ihrem Anwendungssymbol anzeigen.
-
Um den Badge wieder zu entfernen, senden Sie einfach eine neue Sendung, diesmal mit SHOW_MESSAGE
auf falsch setzen:
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
Gut zu wissen
Die Nachricht ist eine Zeichenfolge!
Seit MESSAGE
ist ein String
, können Sie dem Abzeichen 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!
Der BROADCAST_BADGE
Berechtigung gibt Ihnen nicht nur Zugriff auf das Symbol Ihrer eigenen App, sondern auf ALLE. So können Sie beispielsweise 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! 🙂
Ich verwende diese Klasse für Samsung-, Sony- und HTC-Geräte (ebenfalls verfügbar https://gist.github.com/Tadas44/cdae2f5995f21bf1c27f). Vergessen Sie nicht hinzuzufügen <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />
zu 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;
}
}
Nun, das ist ziemlich schwierig zu tun. Die einzige Möglichkeit, die ich bisher gefunden habe, besteht darin, eine zu erstellen widget
die sowohl das App-Symbol als auch das Abzeichen verarbeitet.
Ich empfehle Ihnen dringend, diese Seite zu besuchen, auf der Sie erfahren, wie Sie das erreichen: Android: Ist es möglich, einen ImageView/ImageButton mit einer Zahl zu aktualisieren, um die Anzahl neuer Nachrichten anzuzeigen?
Mir ist klar, dass diese Frage ziemlich alt ist, aber aus historischen Gründen wurde die API für Anwendungen von Drittanbietern zur Interaktion mit der Xperia Home-API für diese spezielle Funktion letztes 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
.
Ich kann dies nicht als Antwort posten, da ich nicht genug Ruf habe, um meine eigene Frage innerhalb von 8 Stunden zu beantworten, aber hier ist eine Anleitung, wie es geht: marcusforsberg.net/blog/…. Ich werde dies als Antwort posten und es später heute akzeptieren, wenn ich darf.
– Markus
26. November 13 um 12:44 Uhr
Ich habe diese Antwort für viewBadge gefunden. github.com/jgilfelt/android-viewbadger Gehen Sie es einfach durch und finden Sie heraus, ob es in Ihrem Fall richtig funktioniert. lassen Sie mich wissen, wenn jemand Probleme damit hat.
– Entwickler
18. Februar 14 um 8:47 Uhr
Mögliches Duplikat von Gibt es eine Möglichkeit, einem Anwendungssymbol in Android ein Abzeichen hinzuzufügen?
– Shirish Herwade
14. November 17 um 11:10 Uhr