Core-Telecom

Core-Telecom kitaplığı, güçlü ve tutarlı bir API grubu sağlayarak arama uygulamanızı Android platformuyla entegre etme sürecini kolaylaştırır.

Pratik uygulamaları keşfetmek istiyorsanız GitHub'da örnek uygulamalar bulabilirsiniz:

Core-Telecom'u kurma

androidx.core:core-telecom bağımlılığını uygulamanızın build.gradle dosyasına ekleyin:

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

AndroidManifest.xml dosyanızda MANAGE_OWN_CALLS iznini beyan edin:

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

Uygulamanızı kaydettirme

Sisteme arama eklemeye başlamak için CallsManager kullanarak arama uygulamanızı Android'e kaydedin. Kaydolurken uygulamanızın özelliklerini (ör. ses, video desteği) belirtin:

val callsManager = CallsManager(context)

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

callsManager.registerAppWithTelecom(capabilities)

Çağrı Yönetimi

Arama yaşam döngüsü oluşturmak ve yönetmek için Core-Telecom API'lerini kullanın.

Görüşme oluşturma

CallAttributesCompat nesnesi, aşağıdaki özelliklere sahip olabilecek benzersiz bir aramanın özelliklerini tanımlar:

  • displayName: Arayan kişinin adı.
  • address: Arama adresi (ör. telefon numarası, toplantı bağlantısı).
  • direction: Gelen veya giden.
  • callType: Ses veya video.
  • callCapabilities: Aktarım ve bekletme işlemlerini destekler.

Aşağıda, gelen arama oluşturma örneği verilmiştir:

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

Görüşme ekleme

Sisteme yeni bir çağrı eklemek ve uzak yüzey güncellemelerini yönetmek için CallAttributesCompat ile callsManager.addCall ve geri çağırma işlevini kullanın. addCall bloğu içindeki callControlScope, öncelikle uygulamanızın arama durumunu değiştirmesine ve ses güncellemeleri almasına olanak tanır:

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

Çağrı yanıtlama

CallControlScope içinde gelen aramayı yanıtlama:

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

Aramayı reddetme

CallControlScope içinde DisconnectCause.REJECTED ile disconnect() kullanarak aramayı reddetme:

disconnect(DisconnectCause(DisconnectCause.REJECTED))

Giden aramayı etkinleştirme

Uzaktan taraf yanıt verdikten sonra giden aramayı etkin olarak ayarlama:

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

Çağrıyı beklemeye alma

Bir aramayı beklemeye almak için setInactive() simgesini kullanın:

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

Bir aramanın bağlantısını kesme

disconnect() ile DisconnectCause kullanarak bir görüşmenin bağlantısını kesme:

disconnect(DisconnectCause(DisconnectCause.LOCAL))

Arama ses uç noktalarını yönetme

CallControlScope içinde currentCallEndpoint, availableEndpoints ve isMuted Flow'ları kullanarak ses uç noktalarını gözlemleyin ve yönetin

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

requestEndpointChange() simgesini kullanarak etkin ses cihazını değiştirin:

coroutineScope.launch {
     callControlScope.requestEndpointChange(callEndpoint)
}

Ön plan desteği

Kitaplık, ön plan desteği için ConnectionService (Android 13 API düzeyi 33 ve önceki sürümler) veya foregroundtypes (Android 14 API düzeyi 34 ve sonraki sürümler) kullanır.

Ön plan şartları kapsamında, uygulamanın ön planda çalıştığının kullanıcılara bildirilmesi için uygulamanın bir bildirim yayınlaması gerekir.

Uygulamanızın ön planda yürütme önceliğine sahip olmasını sağlamak için platformla aramayı ekledikten sonra bir bildirim oluşturun. Uygulamanız aramayı sonlandırdığında veya bildiriminiz artık geçerli olmadığında ön plan önceliği kaldırılır.

Ön plan hizmetleri hakkında daha fazla bilgi edinin.

Uzaktan Surface desteği

Uzaktan cihazlar (akıllı saatler, Bluetooth kulaklıklar, Android Auto), doğrudan telefon etkileşimi olmadan arama yönetimi yapabilir. Uygulamanız, bu cihazlar tarafından başlatılan işlemleri işlemek için CallsManager.addCall'e sağlanan geri çağırma lambdalarını (onAnswerCall, onSetCallDisconnected, onSetCallActive, onSetCallInactive) uygulamalıdır.

Uzaktan bir işlem gerçekleştiğinde ilgili lambda çağrılır.

Lambda'nın başarıyla tamamlanması, komutun işlendiğini gösterir. Komuta uyulamıyorsa lambda bir istisna atmalıdır.

Doğru şekilde uygulandığında, farklı cihazlar arasında sorunsuz görüşme kontrolü sağlar. Çeşitli uzaktan kumanda yüzeyleriyle ayrıntılı olarak test edin.