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

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

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

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

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

ลงทะเบียน 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 ลงใน Content Provider CallLog.Calls เพื่อแสดงบันทึกการโทร VoIP

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

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

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

หากต้องการเริ่มการติดต่อกลับจากแอปโทรศัพท์เริ่มต้น ให้ใช้ TelecomManager.placeCall แพลตฟอร์มจะใช้ CallLog.Calls._ID ที่ไม่ซ้ำกันของรายการบันทึกการโทรเพื่อเปิดแอป VoIP ที่ถูกต้อง การเปิดนี้รวมถึง TelecomManager.ACTION_CALL_BACK Intent ซึ่งเป็นการดำเนินการที่ระบบกำหนดไว้สำหรับการเริ่มการโทรกลับ Intent นี้มี UUID ของการโทรใน Intent เพิ่มเติม 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)