Android 12での通話に関する通知アクション

こんにちは。エキサイト株式会社 Androidエンジニアの克です。

今回はAndroid 12から追加となった、新しい通知スタイルの種類についてお話しします。

※ 今回紹介する内容は Android 12 Beta におけるものです。正式版では仕様が変わっている可能性もあるため詳細については公式のドキュメントを参照してください。

今までの通知アクション

Androidアプリでは通知に対してアクションを設定することができます。

例えば通話の着信に対して応答するなどです。

しかし、基本的にはアクションの見た目をカスタマイズすることはできません。

コード上ではアイコンを設定することもできますが、実際にはAndroid 7.0以降の場合には表示されません。

Android Developers Blog: Notifications in Android N

You’ll note that the icons are not present in the new notifications; instead more room is provided for the labels themselves in the constrained space of the notification shade. However, the notification action icons are still required and continue to be used on older versions of Android and on devices such as Android Wear.

そのため、下記のスクリーンショットのようにぱっと見ただけではどちらが期待するアクションなのか分かりにくいような見た目になってしまいます。

f:id:katsuhiro-ito:20210615184356p:plain

コードはこちらです。

val notification = NotificationCompat.Builder(this, "notification_channel")
    .setSmallIcon(R.drawable.ic_launcher_foreground)
    .setContentText("着信中")
    .addAction(
        NotificationCompat.Action.Builder(
            null,
            "応答する",
            createDeclineIntent(),
        ).build()
    )
    .addAction(
        NotificationCompat.Action.Builder(
            null,
            "拒否する",
            createAnswerIntent(),
        ).build()
    )
    .build()

private fun createDeclineIntent(): PendingIntent {
    TODO("Not yet implemented")
}
private fun createAnswerIntent(): PendingIntent {
    TODO("Not yet implemented")
}

これからの通知アクション

Android 12では新たに通話に関する通知のスタイルが追加されました。

Features and APIs Overview  |  Android 12 Beta  |  Android Developers

こちらを利用すると下記のような見た目になります。

f:id:katsuhiro-ito:20210616102007p:plain

コードはこちらです。 以下では実装のポイントについて説明していきます。

// ①
val person = Person.Builder()
    .setName("太郎")
    .build()

val notification = Notification.Builder(this, "notification_channel")
    .setSmallIcon(R.drawable.ic_launcher_foreground)
    .setStyle(
        // ②
        Notification.CallStyle.forIncomingCall(
            person,
            createDeclineIntent(),
            createAnswerIntent()
        )
    )
    .build()

① 通話相手の設定

Personクラスを用いて、通話相手の情報を設定します。

名前の設定は必須で、オプションとしてアイコンや連絡帳のURIを設定することも可能です。

Person.Builder  |  Android Developers

② 通話用の通知スタイルの設定

通話用の通知スタイルであるNotification.CallStyleはファクトリメソッドから生成します。

通話中の通知スタイルなども使えますが、今回は着信通知を実装するのでforIncomingCallを使います。

①で用意したPersonクラスを最初の引数に渡し、応答時と拒否時に呼び出すPendingIntentも引数に渡します。

実装としてはこれだけで、あとは自動でアクションボタンを用意してくれます。

Notification.CallStyle  |  Android Developers

カスタマイズについて

現状では通話用の通知スタイルにより追加されるアクションボタンはカスタマイズができません。

そのため、文言やアイコンをアプリのブランドに合わせて変更するということができなくなっています。

まだベータ版ですし、今後そういった機能が追加されていくのかもしれません。

まとめ

AndroidはOSのバージョンアップごとにカスタマイズの制約が厳しくなってきている傾向があり、通知も例外ではありません。

その中で公式が表現を広げるための機能を追加してくれることはありがたいことです。

通知というのはAndroidの中でもシステムよりの機能なので、ある程度の統一感があった方がユーザも混乱せずに安心して使うことができます。

統一された表現の中でも、アプリごとの特色を可能な限りで出していけたらいいですね。