Core-Telecom

ไลบรารี Core-Telecom จะช่วยปรับปรุงกระบวนการผสานรวมแอปพลิเคชันการโทรเข้ากับแพลตฟอร์ม Android ด้วยการจัดเตรียมชุด API ที่มีประสิทธิภาพและสม่ำเสมอ

หากต้องการดูการใช้งานจริง คุณสามารถดูตัวอย่างแอปพลิเคชันบน GitHub ได้ที่

  • แอปตัวอย่างขนาดเบา — ตัวอย่างการใช้งาน Core-Telecom API ขั้นต่ำ เหมาะสำหรับการทำความเข้าใจแนวคิดพื้นฐานอย่างรวดเร็ว
  • ตัวอย่างแอปที่ครอบคลุม (พัฒนาโดยทีม Core-Telecom) — แอปพลิเคชันที่มาพร้อมฟีเจอร์มากมายซึ่งแสดงฟังก์ชันการทำงานขั้นสูงและแนวทางปฏิบัติแนะนำของโทรคมนาคม นี่เป็นแหล่งข้อมูลที่ยอดเยี่ยมในการทำความเข้าใจสถานการณ์การผสานรวมที่ซับซ้อน

ตั้งค่า Core-Telecom

เพิ่มการพึ่งพา androidx.core:core-telecom ลงในไฟล์ build.gradle ของแอป

dependencies {
    implementation ("androidx.core:core-telecom:1.0.0")
}

ประกาศสิทธิ์ MANAGE_OWN_CALLS ใน AndroidManifest.xml

<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />

ลงทะเบียนแอปของคุณ

ลงทะเบียนแอปการโทรกับ Android โดยใช้ CallsManager เพื่อเริ่มเพิ่มการโทรลงในระบบ เมื่อลงทะเบียน ให้ระบุความสามารถของแอป (เช่น การรองรับเสียง วิดีโอ)

val callsManager = CallsManager(context)

val capabilities: @CallsManager.Companion.Capability Int =
    (CallsManager.CAPABILITY_BASELINE or
          CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING)

callsManager.registerAppWithTelecom(capabilities)

การจัดการการโทร

ใช้ Core-Telecom API เพื่อสร้างและจัดการวงจรการโทร

สร้างการโทร

ออบเจ็กต์ CallAttributesCompat จะกําหนดพร็อพเพอร์ตี้ของการเรียกที่ไม่ซ้ำกัน ซึ่งอาจมีลักษณะต่อไปนี้

  • displayName: ชื่อผู้โทร
  • address: ที่อยู่การโทร (เช่น หมายเลขโทรศัพท์ ลิงก์การประชุม)
  • direction: ขาเข้าหรือขาออก
  • callType: เสียงหรือวิดีโอ
  • callCapabilities: รองรับการโอนและการคงไว้

ต่อไปนี้เป็นตัวอย่างวิธีสร้างสายเรียกเข้า

fun createIncomingCallAttributes(
    callerName: String,
    callerNumber: String,
    isVideoCall: Boolean): CallAttributesCompat {
    val addressUri = Uri.parse("YourAppScheme:$callerNumber")

    // Define capabilities supported by your call.
    val callCapabilities = CallAttributesCompat.CallCapability(
        supportsSetInactive = CallAttributesCompat.SUPPORTS_SET_INACTIVE // Call can be made inactive (implies hold)
    )

    return CallAttributesCompat(
        displayName = callerName,
        address = addressUri,
        direction = CallAttributesCompat.DIRECTION_INCOMING,
        callType = if (isVideoCall) CallAttributesCompat.CALL_TYPE_VIDEO_CALL else CallAttributesCompat.CALL_TYPE_AUDIO_CALL,
        callCapabilitiesCompat = callCapabilities
    )
}

เพิ่มการโทร

ใช้ callsManager.addCall กับ CallAttributesCompat และระบบการเรียกกลับเพื่อเพิ่มการเรียกใหม่ไปยังระบบและจัดการการอัปเดตอุปกรณ์ระยะไกล callControlScope ในบล็อก addCall ช่วยให้แอปเปลี่ยนสถานะการโทรและรับข้อมูลอัปเดตเสียงได้เป็นหลัก

try {
    callsManager.addCall(
        INCOMING_CALL_ATTRIBUTES,
        onAnswerCall, // Watch needs to know if it can answer the call.
        onSetCallDisconnected,
        onSetCallActive,
        onSetCallInactive
    ) {
        // The call was successfully added once this scope runs.
        callControlScope = this
    }
}
catch(addCallException: Exception){
   // Handle the addCall failure.
}

รับสาย

รับสายเรียกเข้าภายใน CallControlScope

when (val result = answer(CallAttributesCompat.CALL_TYPE_AUDIO_CALL)) {
    is CallControlResult.Success -> { /* Call answered */ }
    is CallControlResult.Error -> { /* Handle error */ }
}

ปฏิเสธสาย

ปฏิเสธสายเรียกเข้าโดยใช้ disconnect() ด้วย DisconnectCause.REJECTED ภายใน CallControlScope

disconnect(DisconnectCause(DisconnectCause.REJECTED))

ทำให้สายโทรออกทำงานอยู่

ตั้งค่าการโทรออกให้ทำงานเมื่อบุคคลที่ปลายทางรับสาย

when (val result = setActive()) {
    is CallControlResult.Success -> { /* Call active */ }
    is CallControlResult.Error -> { /* Handle error */ }
}

พักสาย

ใช้ setInactive() เพื่อพักสายการโทร

when (val result = setInactive()) {
    is CallControlResult.Success -> { /* Call on hold */ }
    is CallControlResult.Error -> { /* Handle error */ }
}

ตัดสาย

ยกเลิกการเชื่อมต่อสายที่คุยด้วย disconnect() โดยใช้ DisconnectCause

disconnect(DisconnectCause(DisconnectCause.LOCAL))

จัดการปลายทางเสียงของสายเรียกเข้า

ตรวจสอบและจัดการอุปกรณ์ปลายทางเสียงโดยใช้ Flow currentCallEndpoint, availableEndpoints และ isMuted ภายใน CallControlScope

fun observeAudioStateChanges(callControlScope: CallControlScope) {
    with(callControlScope) {
        launch { currentCallEndpoint.collect { /* Update UI */ } }
        launch { availableEndpoints.collect { /* Update UI */ } }
        launch { isMuted.collect { /* Handle mute state */ } }
    }
}

เปลี่ยนอุปกรณ์เสียงที่ใช้งานอยู่โดยใช้ requestEndpointChange()

coroutineScope.launch {
     callControlScope.requestEndpointChange(callEndpoint)
}

การสนับสนุนการทำงานอยู่เบื้องหน้า

ไลบรารีใช้ ConnectionService (Android 13 API ระดับ 33 และต่ำกว่า) หรือforegroundtypes (Android 14 API ระดับ 34 ขึ้นไป) เพื่อรองรับการทำงานอยู่เบื้องหน้า

แอปพลิเคชันต้องโพสต์การแจ้งเตือนเพื่อให้ผู้ใช้ทราบว่าแอปพลิเคชันทำงานอยู่เบื้องหน้าตามข้อกำหนดของเบื้องหน้า

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับบริการที่ทำงานอยู่เบื้องหน้า

การสนับสนุน Surface จากระยะไกล

อุปกรณ์ระยะไกล (สมาร์ทวอทช์ ชุดหูฟังบลูทูธ, Android Auto) สามารถจัดการการโทรได้โดยไม่ต้องโต้ตอบกับโทรศัพท์โดยตรง แอปของคุณต้องใช้แลมดาการเรียกกลับ (onAnswerCall, onSetCallDisconnected, onSetCallActive, onSetCallInactive) ที่ระบุให้กับ CallsManager.addCall เพื่อจัดการการดำเนินการที่อุปกรณ์เหล่านี้เริ่ม

เมื่อเกิดการดำเนินการระยะไกล ระบบจะเรียกใช้ Lambda ที่เกี่ยวข้อง

สัญญาณ Lambda ที่ประมวลผลคําสั่งเสร็จสมบูรณ์ หากไม่สามารถปฏิบัติตามคําสั่งได้ Lambda ควรแสดงข้อยกเว้น

การติดตั้งใช้งานอย่างเหมาะสมช่วยให้ควบคุมการโทรในอุปกรณ์ต่างๆ ได้อย่างราบรื่น ทดสอบอย่างละเอียดกับแพลตฟอร์มระยะไกลต่างๆ