通話アプリ向けの通話スタイル通知を作成する

Android 12.0(API レベル 31)以降では、通話通知を他の種類の通知と区別するために、CallStyle 通知テンプレートが用意されています。このテンプレートは、着信通知または通話中の通知を作成するために使用します。このテンプレートは、発信者情報と、通話への応答や拒否などの必要な操作を含む、大きな形式の通知をサポートしています。

着信通話と進行中の通話は優先度の高いイベントであるため、これらの通知は通知シェードで最優先されます。このランキングにより、システムは優先度の高い通話を他のデバイスに転送することもできます。

CallStyle 通知テンプレートには、次の必須アクションが含まれています。

  • 着信に対して「応答」または「拒否」
  • 進行中の通話を終了する。
  • 通話スクリーニングの応答または終了。

このスタイルのアクションはボタンとして表示され、システムによって適切なアイコンとテキストが自動的に追加されます。ボタンの手動ラベル付けはサポートされていません。通知のデザイン原則について詳しくは、通知をご覧ください。

ラベル付きボタンのある通話スタイルの通知
図 1. 着信および進行中の通話用の CallStyle テンプレート。

必要なアクションは、次のセクションの hangupIntent や answerIntent などのインテントとして渡されます。それぞれが、システムによって管理されているトークンへの参照です。トークンは、さまざまなアプリやプロセス間で渡すことができる軽量なオブジェクトです。システムは、トークンの有効期間を管理し、トークンを作成したアプリが実行されていない場合でも PendingIntent を使用できるようにします。別のアプリに PendingIntent を付与すると、拒否や応答など、指定されたオペレーションを実行する権限を付与することになります。この権限は、インテントを作成したアプリが実行されていない場合でも付与されます。詳細については、PendingIntent のリファレンス ドキュメントをご覧ください。

Android 14(API レベル 34)以降では、着信通知を閉じられないように設定できます。これを行うには、Notification.Builder#setOngoing(true) を介して Notification.FLAG_ONGOING_EVENT で 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 を使用します。詳細については、Telecom フレームワークの概要をご覧ください。