SonyのXperia Homeを使用すると、特定のアプリでは、アプリアイコンにカウントバブルまたはバッジを表示できます。 FacebookとFacebook Messengerの両方がこれを行い、組み込みの電子メールアプリも同様です。
これは Samsungのランチャー用に解決済み ですが、Sonyのランチャー用にそれを行う方法に関するドキュメントはありません。
どうすればできますか?
バッジを処理するためにBadgeProviderを使用するSamsungのランチャー用のDaniel Ochoaのソリューションを見た後、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 filter 41be9858
そのため、Samsungのコンテンツプロバイダーではなく、SonyのBroadcastRecieverを使用して処理されます。そのため、アクションcom.sonyericsson.home.action.UPDATE_BADGEをリッスンする独自のダミーBroadcastRecieverを作成し、SonyのBadgeServiceに渡されたエキストラを見つけました。このため、許可も必要でしたが、ダンプファイルで簡単に見つけることができました。
com.sonyericsson.home.permission.RECEIVE_BADGE
Facebookやメールアプリなどから送信される追加機能は次のとおりです。
そのため、ランチャーのアプリケーションアイコンにバッジを表示するのは非常に簡単です。 IMOは、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);
これが誰かの助けになることを願っています! :)
このクラスは、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を新しいメッセージの数を示す数字で更新することは可能ですか?
この質問はかなり古いことを理解していますが、歴史的な目的で、この特定の機能のためにサードパーティアプリケーションがXperia Home APIとやり取りするAPIが昨年公開されました:
ここにサンプルコードがあります:
Xperia Home APIなど、ほとんどの主要な電話ベンダーをサポートするサードパーティライブラリもあります。