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