2011年8月6日土曜日

Notificationのステータスバーアイコンを非表示にする方法

通知領域に通知は表示したいけどステータスバーには表示させたくない、通知をショートカットの用途として使用する場合の実装です。
Quick Settings や Skip Memo などでオプションで選択できますね。
UnKeyLockerで使用するためにその方法を探していたのですが、そのものズバリを説明しているサイトが見つけられなかったので書きます。


実際には見えなくなるだけでアイコン1つ分の領域を使用します。
Notificationのiconとwhenを以下のように設定します。
// 見えないアイコンをセット
notification.icon = R.drawable.ico_invisible;
// アイコンを右に寄せる
if (android.os.Build.VERSION.SDK_INT < 9)
 notification.when = Long.MAX_VALUE; // v2.3 未満
else
 notification.when = Long.MIN_VALUE; // v2.3 以上

ico_invisibleは単色の透過pngを使用しています。
このアイコンよりも右側にアイコンが表示されると隙間が開いて見栄えが悪くなってしまうためnotification.whenを指定して右に寄せます。
OSのバージョンが2.3未満と2.3以上でwhenによるソート順が逆になっているようなのでandroid.os.Build.VERSION.SDK_INTでSDKのバージョンを調べて条件分岐しています。
デフォルトのcontentViewを使用すると通知領域のアイコン非表示&whenの指定がでたらめなのでカスタムviewを使用したほうが良いと思います。

こんな感じ
Notification notification = new Notification()
Intent intent = new Intent(context, 起動するクラス);
intent.putExtra(FLAG, ””);
PendingIntent i = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
notification.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;

RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.notification_layout);
ico = R.drawable.ico_unlocked_black;
contentView.setTextColor(R.id.title, Color.BLACK);
contentView.setTextColor(R.id.text, Color.BLACK);

contentView.setImageViewResource(R.id.image, ico); // 通知エリアに表示するアイコン
contentView.setTextViewText(R.id.title, context.getString(R.string.app_name));
contentView.setTextViewText(R.id.text, context.getString(R.string.toEnable));

notification.contentView = contentView;
notification.contentIntent = i;

// 見えないアイコンをセット
notification.icon = R.drawable.ico_invisible;
// アイコンを右に寄せる
if (android.os.Build.VERSION.SDK_INT < 9)
 notification.when = Long.MAX_VALUE; // v2.3 未満
else
 notification.when = Long.MIN_VALUE; // v2.3 以上

mgr.notify(NOTIFI_ID, notification);
間違いなどあればご指摘ください。

1 件のコメント: