Tạo thông báo kiểu cuộc gọi cho ứng dụng gọi điện

Trên Android 12.0 (cấp độ API 31) trở lên, hệ thống cung cấp mẫu thông báo CallStyle để phân biệt thông báo cuộc gọi với các loại thông báo khác. Sử dụng mẫu này để tạo thông báo cuộc gọi đến hoặc cuộc gọi đang diễn ra. Mẫu này hỗ trợ các thông báo có định dạng lớn, bao gồm thông tin người gọi và các thao tác bắt buộc như trả lời hoặc từ chối cuộc gọi.

Vì cuộc gọi đến và cuộc gọi đang diễn ra là các sự kiện có mức độ ưu tiên cao, nên các thông báo này sẽ được ưu tiên hàng đầu trong ngăn thông báo. Thứ hạng này cũng cho phép hệ thống chuyển tiếp các cuộc gọi ưu tiên này đến các thiết bị khác.

Mẫu thông báo CallStyle bao gồm các hành động bắt buộc sau:

  • Trả lời hoặc Từ chối cuộc gọi đến.
  • Gác máy khi có cuộc gọi đang diễn ra.
  • Trả lời hoặc Gác máy để sàng lọc cuộc gọi.

Các thao tác theo kiểu này xuất hiện dưới dạng nút, hệ thống sẽ tự động thêm biểu tượng và văn bản thích hợp. Không hỗ trợ gắn nhãn thủ công cho các nút. Để biết thêm thông tin về các nguyên tắc thiết kế thông báo, hãy xem phần Thông báo.

Thông báo theo kiểu cuộc gọi có nút được gắn nhãn
Hình 1. Mẫu CallStyle cho cuộc gọi đến và cuộc gọi đang diễn ra.

Các hành động bắt buộc được truyền dưới dạng ý định, chẳng hạn như hangupIntent và answerIntent trong các phần sau. Mỗi mã này là một mã tham chiếu đến mã thông báo do hệ thống duy trì. Mã thông báo là một đối tượng gọn nhẹ có thể được truyền giữa các ứng dụng và quy trình khác nhau. Hệ thống chịu trách nhiệm quản lý thời gian hoạt động của mã thông báo và đảm bảo rằng PendingIntent có thể sử dụng được ngay cả khi ứng dụng tạo mã thông báo đó không còn chạy nữa. Khi cấp PendingIntent cho một ứng dụng khác, bạn đang cấp cho ứng dụng đó quyền thực hiện thao tác được chỉ định, chẳng hạn như từ chối hoặc trả lời. Quyền này được cấp ngay cả khi ứng dụng tạo ý định không chạy. Để biết thêm thông tin, hãy xem tài liệu tham khảo về PendingIntent.

Kể từ Android 14 (cấp độ API 34), bạn có thể định cấu hình thông báo cuộc gọi để không thể đóng. Để làm vậy, hãy sử dụng thông báo CallStyle với Notification.FLAG_ONGOING_EVENT thông qua Notification.Builder#setOngoing(true).

Sau đây là ví dụ về cách sử dụng nhiều phương thức với thông báo CallStyle.

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

Cuộc gọi đến

Sử dụng phương thức forIncomingCall() để tạo thông báo kiểu cuộc gọi cho cuộc gọi đến.

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

Cuộc gọi đang diễn ra

Sử dụng phương thức forOngoingCall() để tạo thông báo kiểu cuộc gọi cho một cuộc gọi đang diễn ra.

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

Sàng lọc cuộc gọi

Sử dụng phương thức forScreeningCall() để tạo thông báo kiểu cuộc gọi nhằm sàng lọc cuộc gọi.

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

Cung cấp khả năng tương thích trên nhiều phiên bản Android hơn

Liên kết thông báo CallStyle trên API phiên bản 30 trở xuống với một dịch vụ nền trước để chỉ định thứ hạng cao cho các thông báo đó trong cấp độ API 31 trở lên. Ngoài ra, thông báo CallStyle trên API phiên bản 30 trở xuống có thể đạt được thứ hạng tương tự bằng cách đánh dấu thông báo là có màu, sử dụng phương thức setColorized().

Sử dụng Telecom API với thông báo CallStyle. Để biết thêm thông tin, hãy xem bài viết Tổng quan về khung viễn thông.