Core-Telecom

Library Core-Telecom menyederhanakan proses integrasi aplikasi panggilan Anda dengan platform Android dengan menyediakan kumpulan API yang andal dan konsisten

Jika ingin mempelajari implementasi praktis, Anda dapat menemukan aplikasi contoh di GitHub:

Menyiapkan Core-Telecom

Tambahkan dependensi androidx.core:core-telecom ke file build.gradle aplikasi Anda:

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

Deklarasikan izin MANAGE_OWN_CALLS di AndroidManifest.xml Anda:

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

Daftarkan aplikasi Anda

Daftarkan aplikasi panggilan Anda ke Android menggunakan CallsManager untuk mulai menambahkan panggilan ke sistem. Saat mendaftar, tentukan kemampuan aplikasi Anda (misalnya, dukungan audio, video):

val callsManager = CallsManager(context)

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

callsManager.registerAppWithTelecom(capabilities)

Pengelolaan Panggilan Telepon

Gunakan Core-Telecom API untuk membuat dan mengelola siklus proses panggilan.

Membuat panggilan

Objek CallAttributesCompat menentukan properti panggilan unik, yang dapat memiliki karakteristik berikut:

  • displayName: nama pemanggil.
  • address: Alamat panggilan (misalnya, nomor telepon, link rapat).
  • direction: Masuk atau keluar.
  • callType: Audio atau video.
  • callCapabilities: Mendukung transfer dan tahan.

Berikut adalah contoh cara membuat panggilan masuk:

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
    )
}

Menambahkan panggilan

Gunakan callsManager.addCall dengan CallAttributesCompat dan callback untuk menambahkan panggilan baru ke sistem dan mengelola update platform jarak jauh. callControlScope dalam blok addCall terutama memungkinkan aplikasi Anda melakukan transisi status panggilan dan menerima update audio:

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.
}

Menjawab telepon

Menjawab panggilan masuk dalam CallControlScope:

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

Menolak panggilan

Tolak panggilan menggunakan disconnect() dengan DisconnectCause.REJECTED dalam CallControlScope:

disconnect(DisconnectCause(DisconnectCause.REJECTED))

Membuat panggilan keluar aktif

Tetapkan panggilan keluar ke aktif setelah pihak jarak jauh menjawab:

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

Menahan panggilan

Gunakan setInactive() untuk menahan panggilan:

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

Memutuskan sambungan panggilan

Putuskan sambungan panggilan menggunakan disconnect() dengan DisconnectCause:

disconnect(DisconnectCause(DisconnectCause.LOCAL))

Mengelola endpoint audio panggilan

Mengamati dan mengelola endpoint audio menggunakan currentCallEndpoint, availableEndpoints, dan isMuted Flow dalam CallControlScope

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

Ubah perangkat audio aktif menggunakan requestEndpointChange():

coroutineScope.launch {
     callControlScope.requestEndpointChange(callEndpoint)
}

Dukungan latar depan

Library ini menggunakan ConnectionService (Android 13 API level 33 dan yang lebih lama) atau foregroundtypes (Android 14 API level 34 dan yang lebih tinggi) untuk dukungan latar depan.

Sebagai bagian dari persyaratan latar depan, aplikasi harus memposting notifikasi agar pengguna mengetahui bahwa aplikasi sedang berjalan di latar depan.

Untuk memastikan aplikasi Anda mendapatkan prioritas eksekusi latar depan, buat notifikasi setelah Anda menambahkan panggilan dengan platform. Prioritas latar depan akan dihapus saat aplikasi Anda menghentikan panggilan atau notifikasi Anda tidak lagi valid.

Pelajari layanan latar depan lebih lanjut.

Dukungan Surface jarak jauh

Perangkat jarak jauh (smartwatch, headset Bluetooth, Android Auto) mampu mengelola panggilan tanpa interaksi langsung dengan ponsel. Aplikasi Anda harus mengimplementasikan lambda callback (onAnswerCall, onSetCallDisconnected, onSetCallActive, onSetCallInactive) yang disediakan ke CallsManager.addCall untuk menangani tindakan yang dimulai oleh perangkat ini.

Saat tindakan jarak jauh terjadi, lambda yang sesuai akan dipanggil.

Penyelesaian sinyal lambda yang berhasil bahwa perintah telah diproses. Jika perintah tidak dapat dipatuhi, lambda akan menampilkan pengecualian.

Penerapan yang tepat memastikan kontrol panggilan yang lancar di berbagai perangkat. Uji secara menyeluruh dengan berbagai platform jarak jauh.