Android 9 มี API ที่รองรับแอปการโทรของบุคคลที่สามได้ดียิ่งขึ้น โดยปกติแล้วแอปการโทรของบุคคลที่สาม
จะใช้ Telephony API เช่น PHONE_STATE
broadcast เพื่อให้ใช้งานร่วมกับการโทรของผู้ให้บริการได้ ด้วยเหตุนี้
แอปการโทรของบุคคลที่สามจึงต้องให้ความสำคัญกับการโทรผ่านผู้ให้บริการ และมักจะ
ปฏิเสธสายเรียกเข้าในแอปโดยไม่แจ้งให้ทราบ หรือวางสายที่กำลังคุยอยู่เพื่อ
เปิดทางให้สายของผู้ให้บริการ
API ใน Android 9 รองรับสถานการณ์การโทรพร้อมกันระหว่างแอปของบุคคลที่สาม กับการโทรของผู้ให้บริการ ซึ่งจะช่วยให้คุณรับสายเรียกเข้าจากบุคคลที่สามขณะที่กำลังคุยสายจากผู้ให้บริการได้ เป็นต้น เฟรมเวิร์กจะรับผิดชอบในการตรวจสอบว่าสายจากผู้ให้บริการยังคงดำเนินต่อไปเมื่อผู้ใช้เข้าร่วมการโทรของบุคคลที่สาม
ใน Android 9 เราขอแนะนำให้แอปโทรของบุคคลที่สามใช้คลาส ConnectionService ที่จัดการด้วยตนเอง ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้างแอปโทรโดยใช้คลาสนี้ได้ที่สร้างแอปโทรโดยใช้ไลบรารี Core-Telecom
คลาส ConnectionService ที่จัดการด้วยตนเองยังช่วยให้นักพัฒนาแอปมีโอกาส
เลือกใช้การบันทึกการโทรในแอปของตนลงในบันทึกการโทรของระบบ (ดูEXTRA_LOG_SELF_MANAGED_CALLS) ตามข้อกำหนดในเอกสารคำจำกัดความความเข้ากันได้ของ Android (CDD) (ส่วน 7.4.1.2) คุณควรตรวจสอบว่าแอปโทรศัพท์หรือแอปโทรออกแสดงรายการบันทึกการโทรเหล่านี้และแสดงชื่อของ
แอปโทรของบุคคลที่สามที่ใช้โทร (ดูตัวอย่างวิธีที่แอปโทรออก AOSP เป็นไปตามข้อกำหนดนี้ได้ที่รายการบันทึกการโทรจากแอปโทรของบุคคลที่สาม)
แอปมีหน้าที่รับผิดชอบในการตั้งค่า CAPABILITY_SUPPORT_HOLD และ
CAPABILITY_HOLD ในการเชื่อมต่อของแอป อย่างไรก็ตาม อาจมีบางกรณีที่แอปไม่สามารถพักสายได้ กรอบการทำงานมี
บทบัญญัติสำหรับการแก้ไขกรณีประเภทนี้
สถานการณ์
คุณควรแก้ไขแอปโทรศัพท์เพื่อรองรับสถานการณ์ต่อไปนี้
จัดการสายเรียกเข้าที่ทำให้สายที่สนทนาอยู่ถูกตัด
ในกรณีที่มีการโทรของบุคคลที่สามที่กำลังดำเนินอยู่ (เช่น ในการโทร SuperCaller ) ซึ่งไม่รองรับการพักสาย และผู้ใช้รับสายโทรศัพท์มือถือ (เช่น ใช้ผู้ให้บริการ FooCom) แอปโทรศัพท์หรือแอปโทรออกควรระบุให้ผู้ใช้ทราบว่าการรับสายโทรศัพท์มือถือจะทำให้การโทรของบุคคลที่สามที่กำลังดำเนินอยู่สิ้นสุดลง
ประสบการณ์ของผู้ใช้มีความสำคัญเนื่องจากแอปการโทรของบุคคลที่สามอาจมีการโทรที่กำลังดำเนินอยู่ซึ่งเฟรมเวิร์กไม่สามารถพักสายได้ การรับสายใหม่บนมือถือ จะทำให้การโทรของบุคคลที่สามที่กำลังดำเนินอยู่ถูกตัดสาย
ดูตัวอย่างอินเทอร์เฟซผู้ใช้ในรูปภาพ
รูปที่ 1 สายเรียกเข้าตัดสายที่สนทนากับบุคคลที่สามอยู่
แอปโทรศัพท์สามารถตรวจสอบได้ว่าสายเรียกเข้าทำให้สายอื่นถูกตัดหรือไม่โดยการตรวจสอบข้อมูลเพิ่มเติมของการโทร ตรวจสอบว่าได้ตั้งค่า
EXTRA_ANSWERING_DROPS_FG_CALL เป็น TRUE และตั้งค่า
EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME เป็นชื่อแอป
ที่ระบบตัดสายเมื่อรับสายเรียกเข้าบนมือถือ
รายการบันทึกการโทรจากแอปการโทรของบุคคลที่สาม
นักพัฒนาแอปโทรของบุคคลที่สามสามารถเลือกให้ระบบบันทึกการโทรในแอปของตนเอง
ลงในบันทึกการโทรของระบบได้ (ดู EXTRA_LOG_SELF_MANAGED_CALLS) ซึ่งหมายความว่า
อาจมีรายการในบันทึกการโทรที่ไม่ใช่การโทรผ่านเครือข่ายมือถือ
เมื่อแอปโทรศัพท์ของ AOSP แสดงรายการบันทึกการโทรที่เกี่ยวข้องกับแอปการโทรของบุคคลที่สาม ระบบจะแสดงชื่อของแอปที่ใช้โทรในบันทึกการโทร ดังที่แสดงในรูป
รูปที่ 2 รายการบันทึกการโทรที่มีชื่อแอปการโทรของบุคคลที่สามในแอปโทรศัพท์
หากต้องการระบุชื่อแอปที่เชื่อมโยงกับรายการบันทึกการโทร ให้ใช้คอลัมน์
PHONE_ACCOUNT_COMPONENT_NAME และ PHONE_ACCOUNT_ID ใน
ผู้ให้บริการบันทึกการโทรเพื่อสร้างอินสแตนซ์ของ PhoneAccountHandle ซึ่ง
ระบุแหล่งที่มาของรายการบันทึกการโทร ค้นหา TelecomManager เพื่อดู
รายละเอียดของชั้นเรียน PhoneAccount หากต้องการดูว่ารายการบันทึกการโทรมาจากแอปการโทรของบุคคลที่สามหรือไม่ ให้ตรวจสอบความสามารถของ PhoneAccount เพื่อดูว่ามีการตั้งค่า CAPABILITY_SELF_MANAGED หรือไม่
เมธอด getLabel ของ PhoneAccount ที่ส่งคืนจะแสดงชื่อของ
แอปที่เชื่อมโยงกับรายการบันทึกการโทรจากแอปการโทรของบุคคลที่สาม
การควบคุมการผสานรวมบันทึกการโทรผ่าน VoIP
ตั้งแต่ Android 17 (API ระดับ 37) เป็นต้นไป แอปการโทรผ่าน VoIP ของบุคคลที่สาม
ที่ผสานรวมกับ Core-Telecom และ CallsManager จะเขียนประวัติการโทร
ลงในบันทึกการโทรของระบบ Android ดั้งเดิม (CallLog.Calls) ได้โดยตรง
เพื่อให้มั่นใจว่าความเป็นส่วนตัวของผู้ใช้และการจัดระเบียบข้อมูลจะสอดคล้องกันทั่วทั้งระบบนิเวศของ Android อุปกรณ์ Android 17 (ระดับ API 37) ขึ้นไปทั้งหมดที่ประกาศแฟล็กฟีเจอร์โทรคมนาคม (android.software.telecom) และมีบทบาท android.app.role.DIALER ต้องรองรับการควบคุมการผสานรวมบันทึกการโทรผ่าน VoIP ต่อแอปตามเอกสารนิยามความเข้ากันได้ (CDD) ของ Android
ข้อกำหนดในการใช้งานอุปกรณ์
อุปกรณ์ต้องมีหน้าจอการตั้งค่าที่ผู้ใช้เข้าถึงได้ (โดยปกติจะอยู่ที่ การตั้งค่า > บัญชีการโทร > บันทึกการโทรที่ผสานรวม) ซึ่งช่วยให้ผู้ใช้ ดูและเปิด/ปิดการผสานรวมบันทึกการโทรสำหรับแอป VoIP ของบุคคลที่สามแต่ละแอปได้
หากต้องการปฏิบัติตามข้อกำหนดนี้ คุณต้องผสานรวมค่าเริ่มต้นของแพลตฟอร์มสต็อก
- การผสานรวมการตั้งค่าแพลตฟอร์ม: ตรวจสอบว่าอุปกรณ์มี
com.android.phone.settings.PhoneAccountSettingsActivityที่ แพลตฟอร์ม Android จัดเตรียมให้ตั้งแต่แกะกล่อง (com.android.phone) - ข้อกำหนดในการแก้ปัญหา Intent: อุปกรณ์ของคุณต้องแก้ปัญหา Intent
TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION(android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) ไปยัง หน้าจอการจัดการแพลตฟอร์มหุ้น
เมื่อแอป พรอมต์ของระบบ หรือ Deep Link เรียกใช้รายการต่อไปนี้ ความตั้งใจต้องเปิดใช้PhoneAccountSettingsActivityได้สำเร็จและต้องไม่แสดงActivityNotFoundException
Intent intent = new Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION);
context.startActivity(intent);
การตรวจสอบ
หากต้องการทดสอบว่าอุปกรณ์รองรับแอปการโทรของบุคคลที่สามหรือไม่ ให้ใช้แอป Telecomm
test ซึ่งใช้คลาส ConnectionService ที่จัดการด้วยตนเอง แอป
อยู่ใน
/packages/services/Telecomm/testapps/
สร้างแอปทดสอบจากรูทของที่เก็บซอร์สโค้ด Android โดยใช้คำสั่งต่อไปนี้
mmma packages/services/Telecomm/testapps/ติดตั้ง APK ของบิลด์โดยใช้
adb install -g -r <apk path>จากนั้นระบบจะเพิ่มไอคอน Self-Managed Sample ลงใน Launcherแตะไอคอนเพื่อเปิดแอปทดสอบ
จัดการสายเรียกเข้าที่ทำให้สายที่สนทนาอยู่ถูกตัด
ทำตามขั้นตอนต่อไปนี้เพื่อยืนยันว่าสายเรียกเข้าจะตัดสายเรียกของบุคคลที่สามที่กำลังดำเนินการอยู่
รูปที่ 3 ทดสอบแอปด้วยการติดตั้งใช้งานตัวอย่างของคลาส ConnectionService
- ยกเลิกการเลือกตัวเลือกจองได้
- แตะสายโทรออกเพื่อเริ่มการโทรขาออกตัวอย่างใหม่
- แตะปุ่มใช้งานอยู่เพื่อให้การโทรใช้งานได้
- โทรไปยังหมายเลขโทรศัพท์ของอุปกรณ์ที่อยู่ระหว่างการทดสอบด้วยโทรศัพท์เครื่องอื่น ซึ่งจะ เรียกใช้สถานการณ์ที่โปรแกรมโทรศัพท์ของคุณได้รับชื่อแอป ซึ่งจะทำให้ระบบตัดสาย
- เมื่อเสร็จแล้ว ให้แตะปุ่มยกเลิกการเชื่อมต่อในแอปทดสอบ
รายการบันทึกการโทรจากแอปการโทรของบุคคลที่สาม
หลังจากทำตามขั้นตอนข้างต้นแล้ว แอปทดสอบควรบันทึกการเรียกไปยัง บันทึกการเรียกของระบบ หากต้องการยืนยันว่าอุปกรณ์บันทึกการโทรจากแอปการโทรของบุคคลที่สาม ให้ เปิดแอปโทรศัพท์และยืนยันว่าการโทรปรากฏในบันทึกการโทรของระบบ
การควบคุมการผสานรวมบันทึกการโทรผ่าน VoIP
หากต้องการยืนยันการปฏิบัติตามข้อกำหนดเกี่ยวกับเจตนาในการผสานรวมบันทึกการโทรผ่าน VoIP ใน Android 17 ขึ้นไป ให้เรียกใช้การทดสอบ CtsTelecomTestCasesชุดเครื่องมือทดสอบความเข้ากันได้ (CTS) การทดสอบนี้จะยืนยันข้ามขอบเขตแพ็กเกจว่าการส่ง
TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION
(android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) จะได้รับการแก้ไขในอุปกรณ์
เป็นตัวแฮนเดิลกิจกรรมที่ส่งออกที่ถูกต้อง (resolveActivity ตรวจสอบ)