Androidプッシュ通知:通知にアイコンが表示されず、代わりに白い四角が表示される


179

アプリで通知が生成されますが、その通知に設定したアイコンが表示されません。代わりに、白い四角が表示されます。

アイコンのpngのサイズを変更してみました(寸法720x720、66x66、44x44、22x22)。不思議なことに、より小さい寸法を使用すると、白い四角が小さくなります。

私はこの問題と通知を生成する正しい方法をグーグルで調べました、そして私が読んだものから私のコードは正しいはずです。悲しいことに、物事は本来あるべきものではありません。

私の電話はAndroid 5.1.1を搭載したNexus 5です。エミュレーター、Android 5.0.1を搭載したSamsung Galaxy s4、およびAndroid 5.0.1を搭載したMotorola Moto Gにも問題があります(どちらも借りており、現在はありません)。

通知のコードと2つのスクリーンショットを次に示します。さらに詳しい情報が必要な場合は、お気軽にお問い合わせください。

皆さん、ありがとうございました。

@SuppressLint("NewApi") private void sendNotification(String msg, String title, String link, Bundle bundle) {
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
    resultIntent.putExtras(bundle);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            resultIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
    Notification notification;
    Uri sound = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.notificationsound);
    notification = new Notification.Builder(this)
                .setSmallIcon(R.drawable.lg_logo)
                .setContentTitle(title)
                .setStyle(new Notification.BigTextStyle().bigText(msg))
                .setAutoCancel(true)
                .setContentText(msg)
                .setContentIntent(contentIntent)
                .setSound(sound)
                .build();
    notificationManager.notify(0, notification);
}

通知を開かずに 通知を開きました




この問題を修正しましたか?それでも私は同じ問題に直面しています。透明な画像を追加すると、上部のステータスバーに通知用の空白が表示されます
AngelJanniee

はい、透明なアイコンを作成するか、SDKバージョン20以下を対象として修正しました。これで問題が解決しない場合は、同様の問題の原因が異なっている可能性があります。ターゲットSDKのバージョンを20に設定し、これが何かを変更するかどうか確認することをお勧めします。うまくいかない場合は、この質問があなたに役立つかどうか
わかり

回答:


188

原因:5.0 Lollipopの場合、「通知アイコンは完全に白でなければなりません」。

ターゲットSDKを20に設定して白いアイコンの問題を解決した場合、アプリはAndroid Lollipopをターゲットにしないため、Lollipop固有の機能を使用できません。

ターゲットSDK 21のソリューション

Lollipopマテリアルアイコンをサポートする場合は、Lollipop以上のバージョンの透明なアイコンを作成します。以下を参照してください:https : //design.google.com/icons/

http://developer.android.com/design/style/iconography.htmlをご覧ください。白いスタイルは、Android Lollipopでの通知の表示方法を示しています。

Lollipopでは、白い通知アイコンの背後に表示される色を使用することも推奨されています。参照リンク:https : //developer.android.com/about/versions/android-5.0-changes.html

色を追加する場所 https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#setColor(int)

Lollipop OSバージョンの上位および下位の通知ビルダーの実装は次のようになります。

Notification notification = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    notification.setSmallIcon(R.drawable.icon_transperent);
    notification.setColor(getResources().getColor(R.color.notification_color));
} else { 
    notification.setSmallIcon(R.drawable.icon);
} 

注:setColorはLollipopでのみ使用でき、アイコンの背景にのみ影響します。

問題を完全に解決します!!


わぁ、ありがとう。私の携帯電話にあるいくつかのアプリはカラーアイコンを持っているので、私はそれらが完全に白であるべきだと思いました。今、その理由がわかります。ありがとうございました!
Blueriver 2015年

3
targetSdkVersion 20と言って、私の日を救った!どうもありがとう。
Arshad Ali 2016

11
アイコンのためだけにtargetSDKバージョンを21未満に設定するのは不適切です。この回答に記載されて良く、それを正しい方法を修正する:stackoverflow.com/questions/27343202/...
user90766

1
しかし、アプリがスタックにないときのバックグラウンドでは、白いアイコンが表示されています。どのような場合でも同じ結果を得るために何をすべきか
Pratik Vyas

1
私はすべてを試しましたが、うまくいきません。マニフェストファイルにまだ色付きのドットが表示されている
Harsh Shah

67

Googleクラウドメッセージングを使用している場合、この問題アイコンを変更するだけでは解決できません。たとえば、これは機能しません。

 Notification notification  = new Notification.Builder(this)
                .setContentTitle(title)
                .setContentText(text)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentIntent(pIntent)
                .setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_LIGHTS|Notification.DEFAULT_VIBRATE)
                .setAutoCancel(true)
                .build();

場合でも ic_notificationはtransparantと白です。次のように、マニフェストメタデータでも定義する必要があります。

  <meta-data android:name="com.google.firebase.messaging.default_notification_icon"

            android:resource="@drawable/ic_notification" />

application参考のため、メタデータはタグの下に配置します。


6
マニフェスト内のメタデータのヒントに感謝します。
Eugen Timm

「@ drawable / ic_notification」をどのように配置しますか?1つのアイコンですか?たくさんの?PNGですか?
ルークピゲッティ2018

1
@LukePighetti複数の画面解像度で異なるサイズの画像をアップロードする場合は、多くの場合があります。そうでなければ、はい、それはあなたのドローアブルディレクトリ上の1つのPNGファイルかもしれません。
Ruchir Baronia

1
@RuchirBaroniaなので、上記res/drawable/ic_notification.pngのサイズ196x196の例は?
ルークピゲッティ2018

thx @RuchirBaronia、Meta-dataタグの提案に賛成。
Ravi Vaniya

37

Googleのデザインガイドラインに従うことを強くお勧めします。

「通知アイコンは完全に白でなければならない」と書かれています。


2
あなたの答えは私が受け入れたものよりも優れています。私もあなたを受け入れたいと思います。できませんが、あなたには私の+1と感謝の気持ちがあります。乾杯!
Blueriver 2015年

2
これはあまり良い答えではありません。プロジェクトの関係者がAndroid 7をターゲットにする必要がある場合はどうなりますか?それより前のSDKバージョンをターゲットにすることはできません。
ネオンワージ2017年

1
この回答は間違っているため、反対票を投じました。質問者は、sdk21でアプリを実行できないと言っています。「sdk 21を使用しないでください」と回答
Utsav Gupta

1
これは本当に解決策ではありません。
ホセ・ゴメス2017

1
現在のデザインガイドラインでは、アイコンは透明な背景に白である必要があると明記されていません。不十分なドキュメントに関係なく、それはまだ事実であるようです。
imagio

29

Androidマニフェストでこのコードを宣言します。

<meta-data android:name="com.google.firebase.messaging.default_notification_icon" 

android:resource="@drawable/ic_stat_name" />

これがお役に立てば幸いです。


あら!これはFCMのプッシュ通知に最適です。ありがとう
Crono 2018

1
どこに置くのic_stat_name?1つのpngですか?多いですか?助けてください!
ルークピゲッティ

3
Android Studioで@Luke Pighettiアプリを右クリック>>新規>>画像アセット>>アイコンタイプ(通知)
vicky mahale

1
(久しぶりだと思いますが)説明していただけますか?それは何をすることになっていますか?フルカラーの不透明アイコンをレンダリングしますか?
9:22

これは、Firebaseクラウドメッセージング通知の正しい答えです。
グレッグエリス

11

(Android Studio 3.5)Android Studioの最新バージョンの場合、通知画像を生成できます。resフォルダーを右クリックし、 [新規] > [画像アセット]を選択します。その後、表示される設定の画像アセットを下の画像のように。アイコンの種類通知アイコンに変更します。画像は白で透明でなければなりません。このConfigure Image Assetsはそのルールを適用します。 重要:クラウド/プッシュ通知にアイコンを使用する場合、新しく作成された通知アイコンを使用するには、アプリケーションタグの下にメタデータを追加する必要があります。画像アセットの構成

  <application>
      ...
      <meta-data android:name="com.google.firebase.messaging.default_notification_icon"
          android:resource="@drawable/ic_notification" />

10

以下のようにすることができます:

通知ビルダーの新しいオブジェクトを作成し、setSmallIcon()以下のコードのように通知ビルダーオブジェクトを使用して呼び出します。

アプリをインストールするOSのバージョンを確認するメソッドを作成します。Lolipop、つまりAPI 21の下にある場合は、背景色付きの通常のアプリアイコンを使用します。それ以外の場合は、背景なしの透明なアプリアイコンを使用します。したがって、OSバージョン> = 21を使用するデバイスsetColor()は、通知ビルダークラスのメソッドを使用してアイコンの背景色を設定します。

サンプルコード:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);

notificationBuilder.setSmallIcon(getNotificationIcon(notificationBuilder));

private int getNotificationIcon(NotificationCompat.Builder notificationBuilder) {

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             int color = 0x008000;
             notificationBuilder.setColor(color);
             return R.drawable.app_icon_lolipop_above;

    } 
    return R.drawable.app_icon_lolipop_below;
}

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

10

これを試して

同じ問題に直面していて、たくさんの回答を試しましたが、解決策がありませんでした。最後に、問題を解決する方法を見つけました。

-背景が透明な通知アイコンを作成します。アプリの幅と高さは以下のサイズにして、これらすべてをプロジェクトに貼り付けます->アプリ-> src->メイン->解像度

  • MDPI 24 * 24

  • HDPI 36 * 36

  • XHDPI 48 * 48

  • XXHDPI 72 * 72


上記の後に、この下の行をonMessageReceivedメソッドに貼り付けます


Intent intent = new Intent(this, News.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                    PendingIntent.FLAG_ONE_SHOT);
            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
            if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            {
                notificationBuilder.setSmallIcon(R.drawable.notify)
                                      //            .setContentTitle(title)
                            //                        .setContentText(message)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);
            } else
                {
                    notificationBuilder.setSmallIcon(R.drawable.notify)
                       //                                .setContentTitle(title)
                        //                        .setContentText(message)
                            .setAutoCancel(true)
                            .setSound(defaultSoundUri)
                            .setContentIntent(pendingIntent);
            }
            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(0, notificationBuilder.build());

このコードをマニフェストファイルに追加することを忘れないでください。

<meta-data 
android:name="com.google.firebase.messaging.default_notification_icon" 
android:resource="@drawable/app_icon" />

10
 <meta-data android:name="com.google.firebase.messaging.default_notification_icon"

        android:resource="@drawable/ic_notification" />

この行をアプリケーションブロックのmanifest.xmlファイルに追加します


7

ロリポップサポート通知アイコンを提供したい場合は、2種類の通知アイコンを作成します。

  1. 通常の通知アイコン:ロリポップバージョンの下。
  2. 背景が透明な通知アイコン:ロリポップ以降のバージョン。

OSバージョンに基づいて、実行時に適切なアイコンを通知ビルダーに設定します。

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    mBuilder.setSmallIcon(R.drawable.ic_push_notification_transperent);
} else {
    mBuilder.setSmallIcon(R.drawable.ic_push_notification);
}

7

最後に、私はこの問題の解決策を持っています。

この問題は、アプリがまったく実行されていない場合にのみ発生します。(バックグラウンドでもフォアグラウンドでもありません)。ときアプリが通知アイコンが正しく表示されている前景または背景のいずれかで実行されます。(ない白四角)

設定する必要があるのは、フロントエンドと同じバックエンドAPIの通知アイコンの構成です。

フロントエンドではReact Nativeを使用し、プッシュ通知にはreact-native-fcm npmパッケージを使用しました

FCM.on("notification", notif => {
   FCM.presentLocalNotification({
       body: notif.fcm.body,
       title: notif.fcm.title,
       big_text: notif.fcm.body,
       priority: "high",
       large_icon: "notification_icon", // notification icon
       icon: "notification_icon",
       show_in_foreground: true,
       color: '#8bc34b',
       vibrate: 300,
       lights: true,
       status: notif.status
   });
});

Node.jsをプッシュ通知のバックエンドとして使用してfcm-push npmパッケージを使用し、ペイロード構造を次のように設定しました。

{
  to: '/topics/user', // required
  data: {
    id:212,
    message: 'test message',
    title: 'test title'
  },
  notification: {
    title: 'test title',
    body: 'test message',
    icon : 'notification_icon', // same name as mentioned in the front end
    color : '#8bc34b',
    click_action : "BROADCAST"
  }
}

基本的に、Androidシステムにローカルに保存されているnotification_icon画像を検索します。


1
問題は同じですが、私の問題とはかなり異なります。この回答を投稿していただきありがとうございます。それはおそらく、あなたが使用しているのと同じ技術スタックを使用している人を助けるでしょう。
Blueriver 2017年

1
@IanWarburton:必要ありません。
Aniruddha Shevle、2018年

5

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

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コンポーネントが無視されないこと示されています。高いアルファ値はピクセルを白くします。アルファ値を下げると、通知領域でピクセルが背景色(デバイスでは黒)、またはプルダウン通知で指定された色になります。


5

以下のコードをマニフェストに追加することで問題を解決しました、

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_stat_name" />

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/black" />

ic_stat_nameAndroid Studio で作成された場所res >> New >> Image Assets >> IconType(Notification)を右クリック

そして、通知ペイロードを使用してサーバーのphp側で行う必要があるもう1つのステップ

$message = [
    "message" => [
        "notification" => [
            "body"  => $title , 
            "title" => $message
        ],

        "token" => $token,

    "android" => [
           "notification" => [
            "sound"  => "default",
            "icon"  => "ic_stat_name"
            ]
        ],

       "data" => [
            "title" => $title,
            "message" => $message
         ]


    ]
];

セクションに注意してください

    "android" => [
           "notification" => [
            "sound"  => "default",
            "icon"  => "ic_stat_name"
            ]
        ]

アイコン名は"icon" => "ic_stat_name"マニフェストで設定されているものと同じである必要があります。



4

独自の白いアイコンを生成できるリンクを見つけました。

このリンクを試して、ランチャーアイコンの白いアイコンを生成します。

このリンクを開き、ic_launcherまたは通知アイコンをアップロードします


1

バージョンごとに異なるアイコンを使用できます。次のようにアイコンにロジックを設定するだけです。

int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;

1

SDK> = 23の場合、setLargeIconを追加してください

notification = new Notification.Builder(this)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(context.getResources(), R.drawable.lg_logo))
            .setContentTitle(title)
            .setStyle(new Notification.BigTextStyle().bigText(msg))
            .setAutoCancel(true)
            .setContentText(msg)
            .setContentIntent(contentIntent)
            .setSound(sound)
            .build();

1

SDK固有のバージョンを減らすには、次のようにします( '#'を '0x'に置き換えます)。

Notification notification = new NotificationCompat.Builder(this);
notification.setSmallIcon(R.drawable.icon_transperent);
notification.setColor(0x169AB9); //for color: #169AB9

0xFF169AB9、完全に不透明なアルファチャネルがありません。
Eugen Pechanec

0

カラフルなアイコンを保持したい場合-回避策
少し異なる色のピクセルをアイコンに追加します。
私の場合、色合いと光のある黒いアイコンがあります。濃い青のピクセルを追加すると機能します。


0

Android 8.0でも同様の問題があります。ホワイトアイコンリソースを使用してみてください。アイコンに色付きの画像を使用しようとすると、白い四角形が表示されます。白いアイコンに置き換えると、作業が始まります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.