カスタム通知を表示するアプリがあります。問題は、Android 5で実行しているときに通知バーの小さいアイコンが白く表示されることです。どうすればこれを修正できますか?
受け入れられた答えは(完全に)正しくありません。確かに、通知アイコンはカラーで表示されますが、ターゲットSDKをAndroid Lollipopより低く設定することで大きな欠点があります。
ターゲットのSDKを20に設定して白いアイコンの問題を解決すると、推奨されるように、アプリはAndroid Lollipopをターゲットにしません。つまり、Lollipop固有の機能を使用することはできません。
http://developer.Android.com/design/style/iconography.html をご覧ください。白いスタイルは、通知がAndroid Lollipopで表示される方法を示しています。
ロリポップでは、(白い)通知アイコンの後ろに表示される色を使用することをお勧めします - https://developer.Android.com/about/versions/Android-5.0-changes.html
だから、私はより良い解決策は、アプリにシルエットアイコンを追加し、デバイスがAndroid Lollipopを実行している場合にそれを使用することであると思います。
例えば:
Notification notification = new Notification.Builder(context)
.setAutoCancel(true)
.setContentTitle("My notification")
.setContentText("Look, white in Lollipop, else color!")
.setSmallIcon(getNotificationIcon())
.build();
return notification;
そして、getNotificationIconメソッドでは:
private int getNotificationIcon() {
boolean useWhiteIcon = (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.Lollipop);
return useWhiteIcon ? R.drawable.icon_silhouette : R.drawable.ic_launcher;
}
ユーザーDaniel Saidiに完全に同意します。 Color
をNotificationIcon
にするために、私はこの答えを書いています。
そのためには、Silhouette
のようにアイコンを作成し、Transparent
を追加したい場所にColors
というセクションを作成します。すなわち
あなたが使用してあなたの色を追加することができます
.setColor(your_color_resource_here)
注:setColor
はLollipop
でのみ利用可能ですので、OSVersion
をチェックする必要があります
if (Android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop) {
Notification notification = new Notification.Builder(context)
...
} else {
// Lollipop specific setColor method goes here.
Notification notification = new Notification.Builder(context)
...
notification.setColor(your_color)
...
}
ターゲットLollipop
としてSDK
を使用してこれを達成することもできます。
Googleデベロッパーコンソール通知ガイドの行 にあるNotificationIcon
に関するすべての説明。
推奨通知アイコンサイズ24x24dp
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
また、 通知アイコンのサイズ についてもこのリンクを参照してください - /。
これは、Androidが通知アイコンを表示するために使用するコードです。
// Android_frameworks_base/packages/SystemUI/src/com/Android/systemui/
// statusbar/BaseStatusBar.Java
if (entry.targetSdk >= Build.VERSION_CODES.Lollipop) {
entry.icon.setColorFilter(mContext.getResources().getColor(Android.R.color.white));
} else {
entry.icon.setColorFilter(null);
}
そのため、ターゲットのSDKのバージョンを<21
に設定する必要があります。アイコンの色は変わりません。これは醜い回避策ですが、期待どおりに機能します。 とにかく、Googleの デザインガイドラインに従うことをお勧めします : "通知アイコンは完全に白でなければなりません。"
これを実装する方法は次のとおりです。
Gradle/Android Studioを使用してアプリを構築している場合は、build.gradle
を使用してください。
defaultConfig {
targetSdkVersion 20
}
それ以外の場合(Eclipseなど)はAndroidManifest.xml
を使用してください。
<uses-sdk Android:minSdkVersion="..." Android:targetSdkVersion="20" />
通知アイコンが白くならないようにするには、「シルエット」アイコンを使用します。白地に透明な背景画像です。 Irfanview を使ってそれらを構築することができます。
IrfanView
で開き、F12を押して絵具を、必要ならば絵をきれいにします(不要な部分を取り除き、滑らかにして磨きます)Image / Decrease Color Depth
〜2(白黒写真用)Image / Negative
(黒地に白の写真の場合)Image / Resize/Resample
( "Resample"ではなくSizeメソッドの "Resize"を使用してください。File / Save as PNG
、Show option dialog
のチェック、Save Transparent Color
のチェック、Save
の順にクリックしてから、画像の黒い色をクリックして透明色を設定します。Androidはdrawable-xxhdpiの画像解像度(144 x 144)のみを使用しているようですので、作成したic_notification.png
ファイルを\AndroidStudio\Projects\...\app\src\main\res\drawable-xxhdpi
にコピーしてください。コードで.setSmallIcon(R.drawable.ic_notification)
を使用するか、またはDaniel Saidiが上記で提案したようにgetNotificationIcon()
を使用します。
Roman NurikのAndroid Asset Studio を使用することもできます。
もう1つの選択肢は、バージョン固有の描画可能(mipmap)ディレクトリを利用して、Lollipop以上に異なるグラフィックを提供することです。
私のアプリでは、 "v21"ディレクトリに透明なテキストのアイコンが含まれていますが、他のディレクトリには透明でないバージョン(Lollipopよりも古いバージョンのAndroid用)が含まれています。
これは次のようになります。
こうすれば、コード内のバージョン番号をチェックする必要がなくなります。
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_notification)
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
同様に、「icon」属性を使用すると、GCMペイロードで「ic_notification」(またはそれを呼び出すことを選択したもの)を参照できます。
https://developers.google.com/cloud-messaging/http-server-ref#notification-payload-support
Androidのデザインガイドラインによると、builder.setSmallIcon(R.drawable.some_notification_icon);
にはシルエットを使用する必要がありますが、それでも通知アイコンとしてカラフルなアイコンを表示したい場合は、Lollipopのトリックと上記のコードを使用してください。 largeIconは主要な通知アイコンとして機能します。また、largeIconの右下に表示されるので、smallIconのシルエットも指定する必要があります。
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop)
{
builder.setColor(context.getResources().getColor(R.color.red));
builder.setSmallIcon(R.drawable.some_notification_icon);
builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher));
}
そしてロリポップ以前はあなたのビルダーで.setSmallIcon(R.mipmap.ic_launcher)
だけを使います。
今アンドロイドスタジオはプラグインImage Assetを提供しています、それはすべての必要なdrawbaleフォルダーにアイコンを生成するでしょう
Image Asset Studioを使用すると、さまざまな種類のアイコンをさまざまな密度で作成でき、プロジェクトのどこに配置するかを正確に確認できます。プレビューペインに結果を表示しながら、アイコンを調整したり背景を追加したりするためのツールがすべて含まれているので、意図したとおりに表示されます。これらのツールは、アイコンデザインとインポートプロセスを劇的に合理化することができます。
New> Image AssetオプションをクリックしてImage Assetにアクセスできます。ウィンドウは次のように表示されます。 -
私は同じ問題に直面していました、そしてそれは私のアプリ通知アイコンがフラットではなかったためでした。 Android版のLollipopやLollipop以下でも、アプリの通知アイコンはフラットになるはずです。影付きのアイコンは使用しないでください。
以下は、すべてのAndroidバージョンで完全にうまく機能したコードです。
private void sendNotification(String msg) {
NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent(this, CheckOutActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
this).setSmallIcon(R.drawable.ic_notification)
.setContentTitle(getString(R.string.app_name))
.setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
.setContentText(msg).setLights(Color.GREEN, 300, 300)
.setVibrate(new long[] { 100, 250 })
.setDefaults(Notification.DEFAULT_SOUND).setAutoCancel(true);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(new Random().nextInt(), mBuilder.build());
}
間違ったアイコン
右のアイコン
アルファチャンネル は、Androidが通知アイコンに使用する画像の唯一のデータです。
alpha == 1
:ピクセルは白を示すalpha == 0
:ピクセルはあなたがNotification.Builder#setColor(int)
で選んだ色として表示されますこれは https://developer.Android.com/about/versions/Android-5.0-changes.htmlに記載されています :
システムは、アクションアイコンおよびメインの通知アイコンにあるすべての非アルファチャンネルを無視します。あなたはこれらのアイコンがアルファのみであると仮定するべきです。
ほとんどすべての 内蔵ドロアブル これに適したアルファイメージと思われるので、次のように使用します。
Notification.Builder.setColor(Color.RED)
.setSmallIcon(Android.R.drawable.star_on)
しかし、私はまだ APIドキュメントを探しています それは正式にそれを確認しています。
Android 22でテスト済み。
以下に説明するように、通知は グレースケール です。他の人が書いたものにもかかわらず、それらは白黒ではありません。あなたはおそらくネットワーク強度バーのように、複数の色合いのアイコンを見たことがあります。
API 21(Lollipop 5.0)より前のバージョンでは、カラーアイコンは機能します。アプリケーションに強制的にAPI 20をターゲットにさせることもできますが、それはアプリケーションで利用できる機能を制限するため、お勧めできません。実行中のAPIレベルをテストして、カラーアイコンまたはグレースケールアイコンを適切に設定することもできますが、これはあまり意味がありません。ほとんどの場合、グレースケールのアイコンを使用するのが最善です。
画像にはRGBA(赤/緑/青/アルファ)の4つのチャンネルがあります。通知アイコンの場合、AndroidはR、G、およびBチャネルを無視します。重要な唯一のチャンネルはアルファで、不透明度とも呼ばれます。描画色のアルファ値を制御できるエディタを使ってアイコンをデザインします。
アルファ値がどのようにグレースケール画像を生成するか:
setColor
でそれを変更する:
NotificationCompat.Builder.setColor(int argb)
を呼び出します。 Notification.color
のドキュメントから:
この通知を表示するときに標準のStyleテンプレートによって適用されるアクセントカラー(Colorの定数のようなARGB整数)。現在のテンプレートデザインは、この色のフィールドの上にアイコンイメージ(白でステンシル印刷されています)をオーバーレイすることによって、カラフルなヘッダーイメージを作成します。アルファ成分は無視されます。
SetColorを使った私のテストでは、Alphaコンポーネントは not 無視されることがわかりました。代わりに、彼らはまだグレースケールを提供します。より高いアルファ値はピクセルを白に変えます。より低いアルファ値は通知領域の背景色(私のデバイスでは黒)、またはプルダウン通知で指定された色にピクセルを向けます。 (他の人がわずかに異なる動作を報告したようですので、注意してください!)
manifest.xmlからAndroid:targetSdkVersion="21"
を削除します。それが動作します!そしてこれからあなたのapkにまったく問題があることはありませんそれはただのトリック私はこれを適用し、私は通知にカラフルなアイコンを見つけました
Android Lollipopのリリース後のリリースAndroidは、通知バーに通知アイコンを表示するためのガイドラインを変更しました。公式文書には「色を含むアセットの更新または削除。システムはアクションアイコンとメイン通知アイコンにあるすべての非アルファチャンネルを無視します。これらのアイコンはアルファのみになると想定してください。システムは通知アイコンを白で描画します。素人の言葉では、「表示したくない画像のすべての部分を透明なピクセルに変換する」ということになります。すべての色と透明でないピクセルは白で表示されます」
あなたはここでスクリーンショットでこれを詳細にする方法を見ることができます https://blog.clevertap.com/fixing-notification-icon-for-Android-Lollipop-and-above/
それが役立つことを願っています
単色透明PNG画像を読み込む必要があります。だからあなたは小さなアイコンのアイコンの色を設定することができます。さもなければそれはMOTOのようないくつかのデバイスで白く表示されます
GoogleFireBaseMessagingを使用している場合は、「通知」ペイロードに「アイコンID」を設定できます(白いバーのアイコンの問題を解決するのに役立ちます)。
{
"to":"<fb_id>",
"priority" : "high",
"notification" :
{
"title" : "title",
"body" : "body" ,
"sound" : "default",
"icon" : "ic_notification"
}
}
ic_notification をR.drawableからのあなた自身のIDに設定します。
参考:アイコンが表示されない場合は、ローカルまたはリモートの通知設定に正しいアイコン名が含まれていることを確認してください。
'largeIcon' => 'ic_launcher',
'smallIcon' => 'ic_launcher' // defaults to ic_launcher,
私はまたこれであまりにも多くの問題に直面しました、しかし私はこの問題のために異なった解決策を見つけました。
注:この解決策はPhonegap cordovaユーザーのためのものです
<preference name="Android-targetSdkVersion" value="20"/>
Android-targetSdkVersionの値を21未満に設定する必要があります。したがって、この値を設定した後、通知アイコンの画像はAndroid 6(Marshmallow)まで表示され、Android 7(Nougat)では機能しません。この解決策は私のために働いた。
<preference name="StatusBarStyle" value="lightcontent" />
しかし、この解決策はあなたのアプリが開かれているときにのみうまくいくでしょう。だから、私はこの解決策が最善の解決策ではないと思いますが、それは多くのユーザーのために働いた。
そして、私は上記の解決策の1つがあなたの問題のためにうまくいくと確信しています。
ドキュメントによると、通知アイコンは Android 3.0(API Level 11) :から白でなければなりません。
https://developer.Android.com/guide/practices/ui_guidelines/icon_design_status_bar
「ステータスバーのアイコンは、透明な背景上の白いピクセルで構成されています。必要に応じて、滑らかなエッジと内部のテクスチャにはアルファブレンディングが使用されます。」
API 21について話すのは遅すぎると思いますが、簡単な方法を見つけました。
「カスタム通知(カスタムレイアウト)」を使用すると、
RemoteView
setImageViewResource(int viewId, int srcId);
そして
setImageViewUri(int viewId, Uri uri);
それらの画像をLollipop(API 21)で白くします。
しかし使うとき
setImageViewBitmap(int viewId, Bitmap bitmap);
画像がホワイトマスクにならない