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

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

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

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

  • 着信の場合は [応答] または [拒否]。
  • 通話中の通話の場合は [通話を終了]。
  • 通話スクリーニングの場合は [応答] または [通話を終了]。

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

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

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

Android 14(API レベル 34)以降では、通話通知を閉じることができないように構成できます。これを行うには、CallStyle 通知を Notification.FLAG_ONGOING_EVENT を使用して Notification.Builder#setOngoing(true) します。

以下に、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 フレームワークの概要をご覧ください。