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


207

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


ラーフル・シャルマとbasiamは、ここでより良い答えを持っている- stackoverflow.com/questions/30795431/...を
Rivuチャクラ

、ない5. Androidの6で実行しているとき、それは私に何が起こる
ハイメ・モントーヤ

確かに、それは質問のAndroid 5の時点でAndroidの6と7にも勿論の、アンドロイド5+で発生は、Android 5で導入された最新バージョンと、この問題を引き起こして機能でした
アレハンドロ・カサノバ

APIレベル21(Android 5.0)、APIレベル22(Android 5.1)、APIレベル23(Android 6.0)などと言ったほうが正確だと思います。「Android 5」という用語は、Android 5.0について話している可能性があるため、あいまいですまたはAndroid 5.1、および通知をテストしているとき、およびアイコンがAPIレベル22で表示される方法。APIレベル23では、動作が異なることに気付きました。
Jaime Montoya

回答:


269

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

34
どのようにシルエットを生成しますか?私はフォトショップスキルのない開発者です。オンラインツールを使用して背景を透明にしても、白いアイコンが表示されます。
Chaitanya

6
@Chaitanya GIMPを使用する:)
ByteHamster

4
このソリューションは、androidビルドプロセスが完全に適切なPNGを変更して圧縮し、アルファチャネルを削除する理由には答えません。
philk 2016年

6
developer.android.com/design/style/iconography.htmlmaterial.google.com/style/icons.htmlにつながり、そのページを押しctrl+fて入力notificationしても何も見つかりません...
user25

4
コードapplayプラットフォームバージョン修飾子からドローアブルフォルダーをチェックする代わりに-ドローアブル/ドローアブル-v21と適切なアイコンを配置
Igor Wojda

72

ユーザー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

詳細については、このリンクの通知アイコンのサイズも参照してください。


4
これは、notification.setColor(your_color_resource_here)
TejaDroid

1
だから私はこれを試しました、そして通知シェードをプルダウンすると通知アイコンの背景が色付きになります。しかし、トレイ自体では、それはまだ白いアイコンです
Stealth Rabbi

1
この解決策は正しいです。通知のアイコンが透明で背面にあります。シルエットによって、アイコンは黒である必要はありません。アイコンは色を持つことができます。Android Lが表示色を白に変換するだけです。以前のAndroidバージョンはアイコンをそのまま表示します
Lakshay

下のロリポップにic_launcherアイコンを表示するsetColorを追加していますが、6.0では白い四角のアイコンを表示してください
Harsha

setColorKitkat(API 19)とIceCreamSandwich(API 15)でテストしましたが、どちらの場合も色無視されましたが、クラッシュしませんでした。では、OSのバージョンの確認を安全に省略できますか?
マリア

47

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

回避策はありますか?それとも、他のアイコンを適切に表示するにはどうすればよいですか?
Alejandro Casanova

Androidのソースコードを読んだ後、回避策を見つけたので、私の回答を編集しました。
ByteHamster、2015

4
あなたの助けに感謝しますが、いくつかの「文脈」を提供してください。どこで行う必要がありますか?「エントリー」とは?
Alejandro Casanova

このコードは、回避策の見つけ方を示すためだけにAOSPから取られました:)実装方法に関する簡単な説明を追加しました。
ByteHamster、2015

これは実際に機能します。Googleがこれを行った理由は何でしょうか?これはバグですか、それとも機能ですか?
m02ph3u5 2015

24

通知アイコンが白くならないようにするには、アイコンに「シルエット」アイコンを使用します。白地に透明な背景画像。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を使用することもできます。


photoshopを使用してアイコンを変換しようとしましたが、失敗しましたが、irfanviewのファンである私は、それを見てすぐに試してみました。ありがとう!
Bruce

15

別のオプションは、バージョン固有のドローアブル(mipmap)ディレクトリを利用して、Lollipop以降に異なるグラフィックスを提供することです。

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

ファイルシステム

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

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


3
これは機能し、ほとんどのAndroid方式のソリューションのように見えます。
Sergey Galin

Androidがバージョンがロリポップの場合、フォルダーmipmap-21からアイコンを選択し、ロリポップ未満の場合は、ドローアブルから選択するということですか?
Lakshay、2016年

@Ian、ディレクトリアプローチはAndroidバージョンごとのリソースに適していますが、どのようにsetColor(追加のコードを使用せずに)を設定できますか?
ダニエル

@Danielの色は、バージョン固有のディレクトリ(「values」や「values-v21」など)に置くこともできます。
イアン、

12

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)はあなたのビルダーでのみ使用します。


11

現在、Android StudioはプラグインのImage Assetを提供しています 。これにより、必要なすべてのdrawbaleフォルダーにアイコンが生成されます

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

イメージアセットにアクセスするには 、[新規]をクリックし、[イメージアセット]オプションをクリックすると、次のようなウィンドウが表示されます。

ここに画像の説明を入力してください

ここに画像の説明を入力してください


8

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

間違ったアイコン
ここに画像の説明を入力してください

右のアイコン

ここに画像の説明を入力してください


1
ここで問題を正確にどこで修正していますか?
IgorGanapolsky 2016年

右のアイコンを作成する方法。オンラインで生成することは可能ですか?任意のツール??
Jiks


7

アルファチャネルは、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でテスト済み。


setColorKitkat(API 19)とIceCreamSandwich(API 15)でテストしましたが、どちらの場合も色無視されましたが、クラッシュしませんでした。では、OSのバージョンの確認を安全に省略できますか?
マリア

@JohnLeeクラッシュする可能性はないと思います。考慮しないと、見栄えが悪くなるだけです:-)
Ciro Santilli郝海东冠状病六四事件法轮功

3

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


9
システムで「トリック」をするのは全く悪い考えです!解決策ではありません!
sud007 2016

3

通知は、以下で説明するようにグレースケールです。他の人が書いたものにもかかわらず、彼らは白黒ではありません。ネットワーク強度バーのように、複数の色合いのアイコンを見たことがあるでしょう。

API 21(Lollipop 5.0)より前のバージョンでは、カラーアイコンが機能します。アプリケーションに強制的にAPI 20を強制することもできますが、これによりアプリケーションで使用できる機能が制限されるため、お勧めしません。実行中のAPIレベルをテストして、カラーアイコンまたはグレースケールアイコンを適切に設定できますが、これは価値がありません。ほとんどの場合、グレースケールアイコンを使用するのが最適です。

画像には4つのチャネル、RGBA(赤/緑/青/アルファ)があります。通知アイコンの場合、AndroidはR、G、Bチャネルを無視します。カウントされる唯一のチャネルは、不透明度とも呼ばれるアルファです。描画色のアルファ値を制御できるエディターでアイコンをデザインします。

アルファ値がグレースケール画像を生成する方法:

  • アルファ= 0(透明)—これらのピクセルは透明で、背景色を示します。
  • アルファ= 255(不透明)—これらのピクセルは白です。
  • アルファ= 1 ... 254 —これらのピクセルは期待どおりのものであり、透明と白の間の色合いを提供します。

それを次のように変更しsetColorます:

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

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

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


2

android Lollipopリリースの投稿androidは、通知バーに通知アイコンを表示するためのガイドラインを変更しました。公式ドキュメントには、「色を含むアセットを更新または削除します。システムは、アクションアイコンとメイン通知アイコンのすべての非アルファチャネルを無視します。これらのアイコンはアルファのみであると想定する必要があります。システムは、通知アイコンを白で描画します。濃い灰色のアクションアイコン。」さて、それが普通の言葉で意味することは、「表示したくないイメージのすべての部分を透明なピクセルに変換することです。すべての色と透明でないピクセルは白で表示されます」

こちらのスクリーンショットでこれを行う方法の詳細を見ることができます https://blog.clevertap.com/fixing-notification-icon-for-android-lollipop-and-above/

それが役に立てば幸い


2

単色の透過PNG画像をインポートする必要があります。したがって、小さいアイコンのアイコンの色を設定できます。それ以外の場合、MOTOなどの一部のデバイスでは白で表示されます


1

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

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

ic_notificationR.drawableからの独自のIDに設定します。


そのアイコンをどこに配置しましたか?私が得るすべては私のアプリのアイコンであり、私が見つけるすべてのR.drawableファイルはバイナリークラスファイルです。
しんぞう2017

@kuhaku彼は「drawable」フォルダーにあるic_launcher.pngファイルを参照しています。
ジョンソン

0

私もこれで多くの問題に直面しましたが、インターネット全体を検索した後、この問題のさまざまな解決策を見つけました。すべての解決策をまとめて説明しましょう:

注:このソリューションは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

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

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

0

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

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

RemoteView

setImageViewResource(int viewId, int srcId);

そして

setImageViewUri(int viewId, Uri uri); 

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

しかし、使用するとき

setImageViewBitmap(int viewId, Bitmap bitmap);

画像が白くならない!



-3

これら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"
}

-38

android:targetSdkVersion="20"<である必要があります21


1
このソリューションには従わないでください。動作する可能性がありますが、新しいバージョンのAndroidの互換モードでアプリを実行することを犠牲にしてください。
king_below_my_lord
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.