Telekomünikasyon

Yeni Android Telecom Jetpack kitaplığı, platforma çağrınızın durumunu söylemeyi kolaylaştırır. Kaynak kodu ve örnek uygulamayı GitHub'da bulabilirsiniz.

Bağımlılıklar ve izinler

Önce uygulama modülü build.gradle dosyanızı açın ve androidx Telecom modülü için bir bağımlılık ekleyin:

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

Uygulama manifestinizde, uygulamanızın MANAGE_OWN_CALLS" iznini kullandığını beyan edin:

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

Uygulamayı kaydet

Android'e uygulamanızı bildirmek için uygulamanızı ve özelliklerini kaydetmeniz gerekir. Bu, Android'e görüntülü görüşme, çağrı aktarma ve aramaları bekletme gibi uygulamanızın desteklediği özellikleri bildirir. Android'in, uygulamanızın özellikleriyle çalışacak şekilde kendini yapılandırabilir. Bu nedenle

 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

Herhangi bir çağrı uygulaması için en yaygın iki arama senaryosu, gelen ve giden çağrılardır. Çağrı yönünü doğru şekilde kaydetmek ve kullanıcıya bildirimlerle uygun şekilde bildirimde bulunmak için aşağıdaki API'leri kullanın.

Aramayı kaydetme

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. Bunun bir toplantı bağlantısına genişletilebileceğini unutmayın.
  • direction: Aramanın yönü (ör. gelen veya giden).
  • callType: Görüntü ve ses gibi aktarılan verilerle ilgili bilgiler.
  • callCapabilities: Çağrının özelliklerini belirten bir nesne.

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

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

Arama ekle

Cihaz telekom'u desteklemiyorsa veya çağrı ayarlanırken bir hata oluştuysa addCall() yöntemi bir istisna döndürür.

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 bir aramayı yaptıktan sonra, çağrıyı yanıtlamanız veya reddetmeniz gerekir. Aşağıdaki örnekte, bir aramanın nasıl yanıtlanacağı gösterilmektedir:

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

    }

    is CallControlResult.Error -> {

    }
}

Devam eden başka bir arama varsa answer(), CallControlResult.Error numarasını döndürür ve aramanın neden yanıtlanamadığını bildirir. Bu durumda, kullanıcının diğer çağrıyı beklemeye alması gerekir.

Aramayı reddetme

Bir aramayı reddetmek için DisconnectCause.Rejected ile görüşmeyi bitirin.

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

Giden arama

Giden bir arama yaparken, uzak taraf yanıt verdiğinde platformun çağrının devam ettiğini bilmesi için çağrıyı etkin olarak ayarlamanız gerekir:

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

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

Çağrıyı beklemeye alma

Görüşme uygulamanız çağrı bekletmeyi destekliyorsa, görüşmenizin etkin olmadığını ve mikrofon ile kameranın diğer uygulamalar tarafından serbest olduğunu platforma bildirmek için setInActive kullanın:

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 geçerli bir neden sağlayarak Telecom yığınına bağlantıyı kesmesi gerektiğini bildirin:

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

Rota sesi

Kullanıcılar görüşme sırasında bazen hoparlör, kulaklık veya Bluetooth cihaz gibi cihazlar arasında geçiş yapar. Kullanıcının kullanabileceği tüm cihazların ve etkin olan cihazların listesini almak için availableEndpoints ve currentCallEndpoint API'lerini kullanın.

Bu örnekte her iki akış da birleştirilerek kullanıcıya cihazların listesini ve hangi cihazın etkin olduğunu göstermek için bir kullanıcı arayüzü nesnesi oluşturulur:

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 geçiş yapmak istediğiniz CallEndpoint ile birlikte requestEndpointChange kullanın.

coroutineScope.launch {
     callControlScope?.requestEndpointChange(callEndpoint)
}
ayarını kullanacak şekilde yapılandırılmalıdır

Ön plan desteği

Telekom kitaplığında ön plan desteği sunulur. Bu kitaplık, Android 13 ve önceki sürümleri çalıştıran cihazlar için ConnectionService kullanıyor. Android 14 ve sonraki sürümlerde ön plan hizmetlerini doğru şekilde desteklemek için ön plan türleri mikrofon ve kamerayı kullanır. Ön plan hizmetleri hakkında daha fazla bilgi edinin.

Ön plan şartları kapsamında uygulama, kullanıcıların uygulamanın ön planda çalıştığını bilmesi için bir bildirim yayınlamalıdır.

Uygulamanızın ön planda yürütme önceliği aldığından emin olmak için çağrıyı platforma kaydettikten sonra bir bildirim oluşturun. Uygulamanız çağrıyı sonlandırdığında veya bildiriminiz artık geçerli olmadığında ön plan önceliği kaldırılır.

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

Platform desteği

Saatlerde genel bir uç nokta alıcı uygulaması vardır. Bu uygulama kullanıcıya aramaları cevaplama, reddetme ve çağrıları kesme gibi temel bir arayüz sağlar. Uygulama, cihazda işlemi gerçekleştirdiğiniz platformu bilgilendiren lambda işlevlerini uygulayarak bu işlemleri destekler.

Uygulamanız yanıt vermezse her lambda işlevi, başarısız bir işlem ile 5 saniye sonra zaman aşımına uğrar.

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 = {}