web-dev-qa-db-ja.com

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

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

アイコンのサイズを変更してみました(寸法720×720、66×66、44×44、22×22)。奇妙なことに、小さい寸法を使用すると白い四角形が小さくなります。

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

私の携帯電話は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);
}

without opening the notificationnotifications opened

134
Blueriver

原因:5.0のロリポップでは「通知アイコンは完全に白でなければなりません」

ターゲットSDKを20に設定して白いアイコンの問題を解決すると、アプリはAndroid Lollipopをターゲットにしなくなります。つまり、Lollipop固有の機能を使用できなくなります。

ターゲットSdk 21の解決策

あなたがロリポップ材料アイコンをサポートしたいならば、ロリポップと上のバージョンのために透明なアイコンを作ってください。次を参照してください。 https://design.google.com/icons/

http://developer.Android.com/design/style/iconography.html をご覧ください。白いスタイルは通知がAndroidでどのように表示されるのかということですロリポップ.

Lollipopでは、Googleは白い通知アイコンの後ろに表示される色を使用することも推奨しています。リンクを参照してください。 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 Builderの実装は次のようになります。

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でのみ使用可能で、アイコンの背景にのみ影響します。

それはあなたの問題を完全に解決するでしょう!!

151
Garima Mathur

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が透明で白であっても次のように、Manifestメタデータでも定義する必要があります。

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

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

参考のために、メタデータはapplicationタグの下にあります。

40
Ruchir Baronia

私は以下の グーグルのデザインガイドライン をお勧めします。

「通知アイコンは完全に白でなければなりません」

22
N J

Android Manifestでこのコードを宣言します。

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

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

これがあなたに役立つことを願っています。

18
vicky mahale

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

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

アプリをインストールしているOSのバージョンを確認する方法を作成します。それがLolipopすなわちAPI 21より下であるならば、それは背景色で通常のアプリアイコンをとるでしょう、さもなければそれは少しの背景なしで透明なアプリアイコンをとるでしょう。そのため、os version> = 21を使用するデバイスは、Notification Builderクラスのメソッド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;
}
10
rahul sharma
 <meta-data Android:name="com.google.firebase.messaging.default_notification_icon"

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

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

7
Sajidh Zahir

最後に、私はこの問題に対する解決策を得ました。

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

バックエンドAPIの通知アイコンの設定はFrontend.と同じです。

フロントエンドでは 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画像を検索します。

7

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

  1. 通常の通知アイコン:Lollipopバージョン以下用.
  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);
}
6
Haresh Chhelana

これを試して

私は同じ問題に直面していた私は多くの答えを試したが解決策を得られなかった、ようやく私は私の問題を解決する方法を見つけた。

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

  • 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" />
6
Sunil

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

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

4
Jeremy Frank

この問題を解決するための必要条件

  1. 画像フォーマット:32ビットPNG(アルファ付き)

  2. 画像は透明にする

  3. 透明度カラーインデックス:ホワイト(FFFFFF)

出典: http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html

3
user7478049

私たち自身の白いアイコンを生成できるリンクを見つけました、

ランチャーアイコンの白いアイコンを生成するには、このリンクを試してください。

これを開く リンク してic_launcherまたは通知アイコンをアップロードしてください

3
Ghanshyam Nayma

あなたは異なるバージョンのために異なるアイコンを使うことができます。アイコンにロジックを設定するだけです。

int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;
1
Md. Al- Rasel

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
Caat c

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

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

カラフルなアイコンを使いたいとき - 回避策
アイコンに色が少し違うピクセルを追加します。
私の場合、色合いと光のある黒いアイコンがあります。ダークブルーピクセルを追加すると動作します。

0
Vouskopes

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

0
Zeon

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

    <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" />

android Studioでic_stat_nameが作成された場所res >>新規>>画像素材>> IconType(通知)を右クリック

通知ペイロードを使用して、サーバー側でもう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"の場合、マニフェストと同じセットにする必要があります。

0
Haris