新しいFirebase Cloud Messagingシステムの通知アイコン


132

昨日、GoogleはGoogle I / Oで、新しいFirebaseに基づく新しい通知システムを発表しました。私はGithubの例でこの新しいFCM(Firebase Cloud Messaging)を試しました。

特定のドローアブルを宣言したにもかかわらず、通知のアイコンは常にic_launcherです

どうして ?以下はメッセージを処理するための公式コードです

public class AppFirebaseMessagingService extends FirebaseMessagingService {

    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        // If the application is in the foreground handle both data and notification messages here.
        // Also if you intend on generating your own notifications as a result of a received FCM
        // message, here is where that should be initiated. See sendNotification method below.
        sendNotification(remoteMessage);
    }
    // [END receive_message]

    /**
     * Create and show a simple notification containing the received FCM message.
     *
     * @param remoteMessage FCM RemoteMessage received.
     */
    private void sendNotification(RemoteMessage remoteMessage) {

        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

// this is a my insertion looking for a solution
        int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.myicon: R.mipmap.myicon;
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(icon)
                .setContentTitle(remoteMessage.getFrom())
                .setContentText(remoteMessage.getNotification().getBody())
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }

}

firebaseは、通知の作成方法とは関係ありません。表示されているものについての画像を提供してください
tyczj

1
正確です。このコードはFirebaseから直接提供されており、sendNotification()メソッドはどの通知でもまったく同じです。このコードはGCMでは問題なく機能しますが、FCMでは機能しません。常にic_launcherのままで、新しいWebインターフェイスを使用してメッセージを送信します
marco

小さいアイコンを設定しますが、大きいアイコンは設定しません。プッシュペイロードに通知タグを付けてプッシュを送信しない限り、FCMとは何の関係もありません
tyczj

アプリがフォアグラウンドにあるときにカスタム通知アイコンが表示されますか?それは私にとってはうまくいきます。ただし、アプリがバックグラウンドにある場合は、通知の設定がすべて無視されるため(アイコン、サウンド、ライト、バイブレーションなどをカスタマイズできないため)、なんらかのデフォルトのFCMハンドラーを使用する必要があります。
シャイニーペンギン2016年

回答:


267

残念ながら、これはSDK 9.0.0-9.6.1のFirebase Notificationsの制限でした。アプリがバックグラウンドにある場合、ランチャーアイコンは、コンソールから送信されるメッセージにマニフェストから(必要なAndroidの色付きで)使用されます。

ただし、SDK 9.8.0では、デフォルトを上書きできます。AndroidManifest.xmlで次のフィールドを設定して、アイコンと色をカスタマイズできます。

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

アプリがフォアグラウンドにある(またはデータメッセージが送信される)場合は、独自のロジックを完全に使用して表示をカスタマイズできます。HTTP / XMPP APIからメッセージを送信する場合は、アイコンをいつでもカスタマイズできます。


1
@Ian Barber:Googleで近い将来にこの動作を変更する計画はありますか?
Skylve 2016年

1
チームは問題を認識しており、修正に取り組んでいます。
Arthur Thompson

1
これに関する更新はありますか?Googleエンジニアがパッチをプッシュするのを忘れたという状況があったので、私が尋ねると思いました。
CQM 2016

7
ああ、9.0.0で動作するようになりました。他のユーザーを支援するには、ステータスバーアイコンが要件を満たしている必要があることに注意してください:developer.android.com/guide/practices/ui_guidelines/…。Mineはそうしなかったため、マニフェストで指定されたアイコンを使用する代わりに、firebaseはデフォルトで標準のホワイトスクエアに設定しました。
zaifrun 2016年

3
これを試してみて、アイコンが他の通知よりも小さいことがわかった場合は、ベクターのドローアブル(pngではなく)を使用していることを確認してください。それで解決しました。
riper

35

サーバー実装を使用してメッセージをクライアントに送信し、通知タイプのメッセージではなくデータタイプのメッセージを使用します。

これはonMessageReceived、アプリがバックグラウンドかフォアグラウンドかに関係なくコールバックを取得するのに役立ち、その後カスタム通知を生成できます


2
これはFirebaseドキュメントでも推奨される解決策です。通知ではなくデータプッシュに依存している場合は、任意の方法で通知を表示できます。
2016年

1
はい同意する。これは正解としてマークする必要があります。または以下の私の答え:)
Developine

3
いいえ、通知を期待している他のクライアント/レガシーバージョンとの互換性を維持する必要がある人々にとっては、それは現実的ではありません。
ガボール

すでにプッシュの通知タイプを想定している本番環境のアプリがあり、その(複雑な)バックエンドコンポーネントを拡張して新しいクライアントのデータを追加しました。ただし、アプリのレガシーバージョンのサポートを削除することはできません。
Gabor

そうだね。それは別の問題です。統合する前にドキュメントを完全に読むことをお勧めします。プロダクションにリリースする前に徹底的にテストすることも。アプリがリリース前に十分にテストされていれば、この問題は回避できたはずです。とにかく、あなたは学ぶべきことがありました。
geekoraul

9

atm彼らはその問題に取り組んでいますhttps://github.com/firebase/quickstart-android/issues/4

Firebaseコンソールから通知を送信すると、デフォルトでアプリのアイコンが使用され、Androidシステムは通知バーにあるときにそのアイコンを白一色にします。

その結果に不満がある場合は、FirebaseMessagingServiceを実装し、メッセージを受信したときに手動で通知を作成する必要があります。私たちはこれを改善する方法に取り組んでいますが、今のところそれが唯一の方法です。

編集:SDK 9.8.0でAndroidManifest.xmlに追加

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

マシュマロでカスタマイズされたアイコン通知トレイを表示する方法
Harsha

6

私のソリューションはATomのソリューションに似ていますが、実装が簡単です。FirebaseMessagingServiceを完全にシャドウするクラスを作成する必要はありません。インテント(少なくともバージョン9.6.1ではパブリック)を受け取るメソッドをオーバーライドして、エクストラから表示される情報を取得するだけです。「ハッキー」な部分は、メソッド名が実際に難読化されており、Firebase SDKを新しいバージョンに更新するたびに変更されることですが、Android StudioでFirebaseMessagingServiceを調べて、唯一のパラメータとしてのインテント。バージョン9.6.1ではzzmと呼ばれています。これが私のサービスの様子です。

public class MyNotificationService extends FirebaseMessagingService {

    public void onMessageReceived(RemoteMessage remoteMessage) {
        // do nothing
    }

    @Override
    public void zzm(Intent intent) {
        Intent launchIntent = new Intent(this, SplashScreenActivity.class);
        launchIntent.setAction(Intent.ACTION_MAIN);
        launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* R    equest code */, launchIntent,
                PendingIntent.FLAG_ONE_SHOT);
        Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),
                R.mipmap.ic_launcher);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setLargeIcon(rawBitmap)
                .setContentTitle(intent.getStringExtra("gcm.notification.title"))
                .setContentText(intent.getStringExtra("gcm.notification.body"))
                .setAutoCancel(true)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager)     getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

キー名のgcm.notification.titleはすべてのバージョンで100%安全ですか?
pedroooo 2017年

3

targetSdkVersionを19に設定するだけです。通知アイコンは色付きになります。次に、Firebaseがこの問題を修正するまで待ちます。


7
:Dうわー、それで副作用のリストはどこですか?
Eugen Pechanec 16

@EugenPechanecはい、トレードオフは、20 +以降で利用可能な一部のAPIを使用できない場合があることです
benleung

3

また、醜いが機能する方法が1つあります。FirebaseMessagingService.classを逆コンパイルし、その動作を変更します。次に、クラスをyoutアプリの適切なパッケージに配置し、メッセージングライブラリ自体のクラスの代わりにそれを使用します。それは非常に簡単で機能しています。

メソッドがあります:

private void zzo(Intent intent) {
    Bundle bundle = intent.getExtras();
    bundle.remove("android.support.content.wakelockid");
    if (zza.zzac(bundle)) {  // true if msg is notification sent from FirebaseConsole
        if (!zza.zzdc((Context)this)) { // true if app is on foreground
            zza.zzer((Context)this).zzas(bundle); // create notification
            return;
        }
        // parse notification data to allow use it in onMessageReceived whe app is on foreground
        if (FirebaseMessagingService.zzav(bundle)) {
            zzb.zzo((Context)this, intent);
        }
    }
    this.onMessageReceived(new RemoteMessage(bundle));
}

このコードはバージョン9.4.0からのものであり、難読化のため、メソッドによってバージョンごとに名前が異なります。


3

アプリがバックグラウンドにある場合、通知アイコンはonMessage Receiveメソッドに設定されますが、アプリがフォアグラウンドにある場合、通知アイコンはマニフェストで定義したものになります

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


2

FCMコンソールから、およびHTTP / JSONを介して通知をトリガーしています...同じ結果になります。

タイトル、メッセージ全体を処理できますが、アイコンは常にデフォルトの白い円です。

通知のスクリーンショット

コード内のカスタムアイコン(setSmallIconまたはsetSmallIcon)またはアプリのデフォルトアイコンの代わりに:

 Intent intent = new Intent(this, MainActivity.class);
    // use System.currentTimeMillis() to have a unique ID for the pending intent
    PendingIntent pIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), intent, 0);

    if (Build.VERSION.SDK_INT < 16) {
        Notification n  = new Notification.Builder(this)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentIntent(pIntent)
                .setAutoCancel(true).getNotification();
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //notificationManager.notify(0, n);
        notificationManager.notify(id, n);
    } else {
        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);

        Notification n  = new Notification.Builder(this)
                .setContentTitle(messageTitle)
                .setContentText(messageBody)
                .setSmallIcon(R.drawable.ic_stat_ic_notification)
                .setLargeIcon(bm)
                .setContentIntent(pIntent)
                .setAutoCancel(true).build();

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //notificationManager.notify(0, n);
        notificationManager.notify(id, n);
    }

1
とった!私の<service>タグがAndroidManifest.xmlの<application>タグの外にありますここで私は答えをホットにしますstackoverflow.com/a/37352142/6366150
Gonzalo

フォアグラウンドアプリが実行されている場合にのみ機能します...バックグラウンドで引き続き以前と同じ動作が行われます
Gonzalo

カスタム通知アイコンが正常に機能しているフォアグラウンドのアプリが正常に機能しているが、アプリのバックグラウンドで白い四角のアイコンが表示される場合、私を助けてください
Harsha

1

これを書いて

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

右下 <application.....>

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


0

私の問題は単純ですが気づきにくいので、私はこれに答えを追加すると思いました。特にcom.google.firebase.messaging.default_notification_iconandroid:valueタグを使用して値を指定するを作成するときに、既存のメタデータ要素をコピー/貼り付けました。これは通知アイコンでは機能しませんandroid:resource。変更すると、すべてが期待どおりに機能するようになりました。


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