Posted at

Android 5.0 Lolipop以上で通知アイコンが白くなってしまう問題を解決する

More than 3 years have passed since last update.


はじめに

AndroidのSupport LibraryにあるNotificationCompatで何気なく通知を実装したら、Android 5.0 Lolipop以上で通知アイコンが白くなってしまったので、解決方法のメモです。


アイコンが白くなってしまう通知の例


ステータスバーを開いたときの通知

アイコンからでは何の通知か判断できない…。


PRIORITY_HIGHな通知

ステータスバーを開いた時と同じで、アイコンからでは何の通知か分からない…。


ステータスバーのアイコン

文字も無いので何か全くわからない…。


何故こうなるか

Android 5.0から、アイコンをマークで使用(アルファチャンネルのみ使用)するようになったため、背景が不透明な四角い画像をSmall Iconにセットすると、勝手に白くなってしまうようになりました。

要するに、こういう画像を、

こんな感じでセットすると、

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

builder.setSmallIcon(R.drawable.icon);
// アイコンの背景色
builder.setColor(ContextCompat.getColor(context, R.color.colorPrimary));

背景が透過してしないため、画像がアルファチャンネルのみになると、このようにアイコンがただの白い四角になってしまう、というわけです。


解決方法

画像の背景を透過したアイコンを作り、それをセットします。

この画像の場合は水色の背景の部分を透明にしました。


画像修正後

画像を修正したら、実際にセットしてみます。


Small Iconだけの場合

Small Iconだけの場合は、コードは変わらず、画像だけ差し替えれば大丈夫です。

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

builder.setSmallIcon(R.drawable.icon);
// アイコンの背景色
builder.setColor(ContextCompat.getColor(context, R.color.colorPrimary));

これを実行すると、背景が透過されているので、以下のようにドロイド君の形がきれいに表示されるようになります。


ステータスバーを開いたときの通知


PRIORITY_HIGHな通知


ステータスバーのアイコン


Small IconとLarge Iconをセットした場合

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);

builder.setSmallIcon(R.drawable.icon);
builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher));
// アイコンの背景色
builder.setColor(ContextCompat.getColor(context, R.color.colorPrimary));

これを実行すると、以下のようにLarge Iconの右下にSmall Iconが配置されて表示されます。

こちらもドロイド君の形がきれいに表示されてます。


ステータスバーを開いたときの通知


PRIORITY_HIGHな通知


ステータスバーのアイコン


通知のソース全体

上記のコードは画像のセット部分のみしか書いていませんでしたが、この通知の全体的なコードはこんな感じになります。

public static void showNotification(Context context, String contentTitle, String message, String summaryText, PendingIntent pendingIntent, boolean isLargeIcon) {

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setSmallIcon(R.drawable.icon);
if(isLargeIcon) {
builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher));
}
builder.setContentTitle(contentTitle);
builder.setContentText(message);
builder.setTicker(message);
builder.setAutoCancel(true);
builder.setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS);
builder.setContentIntent(pendingIntent);
builder.setPriority(NotificationCompat.PRIORITY_HIGH);
builder.setColor(ContextCompat.getColor(context, R.color.colorPrimary));

NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle(builder);
bigTextStyle.setBigContentTitle(contentTitle);
bigTextStyle.bigText(message);
bigTextStyle.setSummaryText(summaryText);

NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
managerCompat.notify(0, builder.build());
}


おわりに

通知の実装自体は特に変わりはなく、主に画像の修正をしただけでアイコンが白くなってしまう問題を解決できたので良かったです。

アイコンが白くなって困っている方がいましたら、ぜひ参考にしてみてください。

以上、おつかれさまでした。


参考


通知 | Android Developers

http://developer.android.com/intl/ja/design/patterns/notifications.html