web-dev-qa-db-ja.com

「その他」の通知チャネルに送信するにはどうすればよいですか?

問題の説明

Android ONotificationを送信しようとすると、NotificationChannelをに指定する必要がありますに送る。

このNotificationCompat.Builder(this)のような古い方法(チャネルを設定しない)を使用すると、Notificationは表示されません。

このNotificationCompat.Builder(this, "invalid")またはNotificationCompat.Builder(this, "")のような無効なチャネルについても同じことが言えます。

Firebase Cloud Messagingを介して通知を送信し、通知チャネルのないバックグラウンドでアプリケーションを使用している場合指定すると、 "Miscellaneous"チャネルでの通知になります。

上記のフォアグラウンドで同じことを実行しようとすると、機能せず、名前 "Miscellaneous"およびid "の通知チャネルも作成されません。 {package} .MISCELLANEOUS "そしてそれを介して送信します。私がそれをすると何が起こるかは次のとおりです:

Screenshot from my app's settings

知りたいこと

[〜#〜] fcm [〜#〜]のようなチャネルなしで通知を送信するにはどうすればよいですか?通常の "その他"チャネル?

この動作の例

上で述べたように、これはFCM通知で発生しますが、たとえばGmailもその他のチャネルを使用します。 では、どのように使用しますか?

Screenshot of Gmail's notification channels

それが通常使用できないならば、彼らは雑多なチャンネルを削除したであろうと私は信じます。

簡単な説明

このコードが「その他」の通知チャネルに通知を送信しないのはなぜですか。実際には通知を送信していません(Android Oでのみ、コードは下位のAndroidバージョン)。

(getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).notify(1, NotificationCompat.Builder(this, NotificationChannel.DEFAULT_CHANNEL_ID)
                    .setSmallIcon(R.drawable.small_icon)
                    .setContentTitle(URLDecoder.decode("Title", "UTF-8"))
                    .setContentText(URLDecoder.decode("Text", "UTF-8"))
                    .setColor(ContextCompat.getColor(applicationContext, R.color.color))
                    .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                    .setContentIntent(PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT))
                    .build())

そのチャネルのIDはfcm_fallback_notification_channel。 Firebase-messagingライブラリはそれを内部で作成します。

9
guest

別の回答 で述べたように、Androidシステムはfcm_fallback_notification_channelただし、最初のプッシュ通知を管理する必要があるまでシステムはチャネルを作成しないため、注意が必要です。したがって、FirebaseMessagingServiceクラスの拡張機能内ですべての通知を管理すると、チャネルが存在せず、次のようなエラーが発生する可能性があります。

Android.app.RemoteServiceException: Bad notification for startForeground: Java.lang.RuntimeException: invalid channel for service notification: Notification(channel=fcm_fallback_notification_channel pri=-2 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 color=0x00000000 vis=PRIVATE)

通知を作成する前にデフォルトのチャネルが存在するかどうかを確認し、存在しない場合は作成することをお勧めします。

private void createDefaultNotificationChannel() {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
     NotificationManager notificationManager = getSystemService(NotificationManager.class);

     if (notificationManager.getNotificationChannel("fcm_fallback_notification_channel") != null) {
       return;
     }

     String channelName = getString(R.string.fcm_fallback_notification_channel_label);
     NotificationChannel channel = new NotificationChannel("fcm_fallback_notification_channel", channelName, NotificationManager.IMPORTANCE_HIGH);
     notificationManager.createNotificationChannel(channel);
}
2
Sca09