200

サムスン ギャラクシー ノート 2 アンドロイド バージョン 4.1.2

この質問は以前にもありましたが、回答できなかったことは承知しています。

Androidでアプリケーションランチャーアイコンの上にバルーンカウンターを表示する方法

それにもかかわらず、昨日 Facebook アプリを更新したところ、未読メッセージのプライベート メッセージのカウンターが表示されるようになりました。Facebookアプリではできるのに、自分のアプリではできないのはなぜですか?

フェイスブックのアイコン

ここに画像の説明を入力

サムスン ギャラクシー ノート 2 アンドロイド バージョン 4.1.2

4

5 に答える 5

127

Android (カスタム ランチャーとタッチ インターフェースのない「バニラ」アンドロイド)では、アプリケーション アイコンを変更することはできません.apk。標準 API を使用してプログラムで「drawable」に変更する方法はありません。アイコンの代わりにウィジェットを使用することで、目的を達成できます。ウィジェットはカスタマイズ可能です。これを読んでください: http://www.cnet.com/8301-19736_1-10278814-251.htmlとこのhttp://developer.android.com/guide/topics/appwidgets/index.html。こちらもご覧ください: https://github.com/jgilfelt/android-viewbadger。それはあなたを助けることができます。

バッジ番号について。前に言ったように、これを行うための標準的な方法はありません。しかし、Android がオープンなオペレーティング システムであり、Android でやり​​たいことがすべてできることは誰もが知っています。そのため、バッジ番号を追加する唯一の方法は、サード パーティのアプリまたはカスタム ランチャーを使用するか、フロントエンド タッチを使用することです。インターフェイス: Samsung TouchWiz または Sony Xperia のインターフェイス。他の回答はこの機能を使用しており、stackoverflow でこれを検索できます。しかし、もう一度繰り返します。このための標準 API はなく、悪い習慣だと言いたいのです。アプリのアイコン通知バッジは iOS のパターンであり、Android アプリでは使用しないでください。Android には、次の目的のためのステータス バー通知があります。http://developer.android.com/guide/topics/ui/notifiers/notifications.html したがって、Facebook や他の誰かがこれを使用している場合、これは一般的なパターンや傾向ではないことを考慮する必要があります。しかし、どうしてもどうしてもホーム画面のウィジェットを使いたくない場合は、こちらをご覧ください。

FacebookはAndroidのアプリアイコンにバッジ番号をどのように追加しますか?

ご覧のとおり、これは実際の Facebook アプリではなく、TouchWiz です。通常の Android では、これは Nova Launcher http://forums.androidcentral.com/android-applications/199709-how-guide-global-badge-notifications.htmlで実現できます 。そのため、どこかにアイコン バッジが表示される場合は、必ずそれを確認してください。サードパーティのランチャーまたはタッチ インターフェース (フロントエンド ラッパー) のいずれかです。いつか Google がこの機能を標準の Android API に追加するかもしれません。

于 2013-07-10T08:09:34.887 に答える
94

samsung touchwizランチャーで動作します

public static void setBadge(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);
}

public 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;
}
于 2013-11-28T09:08:58.470 に答える
82

ShortcutBadgerは、デバイス ブランドと現在のランチャーに抽象化レイヤーを追加し、優れた結果を提供するライブラリです。LG、Sony、Samsung、HTC、その他のカスタム ランチャーで動作します。

純粋な Android デバイスのデスクトップにバッジ カウントを表示する方法もあります。

アプリケーション アイコンのバッジ カウントの更新は、次の呼び出しと同じくらい簡単です。

int badgeCount = 1;
ShortcutBadger.applyCount(context, badgeCount);

動作をテストできるデモ アプリケーションが含まれています。

于 2014-11-06T12:58:06.933 に答える
12

これがソニーのデバイスでどのように行われるかを理解しました。

私はそれについてここにブログを書きました。また、これについて別の SO の質問をここに投稿しました。


Sony デバイスは という名前のクラスを使用しますBadgeReciever

  1. マニフェスト ファイルでアクセス許可を宣言しcom.sonyericsson.home.permission.BROADCAST_BADGEます。

  2. にブロードキャスト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);
    
  3. 終わり。これIntentがブロードキャストされると、ランチャーはアプリケーション アイコンにバッジを表示するはずです。

  4. バッジを再度削除するには、新しいブロードキャストを送信します。今回はSHOW_MESSAGEfalse に設定します。

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

答えを短くするために、これをどのように見つけたかについての詳細は除外しましたが、すべてブログで入手できます. 誰かにとって興味深い読み物になるかもしれません。

于 2013-11-26T14:03:17.853 に答える
11

これは、通知ランチャー アイコンにバッジを表示するためのサンプルであり、最良の方法です。

アプリケーションにこのクラスを追加

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


}

==> MyGcmListenerService.java 通知が来たら BadgeUtils クラスを使う。

public class MyGcmListenerService extends GcmListenerService { 

    private static final String TAG = "MyGcmListenerService"; 
    @Override
    public void onMessageReceived(String from, Bundle data) {

            String message = data.getString("Msg");
            String Type = data.getString("Type"); 
            Intent intent = new Intent(this, SplashActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                    PendingIntent.FLAG_ONE_SHOT);

            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

            NotificationCompat.BigTextStyle bigTextStyle= new NotificationCompat.BigTextStyle();

            bigTextStyle .setBigContentTitle(getString(R.string.app_name))
                    .bigText(message);
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                    .setSmallIcon(getNotificationIcon())
                    .setContentTitle(getString(R.string.app_name))
                    .setContentText(message)
                    .setStyle(bigTextStyle) 
                    .setAutoCancel(true)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);

            int color = getResources().getColor(R.color.appColor);
            notificationBuilder.setColor(color);
            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);


            int unOpenCount=AppUtill.getPreferenceInt("NOTICOUNT",this);
            unOpenCount=unOpenCount+1;

            AppUtill.savePreferenceLong("NOTICOUNT",unOpenCount,this);  
            notificationManager.notify(unOpenCount /* ID of notification */, notificationBuilder.build()); 

// This is for bladge on home icon          
        BadgeUtils.setBadge(MyGcmListenerService.this,(int)unOpenCount);

    }


    private int getNotificationIcon() {
        boolean useWhiteIcon = (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP);
        return useWhiteIcon ? R.drawable.notification_small_icon : R.drawable.icon_launcher;
    }
}

そして、設定からの明確な通知とバッジカウントも

 public class SplashActivity extends AppCompatActivity { 
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_splash);

                    AppUtill.savePreferenceLong("NOTICOUNT",0,this);
                    BadgeUtils.clearBadge(this);
            }
    }
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />
于 2016-12-30T11:25:38.943 に答える