Creare una notifica di stile di chiamata per le app di chiamata

Su Android 12.0 (livello API 31) e versioni successive, il sistema fornisce il modello di notifica CallStyle per distinguere gli avvisi di chiamata da altri tipi di notifiche. Utilizza questo modello per creare avvisi di chiamata in arrivo o in corso. Il modello supporta le notifiche di grande formato che includono le informazioni del chiamante e le azioni richieste, ad esempio rispondere o rifiutare le chiamate.

Poiché le chiamate in arrivo e in corso sono eventi ad alta priorità, queste notifiche ricevono la massima priorità nell'area notifiche. Questa classificazione consente inoltre al sistema di inoltrare queste chiamate con priorità ad altri dispositivi.

Il modello di notifica CallStyle include le seguenti azioni obbligatorie:

  • Rispondi o Rifiuta per le chiamate in arrivo.
  • Riaggancia per le chiamate in corso.
  • Rispondi o Riaggancia per il filtro chiamate.

Le azioni in questo stile vengono visualizzate come pulsanti e il sistema aggiunge automaticamente icone e testo appropriati. L'etichettatura manuale dei pulsanti non è supportata. Per saperne di più sui principi di progettazione delle notifiche, consulta Notifiche.

Notifiche in stile chiamata con pulsanti etichettati
Figura 1. Modello CallStyle per le chiamate in arrivo e in corso.

Le azioni richieste vengono trasmesse come intent, ad esempio hangupIntent e answerIntent nelle sezioni seguenti. Ciascuno di questi è un riferimento a un token gestito dal sistema. Il token è un oggetto leggero che può essere passato tra diverse app e processi. Il sistema è responsabile della gestione della durata del token e garantisce che il PendingIntent sia utilizzabile anche se l'app che lo ha creato non è più in esecuzione. Quando concedi a un'altra app un PendingIntent, le concedi l'autorizzazione a eseguire l'operazione specificata, ad esempio rifiutare o rispondere. Questa autorizzazione viene concessa anche se l'app che ha creato l'intent non è in esecuzione. Per saperne di più, consulta la documentazione di riferimento per PendingIntent.

A partire da Android 14 (livello API 34), puoi configurare gli avvisi di chiamata in modo che non possano essere chiusi. Per farlo, utilizza le notifiche CallStyle con Notification.FLAG_ONGOING_EVENT tramite Notification.Builder#setOngoing(true).

Di seguito sono riportati esempi di utilizzo di vari metodi con la notifica CallStyle.

// Create a new call, setting incoming caller.
val incomingCaller = Person.Builder()
    .setName("Jane Doe")
    .setImportant(true)
    .build()

Chiamata in arrivo

Utilizza il metodo forIncomingCall() per creare una notifica con stile di chiamata per una chiamata in arrivo.

// 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)

Chiamata in corso

Utilizza il metodo forOngoingCall() per creare una notifica in stile chiamata per una chiamata in corso.

// 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)

Filtrare una chiamata

Utilizza il metodo forScreeningCall() per creare una notifica in stile chiamata per filtrare una chiamata.

// 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)

Fornire compatibilità con più versioni di Android

Associa le notifiche CallStyle sulle versioni API 30 o precedenti a un servizio in primo piano per assegnare loro il rango elevato che viene loro assegnato nel livello API 31 o versioni successive. Inoltre, le notifiche CallStyle sulla versione 30 o precedente dell'API possono ottenere un ranking simile contrassegnando la notifica come colorata, utilizzando il metodo setColorized().

Utilizza le API Telecom con le notifiche CallStyle. Per saperne di più, consulta Panoramica del framework di telecomunicazioni.