私のアプリは通知を生成しますが、その通知用に設定したアイコンは表示されていません。代わりに私は白い四角を得ます。
アイコンのサイズを変更してみました(寸法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);
}
原因: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
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でのみ使用可能で、アイコンの背景にのみ影響します。
それはあなたの問題を完全に解決するでしょう!!
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
タグの下にあります。
「通知アイコンは完全に白でなければなりません」
Android Manifestでこのコードを宣言します。
<meta-data Android:name="com.google.firebase.messaging.default_notification_icon"
Android:resource="@drawable/ic_stat_name" />
これがあなたに役立つことを願っています。
我々は以下のようにすることができます:
通知ビルダーの新しいオブジェクトを作成し、以下のコードのように通知ビルダーオブジェクトを使用して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;
}
<meta-data Android:name="com.google.firebase.messaging.default_notification_icon"
Android:resource="@drawable/ic_notification" />
アプリケーションブロックのmanifest.xmlファイルにこの行を追加します。
最後に、私はこの問題に対する解決策を得ました。
この問題は、アプリがまったく実行されていない場合にのみ発生します。 (背景にも前景にもない)。 アプリがフォアグラウンドまたはバックグラウンドで実行されている場合、通知アイコンは正しく表示されます。(白い四角ではありません)
バックエンド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画像を検索します。
あなたがロリポップサポート通知アイコンを提供したい場合は、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);
}
私は同じ問題に直面していた私は多くの答えを試したが解決策を得られなかった、ようやく私は私の問題を解決する方法を見つけた。
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" />
以下に説明するように、通知はグレースケールです。他の人が書いたものにもかかわらず、それらは白黒ではありません。あなたはおそらくネットワーク強度バーのように、複数の色合いのアイコンを見たことがあります。
API 21(Lollipop 5.0)より前のバージョンでは、カラーアイコンは機能します。アプリケーションに強制的にAPI 20をターゲットにさせることもできますが、それはアプリケーションで利用できる機能を制限するため、お勧めできません。実行中のAPIレベルをテストして、カラーアイコンまたはグレースケールアイコンを適切に設定することもできますが、これはあまり意味がありません。ほとんどの場合、グレースケールのアイコンを使用するのが最善です。
画像にはRGBA(赤/緑/青/アルファ)の4つのチャンネルがあります。通知アイコンの場合、AndroidはR、G、およびBチャネルを無視します。重要な唯一のチャンネルはアルファで、不透明度とも呼ばれます。描画色のアルファ値を制御できるエディタを使ってアイコンをデザインします。
アルファ値がどのようにグレースケール画像を生成するか:
setColor
で変更する:
NotificationCompat.Builder.setColor(int argb)
を呼び出します。 Notification.color
のドキュメントから:
この通知を表示するときに標準のStyleテンプレートによって適用されるアクセントカラー(Colorの定数のようなARGB整数)。現在のテンプレートデザインは、この色のフィールドの上にアイコンイメージ(白でステンシル印刷されています)をオーバーレイすることによって、カラフルなヘッダーイメージを作成します。アルファ成分は無視されます。
SetColorを使った私のテストでは、Alphaコンポーネントは無視されないことを示しています。より高いアルファ値はピクセルを白に変えます。より低いアルファ値は通知領域の背景色(私のデバイスでは黒)、またはプルダウン通知で指定された色にピクセルを向けます。
この問題を解決するための必要条件
画像フォーマット:32ビットPNG(アルファ付き)
画像は透明にする
透明度カラーインデックス:ホワイト(FFFFFF)
出典: http://gr1350.blogspot.com/2017/01/problem-with-setsmallicon.html
私たち自身の白いアイコンを生成できるリンクを見つけました、
ランチャーアイコンの白いアイコンを生成するには、このリンクを試してください。
これを開く リンク してic_launcherまたは通知アイコンをアップロードしてください
あなたは異なるバージョンのために異なるアイコンを使うことができます。アイコンにロジックを設定するだけです。
int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop ? R.drawable.colored_: R.drawable.white_tint_icon_for_lolipop_or_upper;
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();
(Android Studio 3.5)Android Studioの最新バージョンの場合、通知画像を生成できます。 resフォルダーを右クリックします>新規>画像アセット。次の画像に示すように、Configure Image Assetsが表示されます。 アイコンタイプを通知アイコンに変更します。画像は白く透明でなければなりません。このImage Assetsの設定はそのルールを強制します。 重要:クラウド/プッシュ通知にアイコンを使用する場合は、使用するアプリケーションタグの下にメタデータを追加する必要があります新しく作成された通知アイコン。
<application>
...
<meta-data Android:name="com.google.firebase.messaging.default_notification_icon"
Android:resource="@drawable/ic_notification" />
カラフルなアイコンを使いたいとき - 回避策
アイコンに色が少し違うピクセルを追加します。
私の場合、色合いと光のある黒いアイコンがあります。ダークブルーピクセルを追加すると動作します。
私はAndroid 8.0で同様の問題を抱えています。 WHITEアイコンリソースを使ってみてください。色付きの画像をアイコンに使用しようとしているときに白い四角が表示されます。白いアイコンに置き換えると、作業が始まります。
マニフェストに以下のコードを追加することで問題を解決しました、
<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"
の場合、マニフェストと同じセットにする必要があります。