サムスンギャラクシーノート2 Androidのバージョン4.1.2
私はこの質問が以前にされたと答えができなかったことを知っています
Androidのアプリケーションランチャーアイコンの上にバルーンカウンターを表示する方法
それにもかかわらず、昨日私はFacebookのアプリを更新し、それは未読メッセージのプライベートメッセージのカウンターを表示し始めました。 Facebookアプリはどうしてできるのでしょうか、それとも私のアプリにはできません。
サムスンギャラクシーノート2 Androidのバージョン4.1.2
Android(カスタムランチャーとタッチインタフェースのない "Vanilla" Android) できません プログラムがコンパイルされると.apk
にしっかりと封印されているので、アプリケーションアイコンを変更できます。標準のAPIを使用してプログラム的にそれを「描画可能」に変更する方法はありません。あなたは、アイコンの代わりにウィジェットを使用することによってあなたの目的を達成するかもしれません。ウィジェットはカスタマイズ可能です。これを読んでください: 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はオープンなオペレーティングシステムであり、必要なことはすべてできるので、バッジ番号を追加する唯一の方法は、サードパーティのアプリやカスタムランチャーを使用するか、フロントエンドタッチを使用することです。インターフェース:Samsung TouchWizまたはSony Xperiaのインターフェース。他の回答ではこの機能を使用しているので、スタックオーバーフローでこれを検索できます。 ここに 。しかし、もう一度繰り返します。このための標準的なAPIは no あり、それをbad慣習と言いたいのです。アプリのアイコン通知バッジはiOSのパターンなので、とにかくAndroidアプリでは使用しないでください。 Andrioidにこれらの目的のためにステータスバー通知があります: http://developer.Android.com/guide/topics/ui/notifiers/notifications.html それで、Facebookか他の誰かがこれを使うなら - それはそうではありません私たちが考慮すべき共通のパターンや傾向。とにかくあなたがとにかく主張して、ホームスクリーンウィジェットを使いたくないならば、ここで見てください、:
AndroidのアプリアイコンにFacebookはどのようにバッジ番号を追加しますか?
ご覧のとおり、これは実際のFacebookアプリではなく、TouchWizです。 Vanilla Androidでは、これはNova Launcher /で実現できます http://forums.androidcentral.com/Android-applications/199709-how-guide-global-badge-notifications.html したがって、アイコンバッジがどこかに表示されます。それがサードパーティのランチャーかタッチインターフェース(フロントエンドラッパー)のどちらかであることを確認してください。いつかGoogleがこの機能を標準のAndroid APIに追加する可能性があります。
それはサムスン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;
}
ShortcutBadger は、デバイスブランドと現在のランチャーの上に抽象化レイヤを追加して素晴らしい結果を提供するライブラリです。 LG、ソニー、サムスン、HTCおよび他のカスタムランチャーで動作します。
Pure Androidデバイスのデスクトップにバッジカウントを表示する方法さえあります。
アプリケーションアイコンのバッジカウントを更新するのは、呼び出すのと同じくらい簡単です。
int badgeCount = 1;
ShortcutBadger.applyCount(context, badgeCount);
それはあなたがそのふるまいをテストすることを可能にするデモアプリケーションを含みます。
私はこれがソニーのデバイスに対してどのように行われるのかを考え出しました。
ブログしました ここ 。私はこれについて別のSO質問も投稿しました ここ 。
SonyデバイスはBadgeReciever
という名前のクラスを使用します。
マニフェストファイルで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);
私は答えを短くするためにこれをどのように見つけたかについての詳細を除外したが、それは全てブログで入手可能である。誰かにとって興味深い読み物かもしれません。
これは、通知ランチャーアイコンにバッジを表示するためのサンプルおよび最良の方法です。
アプリケーションにこのクラスを追加
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" />