質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

2060閲覧

通話着信通知を正常に表示できない

gittib_gittib

総合スコア102

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2021/05/19 04:48

編集2021/05/28 08:18

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

どうやら、サーバーサイドの実装に問題があったようです。
Firebase Cloud Messaging の古いAPIを直接利用してPush通知を送っており、その送信処理のどこかに原因があったのではないかと考えています。

詳しい原因の特定まではできていませんが、AWS SNS を代わりに利用するようサーバーサイドを改修したところ、質問内容の問題は解決できました。
Android側の実装は特に変えていません。

投稿2021/05/28 08:10

gittib_gittib

総合スコア102

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問