Android 12.0(API レベル 31)以降では、システムは CallStyle 通知テンプレートを提供し、通話通知を他の種類の通知と区別します。このテンプレートを使用して、着信または進行中の通話の通知を作成します。このテンプレートは、発信者情報や、通話への応答や拒否などの必要なアクションを含む、大判の通知をサポートしています。
着信と進行中の通話は優先度の高いイベントであるため、こうした通知は通知シェード内で最優先されます。このランキングにより、システムがこうした優先度の高い通話を他のデバイスに転送することもできます。
CallStyle 通知テンプレートには、次の必須アクションが含まれています。
- 着信には [応答] または [拒否] をタップします。
- 進行中の通話の [通話を終了]。
- 通話スクリーニングで [応答] または [電話を切る] をタップします。
このスタイルのアクションはボタンとして表示され、適切なアイコンとテキストがシステムによって自動的に追加されます。ボタンの手動ラベル付けはサポートされていません。通知の設計原則について詳しくは、通知をご覧ください。
必要なアクションは、以降のセクションで hangupIntent や answerIntent などのインテントとして渡されます。それぞれは、システムによって管理されているトークンへの参照です。トークンは、さまざまなアプリやプロセス間で渡すことができる軽量なオブジェクトです。システムは、トークンの有効期間を管理し、トークンを作成したアプリが実行されなくなっても PendingIntent が使用可能であることを保証します。別のアプリに PendingIntent を付与すると、そのアプリに、拒否や応答などの指定されたオペレーションを実行する権限が付与されます。この権限は、インテントを作成したアプリが実行されていない場合でも付与されます。詳細については、PendingIntent のリファレンス ドキュメントをご覧ください。
Android 14(API レベル 34)以降では、通話通知を閉じることができないように設定できます。これを行うには、Notification.FLAG_ONGOING_EVENT から Notification.Builder#setOngoing(true) までの CallStyle 通知を使用します。
以下に、CallStyle 通知でさまざまなメソッドを使用する例を示します。
// Create a new call, setting incoming caller. val incomingCaller = Person.Builder() .setName("Jane Doe") .setImportant(true) .build()
着信
forIncomingCall() メソッドを使用して、着信の通話スタイル通知を作成します。
// For demonstrative purposes only, should use a well-defined Intents. val contentIntent = PendingIntent.getActivity(context, 0, Intent(), PendingIntent.FLAG_IMMUTABLE) val declineIntent = PendingIntent.getActivity(context, 0, Intent(), PendingIntent.FLAG_IMMUTABLE) val hangupIntent = PendingIntent.getActivity(context, 0, Intent(), PendingIntent.FLAG_IMMUTABLE) val answerIntent = PendingIntent.getActivity(context, 0, Intent(), PendingIntent.FLAG_IMMUTABLE) // Create a call style notification for an incoming call. val builderForIncomingCall = NotificationCompat.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(R.drawable.ic_logo) .setStyle( NotificationCompat.CallStyle.forIncomingCall(incomingCaller, declineIntent, answerIntent)) .addPerson(incomingCaller)
通話中
forOngoingCall() メソッドを使用して、進行中の通話の通話スタイル通知を作成します。
// Create a call style notification for an ongoing call. val builderForOngoingCall = NotificationCompat.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(R.drawable.ic_logo) .setStyle( NotificationCompat.CallStyle.forOngoingCall(callerAtOtherEnd, hangupIntent)) .addPerson(caller)
通話スクリーニング
forScreeningCall() メソッドを使用して、通話をスクリーニングするための通話スタイル通知を作成します。
// Create a call style notification for screening a call. val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setContentIntent(contentIntent) .setSmallIcon(R.drawable.ic_logo) .setStyle( NotificationCompat.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent)) .addPerson(caller)
より多くの Android バージョンで互換性を提供
API バージョン 30 以前の CallStyle 通知をフォアグラウンド サービスに関連付けて、API レベル 31 以降で付与される高いランクを割り当てます。また、API バージョン 30 以前の CallStyle 通知では、setColorized() メソッドを使用して通知を色付きとしてマークすることで、同様のランキングを実現できます。
CallStyle 通知で Telecom API を使用します。詳しくは、テレコム フレームワークの概要をご覧ください。