สร้างการแจ้งเตือนรูปแบบการโทรสำหรับแอปการโทร

ใน Android 12.0 (ระดับ API 31) ขึ้นไป ระบบจะมีเทมเพลตการแจ้งเตือน CallStyle เพื่อแยกการแจ้งเตือนสายเรียกเข้าออกจากการแจ้งเตือนประเภทอื่นๆ ใช้เทมเพลตนี้เพื่อสร้างการแจ้งเตือนสายเรียกเข้าหรือสายที่กำลังสนทนาอยู่ เทมเพลตนี้รองรับการแจ้งเตือนขนาดใหญ่ซึ่งมีข้อมูลผู้โทรและการดำเนินการที่จำเป็น เช่น การรับสายหรือปฏิเสธสาย

เนื่องจากการโทรเข้าและการโทรที่ดำเนินอยู่เป็นเหตุการณ์ที่มีลำดับความสำคัญสูง การแจ้งเตือนเหล่านี้จึงได้รับลำดับความสำคัญสูงสุดในหน้าต่างแจ้งเตือน การจัดอันดับนี้ยังช่วยให้ระบบส่งต่อการโทรที่มีลำดับความสำคัญเหล่านี้ไปยังอุปกรณ์อื่นๆ ได้ด้วย

เทมเพลตการแจ้งเตือน CallStyle มีการดำเนินการที่จำเป็นต่อไปนี้

  • รับสายหรือปฏิเสธสายเรียกเข้า
  • วางสายสำหรับการโทรที่กำลังดำเนินอยู่
  • รับสายหรือวางสายสำหรับการสกรีนสายเรียกเข้า

การดำเนินการในรูปแบบนี้จะปรากฏเป็นปุ่ม โดยระบบจะเพิ่มไอคอนและข้อความที่เหมาะสมโดยอัตโนมัติ ระบบไม่รองรับการติดป้ายกำกับปุ่มด้วยตนเอง ดูข้อมูลเพิ่มเติมเกี่ยวกับหลักการออกแบบการแจ้งเตือนได้ที่การแจ้งเตือน

การแจ้งเตือนสไตล์การโทรพร้อมปุ่มที่มีป้ายกำกับ
รูปที่ 1 เทมเพลต CallStyle สำหรับสายเรียกเข้าและสายที่กำลังสนทนา

การดำเนินการที่จำเป็นจะส่งผ่านเป็น Intent เช่น hangupIntent และ answerIntent ในส่วนต่อไปนี้ โดยแต่ละรายการจะอ้างอิงถึงโทเค็นที่ระบบเก็บรักษาไว้ โทเค็นเป็นออบเจ็กต์ขนาดเล็กที่สามารถส่งผ่านระหว่างแอปและกระบวนการต่างๆ ได้ ระบบมีหน้าที่จัดการอายุการใช้งานของโทเค็นและตรวจสอบว่า PendingIntent ใช้งานได้แม้ว่าแอปที่สร้างโทเค็นจะไม่ได้ทำงานอยู่แล้วก็ตาม เมื่อคุณให้ PendingIntent แก่แอปอื่น หมายความว่าคุณให้สิทธิ์แอปนั้นในการดำเนินการตามที่ระบุ เช่น ปฏิเสธหรือรับสาย สิทธิ์นี้จะได้รับแม้ว่าแอปที่สร้าง Intent จะไม่ได้ทำงานอยู่ก็ตาม ดูข้อมูลเพิ่มเติมได้ที่เอกสารอ้างอิงสำหรับ 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 เวอร์ชันต่างๆ มากขึ้น

เชื่อมโยงการแจ้งเตือน CallStyle ใน API เวอร์ชัน 30 หรือต่ำกว่ากับบริการที่ทำงานอยู่เบื้องหน้าเพื่อกำหนดอันดับสูงให้กับการแจ้งเตือนเหล่านั้นในระดับ API 31 ขึ้นไป นอกจากนี้ การแจ้งเตือน CallStyle ใน API เวอร์ชัน 30 หรือก่อนหน้าจะได้รับการจัดอันดับที่คล้ายกันโดยทำเครื่องหมายการแจ้งเตือนเป็นแบบมีสีโดยใช้เมธอด setColorized()

ใช้ Telecom API กับการแจ้งเตือนของ CallStyle ดูข้อมูลเพิ่มเติมได้ที่ภาพรวมเฟรมเวิร์กของ Telecom