Androidで通知バンドル/グループがクリックされたことを検出するにはどうすればよいですか?


8

Android Nougat以降では、アプリのプッシュ通知は4番目以降自動的にグループ化されます。

Androidの問題は、バンドルをクリックしてもプッシュ通知リストが展開されず、アプリが開くことです。

プッシュ通知でアプリを開いたユーザーを特定する必要があります。個別の通知の場合、インテントの追加情報を調べることができるため、これは簡単です。バンドルの問題は、エクストラがnullであり、インテントがユーザーがランチャーアイコンをクリックした場合とまったく同じに見えることです。ナビゲーションがプッシュ通知から行われたことを検出する方法はありません:(

はっきりしない場合に備えて、私は明示的にプッシュ通知グループを使用していません。これはAndroidによって自動的に行われます。通知にグループキーを設定していません。

Firebaseを使用しています。NotificationCompatアプリがフォアグラウンドにあるときにのみプッシュ通知を作成します。このロジックは、アプリがバックグラウンドにあるとき、または閉じているときに実行されません(OnMessageReceivedフォアグラウンドのアプリでのみ実行されます)。

編集

OnMessageReceivedバックグラウンドでもクローズされている場合でも、実行中のイベントのPNペイロードを変更できることを知っています。このケースでは、PNに関する問題が解決しないという不満をたくさんの人が見つけたので、これを避けたいと思います。

http://github.com/firebase/quickstart-android/issues/368

http://github.com/firebase/quickstart-android/issues/219

アプリがPNを作成していなくても、グループ化されたPNをタップしているユーザーを検出したいのですが。


AFAIK、バンドルの山形アイコンをタップすると、通知リストが展開/折りたたまれます。
Edric

@エドリック:その通りです...しかし、ユーザーに強制することはできません。一部のユーザーは折りたたまれたプッシュ通知をクリックします。その状況を処理したいと思います。
StackOverflower

クライアント側ではなくサーバー側で通知が生成されるということは、FCMを使用しているということですよね?その場合でも、まだdeveloper.android.com/reference/android/app/…を使用していますよね?コードスニペットを共有していただけませんか?
Arnab Saha

@ArnabSaha:アプリがバックグラウンドにあるとき、または閉じているとき、通知を作成するためのコードが実行されないため、できません
Claudio Redi

通知がグループ化されるときに事前に知っていますか?
Natig Babayev

回答:


4

解決策1: 通知の作成を処理する場合は、次の手順を試すことができます。

まず、新しい通知を作成するたびに、次を使用して同じキーでそれらをグループ化できますsetGroup(...)

val newMessageNotification1 = NotificationCompat.Builder(applicationContext, ...)
    ...
    .setGroup("group_messages")
    .build()

同じID ( "group_messages")で通知をグループ化したので、異なる目的で要約通知を作成できます。

val notifyIntent = Intent(this, ResultActivity::class.java).apply {
val notifyIntent = Intent(this, ResultActivity::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val notifyPendingIntent = PendingIntent.getActivity(
    this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT
)

val summaryNotification = NotificationCompat.Builder(applicationContext, ...)
    .setSmallIcon(android.R.drawable.ic_btn_speak_now)
    .setContentIntent(notifyPendingIntent)
    .setContentTitle("Grouped notification title")
    .setContentText("Grouped notification text")
    .setGroup("group_messages")
    .setGroupSummary(true)
    .build()

最後のステップとしてif、同じグループに複数の通知があることを確認してから、グループ通知で通知できます。

val notificationManager = applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

val notificationManagerCompat = NotificationManagerCompat.from(applicationContext)
notificationManagerCompat.notify(ID, newMessageNotification1)

val amountOfNotificationsInSameGroup = notificationManager.activeNotifications
                    // Here we filter notifications that are under same group
                    .filter { it.notification.group == "group_messages" }
                    .size

if (amountOfNotificationsInSameGroup >= 2) {
    // if we already have minimum of 2 notifications, we'll group them under summary notification
    notificationManagerCompat.notify(SUMMARY_NOTIFICATION_ID, summaryNotification)
}

onMessageReceivedメソッド内でコードを組み合わせることができます。ご覧のとおり、グループ化された通知を処理するカスタムインテントを設定できます。グループ化された通知の詳細については、こちらをご覧ください

解決策2: 通知の作成を処理したくないが、通知がグループ化されているかどうかを知りたい場合は、次の解決策を試すことができます。

NotificationManager持っているgetActiveNotifications()を呼び出すアプリによって投稿されていますし、まだユーザーによって却下されていない通知を返す関数。Androidでグループ化された通知をクリックしても、通知は閉じられません。したがって、ランチャーアクティビティでアクティブな通知のサイズを確認して、グループ化/バンドル通知をクリックしてアプリが起動されたかどうかを検出できます。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val notificationManager =
            applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

        if (notificationManager.activeNotifications.size >= 4) {
            // Notifications are grouped
            // Put your logic here

            // Do not forget to clear notifications
            NotificationManagerCompat.from(this).cancelAll()
        }
    }
}

個人的には、最初の解決策をお勧めしますが、投稿した問題に応じて、2番目のオプションも使用できますが、アプリがランチャーから起動されたか、グループ化された通知をクリックして起動されたかを区別できないことに注意してください。

2番目のソリューションでは、次の質問がある場合があります。

Q1:通常の通知クリックを同じアクティビティのグループ1から区別するにはどうすればよいですか?

-単にclick_action、通常の通知クリックを定義して別のアクティビティに転送できます。ドキュメントを確認してください。

以前の通知を置き換える場合はtag、バックエンド側の通知JSON でも同じように定義できます。このように、新しい通知は古い通知を同じタグで置き換えるため、通知はバンドルされません。ドキュメントを確認してください。

私の答えが役に立てば幸いです。


アプリがフォアグラウンドにあるときのみ、PNをクレストします。OnMessageReceived アプリが閉じているとき、メソッドは実行されません。アプリを閉じたときやバックグラウンドでアプリにPNを処理させたとしても、それがまったくうまく機能しないというドキュメントを見たことがあります。
StackOverflower

それは動作します。おそらくあなたはそれを適切に使用しないでしょう。コードを入れて、手動で通知を作成できないことを示すドキュメントを参照できますか?
Natig Babayev

@StackOverflowerを使用すると、firbebaseでデータメッセージを使用でき、onMessageReceivedメソッドでアプリが
強制終了


共有したリンクは、それが推奨されていないことを示しておらず、いくつかのデバイスで問題が発生しているようです。アプリに通知をどのように実装しましたか?
Natig Babayev

0

@Natig Babayevの回答はよく説明されています。ただし、第2部では、ランチャーアイコンをクリックしてアプリを開いたか、プッシュ通知バンドルをクリックしてアプリを開いたかを区別する方法を説明していません(自動的にグループ化される5つの通知がある場合を考えますが、ユーザーは通知バンドルではなく、アプリランチャーをクリックしてアプリを実行します。)

1つの解決策は、通知のグループ化を自動的に無効にすることです。ただし、これは不可能です。この質問これも参照してください

私は多くの異なるオプションを調査し、最適なソリューションをするだろうことがわかったAndroidシステムがそれを行う前に、グループ通知を自分最大グループ化されていない通知に通知の数を制限し、古い通知を削除するか、別のバンドルにそれらを束ねて。

以下を参照することもできます

  1. https://stackoverflow.com/a/47073575/9640177
  2. https://stackoverflow.com/a/34961716/9640177
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.