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