前提・実現したいこと
Android Studio で、ビデオ通話できるアプリの開発をしています。
その通話の着信を受けるために、以下の「緊急の通知を表示する」手順に従って通話着信用の通知を実装しているのですが、
Push通知を受け取れなくなる場合があり、その問題を解決したいです。
https://developer.android.com/training/notify-user/time-sensitive?hl=ja
発生している問題・エラーメッセージ
通話着信Pushを送ったはずなのにFirebaseMessagingServiceのonMessageReceived()が呼ばれない場合があり、
一度呼ばれなくなると以降ずっと呼び出されない状態になります。
別の通知チャンネルで通常のPushを送った場合は反応しているので、foregroundServiceの使い方か、通話着信Pushの後処理に問題があるのではと考えています。
FOREGROUND_SERVICEパーミッションとUSE_FULL_SCREEN_INTENTパーミッションはマニフェストで設定済みです。
インストールしてから初回のPush通知は必ず正常に受け取れています。受け取れなくなった場合でもアンインストール・再インストールすればもう一度受け取れるようになります。
該当のソースコード
通知チャンネル登録処理
kotlin
1val manager = NotificationManagerCompat.from(context) 2val channel = NotificationChannel( 3 channelId, 4 context.getString(channelNameStringId), 5 NotificationManager.IMPORTANCE_HIGH 6) 7 8// 通知時のライトの色 9channel.enableLights(true) 10channel.lightColor = context.getColor(R.color.notify) 11// ロック画面で通知を表示するかどうか 12channel.lockscreenVisibility = Notification.VISIBILITY_PRIVATE 13// バッジ表示 14channel.canShowBadge() 15channel.setShowBadge(true) 16// ヴァイブレーション 17channel.enableVibration(true) 18channel.vibrationPattern = LongArray(200).also { for (i in it.indices) it[i] = 300 } 19// 着信音 20val uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE) 21channel.setSound(uri, AudioAttributes.Builder() 22 .setLegacyStreamType(AudioManager.STREAM_RING) 23 .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE) 24 .build()) 25 26manager.createNotificationChannel(channel)
Push受信時に通知を表示する処理
kotlin
1val intent = Intent(this, TalkActivity::class.java).also { 2 it.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK 3 it.putExtra(Define.INTENT_KEY_HOGE, fuga) 4} 5val pendingIntent = PendingIntent.getActivity(this, Define.RequestCode.TALK, 6 intent, PendingIntent.FLAG_IMMUTABLE) 7 8val builder = NotificationCompat.Builder(this, Define.NotificationChannel.TALK) 9 .setSmallIcon(R.drawable.icon) 10 .setContentTitle(getString(R.string.app_name)) 11 .setContentText(getString(R.string.receiving_video_call_text)) 12 .setPriority(NotificationCompat.PRIORITY_HIGH) 13 .setCategory(NotificationCompat.CATEGORY_CALL) 14 .setFullScreenIntent(pendingIntent, true) 15 .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) 16 .setTimeoutAfter(60 * 1000) 17 .setContentIntent(pendingIntent) 18 19startForeground(Define.NotificationId.TALK_START, builder.build()) 20 21// タイムアウトしたらサービスを止める 22val handler = Handler(mainLooper) 23val startTime = Calendar.getInstance().timeInMillis 24handler.post(object: Runnable { 25 override fun run() { 26 val recentTime = Calendar.getInstance().timeInMillis - startTime 27 if (recentTime > 60*1000 || (application as MyApplication).isRunningInForeground) { 28 Logger.d(TAG, "一定時間経過したのでstopForeground()") 29 stopForeground(true) 30 stopSelf(Define.NotificationId.TALK_START) 31 } else { 32 handler.postDelayed(this, 500L) 33 } 34 } 35})
試したこと
・アプリインストール後、最初のPush通知は正常に受信できる
・複数回のPushを正常に受信できる場合もある
・一度onMessageReceived()が発火しなくなると、以降何度やっても発火しない
・着信通知ではない、通常のPush通知は100%問題なく受信できている
補足情報(FW/ツールのバージョンなど)
Android Studio 4.1.2
Android端末: Google Pixel 4a(5G) Androidバージョン:11
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。