【Kotlin】通知のアイコンが白い四角(□)になってしまう問題の修正【Firebase】

以前の記事(【Android】Firebase Cloud Messagingを利用してプッシュ通知を実装する【Firebase】)で

  • 通知のアイコンが白い四角(□)になってしまう

という問題がありましたが、その解決方法を見つけましたので共有します。

AndroidManifest.xmlにmetaデータを追加することで、指定した画像と色で塗りつぶされた通知アイコンが出ます。


通知のアイコンが白い四角(□)になってしまう問題対応

Firebase Cloud Messagingのテストを打つ

この問題です。
状況としては、アプリが起動していない状態で通知が来ると、FirebaseMessagingServiceクラスで指定した色などが反映されない状態です。
おそらくアプリ側としてはデフォルトでどの画像を使うかが分からない状態のためにこうなっているはず。

FirebaseMessagingServiceクラスに関しては下記を参考にしてください。

これだとぱっと見で、どのアプリからの通知なのかがわからずに、ユーザーがそのまま通知を消してしまいそうです・・・。

対応方法 AndroidManifestに追記

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.sub.takelab.twitmorus">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:name=".TwitMorseApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        ...
        ...
        ...
        <meta-data android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/notification_twitmorse_white_gray" />
        <meta-data android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@android:color/holo_blue_dark" />
        ...
        ...
        ...
    </application>
</manifest>

上記の場所にcom.google.fire.base.messaging.default_notification_iconとcom.google.firebase.messaging.default_notification_colorというmetaデータを入れておくことで解決。

ちなみにdrawableに格納している画像は透過のpng画像が推奨。そうでないとまた白い四角(□)になる可能性がある。

結果

キタ━━━━(゚∀゚)━━━━!!

キタ━━━━(゚∀゚)━━━━!!

なお、アプリがフォアグラウンド(またはバックグラウンドで起動中)際に通知が来ると・・・

紫色ですよね。FirebaseMessagingServiceクラスで指定した色が適用されているからです。

class TwitMorseFirebaseMessagingService: FirebaseMessagingService() {
   //...
   //...
   override fun onMessageReceived(remoteMessage: RemoteMessage) {
            //...
            //...
            //...
            val notification = builder
                    .setSmallIcon(R.drawable.notification_twitmorse_white_gray) // アイコンは指定必須です
                    .setColor(ContextCompat.getColor(this, R.color.design_default_color_primary)) //色
                    .setContentTitle(title)                 // 通知に表示されるタイトルです
                    .setContentText(message)                // 通知内容を設定します
                    .build()
            // 通知を表示します
            val nm = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
            nm.notify(0, notification)
    }
    //...
}


しかし、この状態の通知をタップしても何も起きない問題が発生

アプリがフォアグラウンド(またはバックグラウンドで起動中)の時に来た通知をタップすると、アプリのタスクをキルしようがしまいが、何も起こらないという問題が起きています・・・。
これはおそらく、自分が継承して実装したFirebaseMessagingServiceクラス側で、開くべきActivityの指定をしていないからだと思われます。
この問題の解決はまた後日行います。。。

参考資料


コメント

タイトルとURLをコピーしました