web-dev-qa-db-ja.com

Sony Xperiaデバイスのアプリケーションアイコンに通知バッジ/カウントを追加する方法

SonyのXperia Homeを使用すると、特定のアプリでは、アプリアイコンにカウントバブルまたはバッジを表示できます。 FacebookとFacebook Messengerの両方がこれを行い、組み込みの電子メールアプリも同様です。

これは Samsungのランチャー用に解決済み ですが、Sonyのランチャー用にそれを行う方法に関するドキュメントはありません。

どうすればできますか?

34
Marcus

バッジを処理するために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やメールアプリなどから送信される追加機能は次のとおりです。

  • com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME -アプリのメインアクティビティの名前、Android.intent.action.MAIN。これは、ランチャーがバッジを表示するアイコンを認識するためです。
  • com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE -バッジを表示するかどうかを示すブール値(実行します!)
  • com.sonyericsson.home.intent.extra.badge.MESSAGE -表示する数字を含む文字列(整数ではなく、実現までに時間がかかりました...)。
  • com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME -アプリケーションパッケージの名前。

Sony Xperiaデバイスでアプリのランチャーアイコンにバッジを表示する方法

そのため、ランチャーのアプリケーションアイコンにバッジを表示するのは非常に簡単です。 IMOは、Samsungのランチャーよりもずっと簡単です。ここにステップバイステップガイドがあります(そしてそれは長くはありません!)

  1. マニフェストファイルでcom.sonyericsson.home.permission.BROADCAST_BADGE権限を宣言します。

  2. IntentBadgeReceiverにブロードキャストします。

    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. できたこのIntentがブロードキャストされると、ランチャーはアプリケーションアイコンにバッジを表示します。

  4. バッジを再度削除するには、SHOW_MESSAGEをfalseに設定して新しいブロードキャストを送信するだけです:

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

知っておきたい

メッセージは文字列です!

MESSAGEStringであるため、実際にバッジに単語を追加できます。

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

これが誰かの助けになることを願っています! :)

47
Marcus

このクラスは、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;
    }
}
29
Tadas Valaitis

まあ、これはかなり難しいです。これまで見つけた唯一の方法は、アプリアイコンとバッジの両方を処理するwidgetを作成することです。

このページにアクセスして、それを達成する方法を学ぶことを強くお勧めします。 Android:ImageView/ImageButtonを新しいメッセージの数を示す数字で更新することは可能ですか?

0
Manitoba

この質問はかなり古いことを理解していますが、歴史的な目的で、この特定の機能のためにサードパーティアプリケーションがXperia Home APIとやり取りするAPIが昨年公開されました:

Xperia HomeバッジAPIが公開されました

ここにサンプルコードがあります:

sonyxperiadev/home-badge

Xperia Home APIなど、ほとんどの主要な電話ベンダーをサポートするサードパーティライブラリもあります。

leolin310148/ShortcutBadger

0