LoginSignup
16
22

More than 5 years have passed since last update.

アイコンにバッジをつける

iPhoneのように、HOMEに表示されているアイコンにバッジをつけたい。

仕事で対応したので、一応メモとして書いておきます。

方法はありますが、すべてのHOMEアプリに適用できるわけではなく、一部のHOMEアプリでしか表示できないので注意です。

適用できるHOMEアプリ

確認したところ、以下のHOMEアプリでは動いてました。

  • GalaxyのTouchWiz

それ以外のHOMEアプリはまだ未検証なので、あとあと検証してみます。
仕事では、XperiaHomeにも表示させましたが、その場合は実装がすこし異なるので、
それはまた後日追記します。。

表示方法

では実装です。
もう面倒なので、ざっくり作ったメソッド群をペタッと貼ときます。

こちらを参考にしてます。(というかほぼそのままです。)

    /**
     * アイコンにバッジをクリアする。<br>
     * ※0を設定する
     * 
     * @param context コンテキスト
     */
    public static void clearIconBadge(final Context context) {
        setIconBadge(context, 0);
    }

    /**
     * アイコンにバッジを付ける。
     *
     * @param context コンテキスト
     * @param count バッジ表示する数字
     */
    public static void setIconBadge(final Context context, final int count) {
        if (context == null) {
            return;
        }
        final String launcherClassName = getLauncherClassName(context);
        if (TextUtils.isEmpty(launcherClassName)) {
            return;
        }
        final 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);
    }

    /**
     * 起動中のアプリのクラス名を取得する。
     *
     * @param context コンテキスト。
     * @return 起動中のアプリのクラス名<br>
     *     正常に取得できない場合はnull。
     */
    @Nullable
    private static String getLauncherClassName(@NonNull final Context context) {
        final PackageManager pm = context.getPackageManager();
        final Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        final List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(intent, 0);

        for (final ResolveInfo resolveInfo : resolveInfoList) {
            if (resolveInfo == null) {
                continue;
            }
            final String pkgName = resolveInfo.activityInfo.applicationInfo.packageName;
            if (pkgName.equalsIgnoreCase(context.getPackageName())) {
                return resolveInfo.activityInfo.name;
            }
        }

        return null;
    }

setIconBadge()を、バッジを表示させたいタイミングで呼び出します。
また、バッジを消したい場合は0を設定すれば良いので、↑で書いたコードだと
clearIconBadge()を呼び出せばOKです。

Kotlinで書く

Kotlin言語の場合も一応貼っておきます。
作成したUtilityをそのままペタッと貼っておきます。

class Utility {
    companion object {

        /**
         * アイコンのバッジをクリアする。<br>
         * ※0を設定する
         * 
         * @param context コンテキスト
         */
        fun clearIconBadge(context: Context) {
            setIconBadge(context, 0)
        }

        /**
         * アイコンにバッジを付ける。

         * @param context コンテキスト
         *
         * @param count バッジ表示する数字
         */
        fun setIconBadge(context: Context?, count: Int) {
            if (context == null) {
                return
            }
            val launcherClassName = getLauncherClassName(context)
            if (TextUtils.isEmpty(launcherClassName)) {
                return
            }
            val intent = Intent("android.intent.action.BADGE_COUNT_UPDATE")
            intent.putExtra("badge_count", count)
            intent.putExtra("badge_count_package_name", context.packageName)
            intent.putExtra("badge_count_class_name", launcherClassName)

            context.sendBroadcast(intent)
        }

        /**
         * 起動中のアプリのクラス名を取得する。
         * 
         * @param context コンテキスト。
         * @return 起動中のアプリのクラス名<br></br>
         * *     正常に取得できない場合はnull。
         */
        private fun getLauncherClassName(context: Context): String? {
            val pm = context.packageManager
            val intent = Intent(Intent.ACTION_MAIN)
            intent.addCategory(Intent.CATEGORY_LAUNCHER)
            val resolveInfoList = pm.queryIntentActivities(intent, 0)

            for (resolveInfo in resolveInfoList) {
                if (resolveInfo == null) {
                    continue
                }
                val pkgName = resolveInfo.activityInfo.applicationInfo.packageName
                if (pkgName.equals(context.packageName, ignoreCase = true)) {
                    return resolveInfo.activityInfo.name
                }
            }

            return null
        }
    }
}
16
22
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
22