web-dev-qa-db-ja.com

Android 5 Lollipopで通知バーのアイコンが白くなる

カスタム通知を表示するアプリがあります。問題は、Android 5で実行しているときに通知バーの小さいアイコンが白く表示されることです。どうすればこれを修正できますか?

203

受け入れられた答えは(完全に)正しくありません。確かに、通知アイコンはカラーで表示されますが、ターゲット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;
}
266
Daniel Saidi

ユーザーDaniel Saidiに完全に同意します。 ColorNotificationIconにするために、私はこの答えを書いています。

そのためには、Silhouetteのようにアイコンを作成し、Transparentを追加したい場所にColorsというセクションを作成します。すなわち

enter image description here

あなたが使用してあなたの色を追加することができます

.setColor(your_color_resource_here)

注:setColorLollipopでのみ利用可能ですので、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

また、 通知アイコンのサイズ についてもこのリンクを参照してください - /。

69
Jaydipsinh Zala

これは、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" />
47
ByteHamster

通知アイコンが白くならないようにするには、「シルエット」アイコンを使用します。白地に透明な背景画像です。 Irfanview を使ってそれらを構築することができます。

  • 絵を選び、IrfanViewで開き、F12を押して絵具を、必要ならば絵をきれいにします(不要な部分を取り除き、滑らかにして磨きます)
  • Image / Decrease Color Depth〜2(白黒写真用)
  • Image / Negative(黒地に白の写真の場合)
  • 144 x 144へのImage / Resize/Resample( "Resample"ではなくSizeメソッドの "Resize"を使用してください。
  • File / Save as PNGShow 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 を使用することもできます。

23

もう1つの選択肢は、バージョン固有の描画可能(mipmap)ディレクトリを利用して、Lollipop以上に異なるグラフィックを提供することです。

私のアプリでは、 "v21"ディレクトリに透明なテキストのアイコンが含まれていますが、他のディレクトリには透明でないバージョン(Lollipopよりも古いバージョンのAndroid用)が含まれています。

File system

これは次のようになります。

Android Studio

こうすれば、コード内のバージョン番号をチェックする必要がなくなります。

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

14
Ian

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)だけを使います。

12
Muhammad Babar

今アンドロイドスタジオはプラグインImage Assetを提供しています、それはすべての必要なdrawbaleフォルダーにアイコンを生成するでしょう

Image Asset St​​udioを使用すると、さまざまな種類のアイコンをさまざまな密度で作成でき、プロジェクトのどこに配置するかを正確に確認できます。プレビューペインに結果を表示しながら、アイコンを調整したり背景を追加したりするためのツールがすべて含まれているので、意図したとおりに表示されます。これらのツールは、アイコンデザインとインポートプロセスを劇的に合理化することができます。

New> Image AssetオプションをクリックしてImage Assetにアクセスできます。ウィンドウは次のように表示されます。 -

enter image description here

enter image description here

10
Nishchal

私は同じ問題に直面していました、そしてそれは私のアプリ通知アイコンがフラットではなかったためでした。 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());
}

間違ったアイコン
enter image description here

右のアイコン

enter image description here

8
Nauman Zubair

アルファチャンネル は、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チャネルを無視します。重要な唯一のチャンネルはアルファで、不透明度とも呼ばれます。描画色のアルファ値を制御できるエディタを使ってアイコンをデザインします。

アルファ値がどのようにグレースケール画像を生成するか:

  • アルファ= 0(透明) - これらのピクセルは透明で、背景色を示します。
  • アルファ= 255(不透明) - これらのピクセルは白です。
  • Alpha = 1 ... 254 - これらのピクセルはまさにあなたが期待するもので、透明と白の間の色合いを提供します。

setColorでそれを変更する:

  • NotificationCompat.Builder.setColor(int argb)を呼び出します。 Notification.colorのドキュメントから:

    この通知を表示するときに標準のStyleテンプレートによって適用されるアクセントカラー(Colorの定数のようなARGB整数)。現在のテンプレートデザインは、この色のフィールドの上にアイコンイメージ(白でステンシル印刷されています)をオーバーレイすることによって、カラフルなヘッダーイメージを作成します。アルファ成分は無視されます。

    SetColorを使った私のテストでは、Alphaコンポーネントは not 無視されることがわかりました。代わりに、彼らはまだグレースケールを提供します。より高いアルファ値はピクセルを白に変えます。より低いアルファ値は通知領域の背景色(私のデバイスでは黒)、またはプルダウン通知で指定された色にピクセルを向けます。 (他の人がわずかに異なる動作を報告したようですので、注意してください!)

3
Jeremy Frank

manifest.xmlからAndroid:targetSdkVersion="21"を削除します。それが動作します!そしてこれからあなたのapkにまったく問題があることはありませんそれはただのトリック私はこれを適用し、私は通知にカラフルなアイコンを見つけました

3
Bhanu Sharma

Android Lollipopのリリース後のリリースAndroidは、通知バーに通知アイコンを表示するためのガイドラインを変更しました。公式文書には「色を含むアセットの更新または削除。システムはアクションアイコンとメイン通知アイコンにあるすべての非アルファチャンネルを無視します。これらのアイコンはアルファのみになると想定してください。システムは通知アイコンを白で描画します。素人の言葉では、「表示したくない画像のすべての部分を透明なピクセルに変換する」ということになります。すべての色と透明でないピクセルは白で表示されます」

あなたはここでスクリーンショットでこれを詳細にする方法を見ることができます https://blog.clevertap.com/fixing-notification-icon-for-Android-Lollipop-and-above/

それが役立つことを願っています

2
Rohit Khanna

単色透明PNG画像を読み込む必要があります。だからあなたは小さなアイコンのアイコンの色を設定することができます。さもなければそれはMOTOのようないくつかのデバイスで白く表示されます

2
abhi.nalwade

GoogleFireBaseMessagingを使用している場合は、「通知」ペイロードに「アイコンID」を設定できます(白いバーのアイコンの問題を解決するのに役立ちます)。

{
    "to":"<fb_id>",
    "priority" : "high",
    "notification" : 
    {
        "title" : "title",
        "body" : "body" ,
        "sound" : "default",
        "icon" : "ic_notification"
    }
}

ic_notification をR.drawableからのあなた自身のIDに設定します。

1
Maxim Firsoff

参考:アイコンが表示されない場合は、ローカルまたはリモートの通知設定に正しいアイコン名が含まれていることを確認してください。

'largeIcon' => 'ic_launcher',
'smallIcon' => 'ic_launcher' // defaults to ic_launcher, 
0
phil

私はまたこれであまりにも多くの問題に直面しました、しかし私はこの問題のために異なった解決策を見つけました。

注:この解決策はPhonegap cordovaユーザーのためのものです

<preference name="Android-targetSdkVersion" value="20"/>

Android-targetSdkVersionの値を21未満に設定する必要があります。したがって、この値を設定した後、通知アイコンの画像はAndroid 6(Marshmallow)まで表示され、Android 7(Nougat)では機能しません。この解決策は私のために働いた。

  1. 設定ファイルのstatusbarStyleを変更してください。

<preference name="StatusBarStyle" value="lightcontent" />

しかし、この解決策はあなたのアプリが開かれているときにのみうまくいくでしょう。だから、私はこの解決策が最善の解決策ではないと思いますが、それは多くのユーザーのために働いた。

  1. アイコンを透明にします。この解決策は多くの人に役立ちました。実際のところ、ネイティブアプリケーションの開発では、3つの画像を提供する必要があります。(a)アプリアイコン(b)通知アイコン(c)ステータスバーアイコン画像。ただし、ハイブリッドモバイルアプリケーション開発の場合は、そうする。だからあなたのアイコンを透明にするとこの解決策はあなたの問題を解決します。

そして、私は上記の解決策の1つがあなたの問題のためにうまくいくと確信しています。

0
Rinku kumar

ドキュメントによると、通知アイコンは Android 3.0(API Level 11) :から白でなければなりません。

https://developer.Android.com/guide/practices/ui_guidelines/icon_design_status_bar

「ステータスバーのアイコンは、透明な背景上の白いピクセルで構成されています。必要に応じて、滑らかなエッジと内部のテクスチャにはアルファブレンディングが使用されます。」

0
Laurent

API 21について話すのは遅すぎると思いますが、簡単な方法を見つけました。

「カスタム通知(カスタムレイアウト)」を使用すると、

RemoteView

setImageViewResource(int viewId, int srcId);

そして

setImageViewUri(int viewId, Uri uri); 

それらの画像をLollipop(API 21)で白くします。

しかし使うとき

setImageViewBitmap(int viewId, Bitmap bitmap);

画像がホワイトマスクにならない

0
Cake Lime