ประวัติการโทรแบบรวม

แอปพลิเคชัน VoIP สามารถผสานรวมการโทรเข้ากับบันทึกการโทรของระบบ ซึ่งจะช่วยให้ผู้ใช้ดูประวัติการโทรผ่าน VoIP ได้จากส่วนกลางในแอปโปรแกรมโทรศัพท์ของระบบ และโทรกลับจากแอปโปรแกรมโทรศัพท์ได้โดยตรง คู่มือนี้อธิบายการเปลี่ยนแปลงที่จำเป็นสำหรับแอปการโทรผ่าน VoIP แอปโปรแกรมโทรศัพท์ของระบบ และ การจัดการการตั้งค่าประวัติการโทรแบบรวม

การเปลี่ยนแปลงสำหรับแอปการโทร

หากต้องการผสานรวมแอป VoIP กับบันทึกการโทรของระบบ ให้ทำตามขั้นตอนต่อไปนี้

ลงทะเบียนตัวกรอง Intent ของการเรียกกลับ

ลงทะเบียนเจตนาที่ระบบป้องกัน TelecomManager.ACTION_CALL_BACK

เมื่อลงทะเบียนตัวกรอง Intent นี้อย่างถูกต้องแล้ว ระบบจะบันทึกการเรียกใดๆ ที่แอปของคุณเพิ่มโดยใช้ CallsManager.addCall หรือ API ของ Telecom อื่นๆ ที่เกี่ยวข้องโดยอัตโนมัติ ระบบจะใช้ Intent ที่ลงทะเบียนนี้เพื่อส่ง การเรียกกลับไปยังแอปในภายหลังเมื่อผู้ใช้เลือกรายการบันทึกการโทรผ่าน VoIP ในแป้นโทร เพื่อโทรกลับ

<!-- Activity to handle the callback intent from the system dialer -->
<activity
    android:name=".VoipCallActivity"
    android:exported="true">

    <!-- Register callback intent -->
    <intent-filter>
        <action android:name="android.telecom.action.CALL_BACK" />
    </intent-filter>
</activity>

ยกเว้นการบันทึกการโทร

เมื่อลงทะเบียนการโทรกลับแล้ว ระบบจะบันทึกการโทรทั้งหมดไปยังโปรแกรมโทรศัพท์ของระบบ หากต้องการยกเว้นการโทรทีละครั้ง ให้ตั้งค่าบูลีน isLogExcluded เป็น true ภายใน CallAttributesCompat

CallAttributesCompat(
    displayName = displayName,
    address = address,
    isLogExcluded = excludeCallLogging, // to exclude call from logging
    direction = if (isIncoming) {
        CallAttributesCompat.DIRECTION_INCOMING
    } else {
        CallAttributesCompat.DIRECTION_OUTGOING
    },
    callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL,
    callCapabilities = (
        CallAttributesCompat.SUPPORTS_SET_INACTIVE
            or CallAttributesCompat.SUPPORTS_STREAM
            or CallAttributesCompat.SUPPORTS_TRANSFER
        ),
)

จัดการการติดต่อกลับ

การโทรที่เพิ่มผ่าน CallsManager.addCall จะได้รับ UUID ที่ไม่ซ้ำกันผ่าน CallControlScope.getCallId

// check the intent action for CALL_BACK
if (intent.action == TelecomManager.ACTION_CALL_BACK) {
    launchCall(
        // fetching stored call details for the UUID to initiate callback
        callDetails = getCallDetails(
            uuid = intent.getStringExtra(TelecomManager.EXTRA_UUID)
        )
    )
}

ยืนยันรายการบันทึกการโทร

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

หากต้องการดูรายการ UUID ปัจจุบันที่เชื่อมโยงกับแอปภายในบันทึกของระบบ ให้ใช้ CallLog.Calls.CONTENT_VOIP_URI

การเปลี่ยนแปลงสำหรับแอปแป้นโทรศัพท์

ทำตามขั้นตอนต่อไปนี้เพื่อเปิดใช้แอปโทรศัพท์ให้แสดงบันทึกการโทรผ่าน VoIP และ เริ่มการโทรกลับไปยังแอป VoIP

แสดงบันทึกการโทรผ่าน VoIP ในแอปโทรศัพท์

โดยค่าเริ่มต้น บันทึกการโทรของแอป VoIP จะไม่ปรากฏในแอปโทรศัพท์ หากต้องการแสดง บันทึกการโทรที่ผสานรวมในแอปโทรศัพท์ ให้ทำดังนี้

  • ใน Android 16.1 (ระดับ API 36.1) ให้ต่อท้ายพารามิเตอร์การค้นหา include_voip_calls ไปยัง CallLog.Calls Content Provider เพื่อแสดงบันทึกการโทรผ่าน VoIP

    CallLog.Calls.CONTENT_URI.buildUpon()
        .appendQueryParameter("include_voip_calls", "true")
        .build()

  • ใน Android 17 (ระดับ API 37) ขึ้นไป ให้ใช้ Content Provider และคีย์พารามิเตอร์ที่จัดรูปแบบแล้วต่อไปนี้

เริ่มการโทรกลับจากแอปแป้นโทรศัพท์

หากต้องการเริ่มการโทรกลับจากแป้นโทร ให้ใช้ TelecomManager.placeCall แพลตฟอร์มใช้ CallLog.Calls._ID ที่ไม่ซ้ำกันของรายการบันทึกการโทรเพื่อเปิด แอป VoIP ที่ถูกต้อง การเปิดนี้รวมถึง Intent TelecomManager.ACTION_CALL_BACK ซึ่งเป็นการดำเนินการที่ระบบกำหนด สำหรับการเริ่มการโทรกลับ Intent นี้มี UUID ของการโทรใน Intent Extra TelecomManager.EXTRA_UUID ซึ่งช่วยให้แอป VoIP ระบุได้ว่า มีการโทรกลับการโทรใด

// Uri generated with unique ID of the call log entry to launch the respective VoIP app for callback
val address = ContentUris.withAppendedId(CallLog.Calls.CONTENT_URI, callId)

// extra information required to initiate callback
val extras = Bundle()

telecomManager.placeCall(address, extras)

จัดการการตั้งค่าประวัติการโทรแบบรวม

ตั้งแต่ Android 17 (ระดับ API 37) เป็นต้นไป ผู้ใช้จะดูและเปิด/ปิดประวัติการโทรแบบรวมได้ทีละแอปในการตั้งค่าระบบ (โดยปกติจะอยู่ภายใต้การตั้งค่า > บัญชีการโทร > บันทึกการโทรแบบผสานรวม หรือภายในแอปโทรศัพท์เริ่มต้นโดยตรง) ทั้งแอปโทรของบุคคลที่สามและแอปแป้นโทรศัพท์สามารถโต้ตอบกับการตั้งค่าเหล่านี้ได้

หากต้องการเปิดการตั้งค่าประวัติการโทรแบบรวม ให้เริ่มกิจกรรมด้วยการดำเนินการผ่าน Intent TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION

val intent = Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION)
startActivity(intent)

เมื่อผู้ใช้ปิดประวัติการโทรแบบรวมสำหรับแอปในการตั้งค่าระบบ ระบบจะลบรายการบันทึกการโทรที่มีอยู่ทั้งหมดสำหรับแพ็กเกจนั้นออกจากผู้ให้บริการบันทึกการโทรดั้งเดิม (CallLog.Calls) ทันทีและถาวร การโทรในอนาคตที่เริ่มหรือรับสำหรับแอปนั้นจะไม่ได้รับการบันทึกในโปรแกรมโทรศัพท์ของระบบ

ฟังการเปลี่ยนแปลงค่ากำหนด

หากต้องการให้ข้อมูลซิงค์อยู่เสมอเมื่อผู้ใช้เปิดหรือปิดใช้ประวัติการโทรแบบรวมสำหรับแอปการโทรของคุณในการตั้งค่าระบบหรือแป้นโทรศัพท์ ให้ลงทะเบียน Broadcast Receiver สำหรับTelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE (android.telecom.action.VOIP_CALL_LOG_PREFERENCE) Intent การออกอากาศ

val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE) {
            // Status of the Unified Call History of the app
            val isEnabled = intent.getBooleanExtra(
                TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS,
                true
            )
        }
    }
}

เมื่อผู้ใช้สลับปุ่มเปิด/ปิด แพลตฟอร์มจะออกอากาศความตั้งใจนี้ไปยังแอปของคุณซึ่งมีสถานะบูลีนที่อัปเดตแล้วในส่วนTelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS แอปของคุณสามารถฟังการออกอากาศนี้แทนการรอการยืนยันเป็นระยะๆ กับ CallLog.Calls ได้ เมื่อปิดใช้ประวัติการโทรแบบรวม (กล่าวคือ ตั้งค่าเป็น false) แอปจะอัปเดตสถานะภายในหรือล้างข้อมูลได้ เช่น ล้างการแมปการโทรที่แคชไว้ในเครื่องซึ่งใช้สำหรับการจัดการการเรียกกลับ