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