カスタム通知を表示するアプリがあります。問題は、Android 5で実行すると、通知バーの小さなアイコンが白で表示されることです。どうすれば修正できますか?
カスタム通知を表示するアプリがあります。問題は、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;
}
ctrl+f
て入力notification
しても何も見つかりません...
ユーザーDaniel Danielに完全に同意します。注文で持っている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 Developer Console Notification Guide LinesでのNotificationIcon
指定に関するすべての指示。
優先通知アイコンのサイズ24x24dp
mdpi @ 24.00dp = 24.00px
hdpi @ 24.00dp = 36.00px
xhdpi @ 24.00dp = 48.00px
詳細については、このリンクの通知アイコンのサイズも参照してください。
setColor
Kitkat(API 19)とIceCreamSandwich(API 15)でテストしましたが、どちらの場合も色は無視されましたが、クラッシュしませんでした。では、OSのバージョンの確認を安全に省略できますか?
これは、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
144 x 144に(「リサンプル」ではなくサイズ方式「サイズ変更」を使用します。それ以外の場合、画像はピクセルあたり24カラービット(24 BPP)に再度増加します。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)
コードで使用するか、またはgetNotificationIcon()
上記のDaniel Saidiの提案に従って使用します。
Roman NurikのAndroid Asset Studioを使用することもできます。
別のオプションは、バージョン固有のドローアブル(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
setColor
(追加のコードを使用せずに)を設定できますか?
Androidのデザインガイドラインによると、シルエットを使用する必要がありbuilder.setSmallIcon(R.drawable.some_notification_icon);
ますが、通知アイコンとしてカラフルなアイコンを表示したい場合は、ここにロリポップと上記のコードのトリックがあります。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)
はあなたのビルダーでのみ使用します。
現在、Android StudioはプラグインのImage Assetを提供しています 。これにより、必要なすべてのdrawbaleフォルダーにアイコンが生成されます
Image Asset Studioを使用すると、さまざまな種類のアイコンをさまざまな密度で作成し、プロジェクトのどこに配置するかを正確に示すことができます。アイコンを調整したり、背景を追加したりするためのツールがすべて含まれ、プレビューペインに結果が表示されるため、意図したとおりに表示されます。これらのツールは、アイコンのデザインとインポートプロセスを劇的に合理化できます。
イメージアセットにアクセスするには 、[新規]をクリックし、[イメージアセット]オプションをクリックすると、次のようなウィンドウが表示されます。
私は同じ問題に直面していました、そしてそれは私のアプリ通知アイコンが平らではなかったためでした。Androidバージョンのロリポップまたはロリポップの下でも、アプリの通知アイコンはフラットである必要があります。影付きのアイコンなどは使用しないでください。
以下は、すべての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でテスト済み。
setColor
Kitkat(API 19)とIceCreamSandwich(API 15)でテストしましたが、どちらの場合も色は無視されましたが、クラッシュしませんでした。では、OSのバージョンの確認を安全に省略できますか?
android:targetSdkVersion="21"
manifest.xmlからを削除します。それが動作します!これからあなたのAPKに問題はありませんそれは私がこれを適用するトリックであり、私は通知にカラフルなアイコンを見つけました
通知は、以下で説明するようにグレースケールです。他の人が書いたものにもかかわらず、彼らは白黒ではありません。ネットワーク強度バーのように、複数の色合いのアイコンを見たことがあるでしょう。
API 21(Lollipop 5.0)より前のバージョンでは、カラーアイコンが機能します。アプリケーションに強制的にAPI 20を強制することもできますが、これによりアプリケーションで使用できる機能が制限されるため、お勧めしません。実行中のAPIレベルをテストして、カラーアイコンまたはグレースケールアイコンを適切に設定できますが、これは価値がありません。ほとんどの場合、グレースケールアイコンを使用するのが最適です。
画像には4つのチャネル、RGBA(赤/緑/青/アルファ)があります。通知アイコンの場合、AndroidはR、G、Bチャネルを無視します。カウントされる唯一のチャネルは、不透明度とも呼ばれるアルファです。描画色のアルファ値を制御できるエディターでアイコンをデザインします。
アルファ値がグレースケール画像を生成する方法:
それを次のように変更しsetColor
ます:
を呼び出しNotificationCompat.Builder.setColor(int argb)
ます。のドキュメントからNotification.color
:
この通知を表示するときに標準のスタイルテンプレートによって適用されるアクセントカラー(Colorの定数のようなARGB整数)。現在のテンプレートデザインは、この色のフィールドの上にアイコン画像(白でステンシル)をオーバーレイすることにより、カラフルなヘッダー画像を作成します。アルファコンポーネントは無視されます。
setColorを使用したテストでは、Alphaコンポーネントが無視されないことが示されています。代わりに、それらはまだグレースケールを提供します。高いアルファ値はピクセルを白くします。アルファ値を下げると、通知領域でピクセルが背景色(デバイスでは黒)、またはプルダウン通知で指定された色になります。(他の人がわずかに異なる動作を報告しているようですので、注意してください!)
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に設定します。
私もこれで多くの問題に直面しましたが、インターネット全体を検索した後、この問題のさまざまな解決策を見つけました。すべての解決策をまとめて説明しましょう:
注:このソリューションは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レベル11)以降、通知アイコンは白である必要があります。
https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar
「ステータスバーアイコンは、透明な背景の白いピクセルだけで構成されており、アルファブレンディングは、必要に応じて滑らかなエッジと内部テクスチャに使用されます。」
これら2つをアプリグラドルで混ぜます
defaultConfig {
applicationId "com.example.abdulwahidvi.notificationproblem"
minSdkVersion 16
//This is the version that was added by project by default
targetSdkVersion 26 <------ default
// Changed it to version 20
targetSdkVersion 20 <------ mine
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
android:targetSdkVersion="20"
<である必要があります21
。