Telekomünikasyon

Yeni Android Telecom Jetpack kitaplığı, platformun ne hakkında olduğunu anlamayı kolaylaştırıyor. olduğunu belirtin. Kaynak kodunu ve örnek bir uygulamayı şurada bulabilirsiniz: GitHub'a gidin.

Bağımlılıklar ve izinler

Öncelikle uygulama modülü build.gradle dosyanızı açın ve androidx Telekom modülü:

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

Uygulama manifestinizde, uygulamanızın MANAGE_OWN_CALLS izin:

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

Uygulamayı kaydetme

Android'e uygulamanızı bildirmek için uygulamanızı ve özelliklerini kaydetmeniz gerekir. Uygulamanızın desteklediği özellikleri (ör. görüntülü görüşme, görüşme) Android'e bildirir ve beklemeye alınabiliyor. Android'in yapılandırabilmesi için bu bilgi önemlidir uygulamanızın özellikleriyle çalışmasını sağlar.

 private val callsManager = CallsManager(context)

var capabilities: @CallsManager.Companion.Capability Int =
    CallsManager.CAPABILITY_BASELINE or
          CallsManager.CAPABILITY_SUPPORTS_CALL_STREAMING or
          CallsManager.CAPABILITY_SUPPORTS_VIDEO_CALLING

callsManager.registerAppWithTelecom(capabilities)

Platform entegrasyonu

Tüm çağrı uygulamaları için en yaygın iki çağrı senaryosu, gelen arama senaryolarıdır. görebilirsiniz. Aramanın yönünü doğru bir şekilde kaydetmek ve kullanıcıyı bildirimlerle gerektiği şekilde bilgilendirmek için aşağıdaki API'leri kullanın.

Görüşme kaydet

Bu örnekte, gelen bir aramanın nasıl kaydedileceği gösterilmektedir:

companion object {
  const val APP_SCHEME = "MyCustomScheme"
  const val ALL_CALL_CAPABILITIES = (CallAttributes.SUPPORTS_SET_INACTIVE
    or CallAttributes.SUPPORTS_STREAM or CallAttributes.SUPPORTS_TRANSFER)

  const val INCOMING_NAME = "Luke"
  val INCOMING_URI: Uri = Uri.fromParts(APP_SCHEME, "", "")
  // Define all possible properties for CallAttributes
  val INCOMING_CALL_ATTRIBUTES =
    CallAttributes(
      INCOMING_NAME,
      INCOMING_URI,
      DIRECTION_INCOMING,
      CALL_TYPE_VIDEO_CALL,
      ALL_CALL_CAPABILITIES)
}

callAttributes nesnesi aşağıdaki özelliklere sahip olabilir:

  • displayName: Arayanın, toplantının veya oturumun adı.
  • address: Aramanın adresi. Not: Bu süre bir toplantı için de kullanılabilir bağlantısını tıklayın.
  • direction: Aramanın yönü (ör. gelen veya giden).
  • callType: Aktarılan verilerle ilgili bilgiler (ör. video) ve işitsel.
  • callCapabilities: Çağrının özelliklerini belirten bir nesne.

callCapabilities nesnesi aşağıdaki özelliklere sahip olabilir:

  • streaming: Görüşmenin, başka bir cihaza ses akışını destekleyip desteklemediğini belirtir. Android destekli bir cihaz.
  • transfer: Aramanın aktarılıp aktarılamayacağını belirtir.
  • hold: Aramanın beklemeye alınıp alınamayacağını belirtir.

Arama ekle

Cihaz şunları desteklemiyorsa addCall() yöntemi bir istisna döndürür: veya çağrı ayarlanırken bir hata oluştu.

try {
    callsManager.addCall(
        INCOMING_CALL_ATTRIBUTES,
        onIsCallAnswered, // Watch needs to know if it can answer the call
        onIsCallDisconnected,
        onIsCallActive,
        onIsCallInactive
    ) {
        callControlScope = this
    }
}

Çağrı yanıtlama

Gelen çağrıyı yaptıktan sonra çağrıyı yanıtlamalı veya reddetmelisiniz. Bu Sınavda bir aramaya nasıl yanıt verileceği gösterilmektedir:

when (answer(CallAttributesCompat.CALL_TYPE_AUDIO_CALL)) {
    is CallControlResult.Success -> {

    }

    is CallControlResult.Error -> {

    }
}

Devam eden başka bir arama varsa answer() geri dönecek CallControlResult.Error, aramanın neden yanıtlanamadığını bildirir. İçinde Bu durumda, kullanıcının diğer aramayı beklemeye alması gerekir.

Aramayı reddetme

Bir aramayı reddetmek için DisconnectCause.Rejected ile aramanın bağlantısını kesin.

fun onRejectCall(){
    coroutineScope.launch {
        callControlScope?.let {
            it.disconnect(DisconnectCause(DisconnectCause.REJECTED))
        }
    }
}

Giden çağrı

Giden arama yaparken, uzak taraf yanıt verdiğinde çağrının etkin olarak belirtilmesini gerektirir:

when (setActive()) {
    is CallControlResult.Success -> {
        onIsCallActive()
    }

    is CallControlResult.Error -> {
        updateCurrentCall {
            copy(errorCode = result.errorCode)
        }
    }
}

Çağrıyı beklemeye alma

Telefon etme uygulamanız çağrıları bekletmeyi destekliyorsa setInActive özelliğini kullanarak görüşmenin aktif olmadığı ve mikrofon ile kameranın serbestçe konuşabileceği bir platform diğer uygulamalar tarafından kullanılmasına izin verilmez:

when (setInActive()) {
    is CallControlResult.Success -> {

    }

    is CallControlResult.Error -> {
        updateCurrentCall {
            copy(errorCode = result.errorCode)
        }
    }
}

Bağlantıyı kes

Bir çağrının bağlantısını kesmek için bir geçerli neden:

coroutineScope.launch {
    callControlScope?.disconnect(DisconnectCause(DisconnectCause.LOCAL))
}

Rota sesi

Görüşme sırasında kullanıcılar bazen hoparlör, akıllı telefon veya veya Bluetooth cihazı. availableEndpoints ve Kullanılabilen tüm cihazların listesini almak için currentCallEndpoint API'leri etkin olan bir cihaz görebilirsiniz.

Bu örnekte, kullanıcıya gösterilecek bir kullanıcı arayüzü nesnesi oluşturmak için her iki akışı da birleştiriyoruz. etkin cihaz listesi ve hangisinin etkin olduğu:

availableEndpoint = combine(callControlScope.availableEndpoints,
    callControlScope.currentCallEndpoint) {
    availableDevices: List<CallEndpoint>, activeDevice : CallEndpoint ->
    availableDevices.map {
        EndPointUI(
            isActive = activeDevice.endpointName == it.endpointName, it
        )
    }
}

Etkin bir cihazı değiştirmek için requestEndpointChange bölümünde Değiştirmek istediğiniz CallEndpoint.

coroutineScope.launch {
     callControlScope?.requestEndpointChange(callEndpoint)
}

Ön plan desteği

Telekom kitaplığı ön plan desteği sunar. Bu kitaplıkta Android 13 ve önceki sürümleri çalıştıran cihazlar için ConnectionService. Android 14 ve sonraki sürümler için doğru şekilde ayarlamak için foregroundtypes mikrofonu ve kamerayı kullanır. desteği sona erecektir. Ön plan hizmetleri hakkında daha fazla bilgi edinin.

Ön plan şartları kapsamında, uygulama bir bildirim yayınlanmalıdır uygulamanın ön planda çalıştığını bilmesini sağlar.

Uygulamanızın ön planda yürütme önceliği almasını sağlamak için bildirimi alabilirsiniz. Ön plan önceliği uygulamanız aramayı sonlandırdığında veya bildiriminiz artık sona erdiğinde kaldırılır geçerlidir.

is TelecomCall.Registered -> {
    val notification = createNotification(call)
    notificationManager.notify(TELECOM_NOTIFICATION_ID, notification)
}

Yüzey desteği

Kol saatleri genel bir uç nokta alıcı uygulamasına sahiptir. Bu uygulama, yanıtlama, reddetme ve bağlantıyı kesme gibi temel bir arayüze sahip kullanıcı çağrısının en iyi yolu. Uygulama, lambda işlevlerini uygulayarak bu işlemleri destekler işlemi, cihazda gerçekleştirdiğinizi platforma bildirir.

uygulaması yanıt vermiyor.

callsManager.addCall(
        attributes,
        onIsCallAnswered, // Watch/Auto need to know if they can answer the call
        onIsCallDisconnected,
        onIsCallActive,
        onIsCallInactive
    ) {
//Call Scope
}
/**
  *  Can the call be successfully answered??
  *  TIP: Check the connection/call state to see if you can answer a call
  *  Example you may need to wait for another call to hold.
  **/
val onIsCallAnswered: suspend(type: Int) -> Unit = {}

/**
  * Can the call perform a disconnect
  */
val onIsCallDisconnected: suspend (cause: DisconnectCause) -> Unit = {}

/**
  *  Check is see if you can make the call active.
  *  Other calls and state might stop us from activating the call
  */
val onIsCallActive: suspend () -> Unit = {
    updateCurrentCall {
    }
}

/**
  * Check to see if you can make the call inactivate
  */
val onIsCallInactive: suspend () -> Unit = {}