Arama uygulaması oluşturma

Görüşme uygulaması, kullanıcıların cihazlarında sesli veya görüntülü görüşme yapmasına veya yapmasına olanak tanır. Telefon etme uygulamaları, aşağıdaki ekran görüntüsünde gösterildiği gibi, varsayılan Telefon uygulaması arayüzünü kullanmak yerine, kendi kullanıcı arayüzlerini kullanır.

Telefon etme uygulaması örneği
Kendi kullanıcı arayüzünü kullanan bir çağrı uygulaması örneği

Android çerçevesi, telekomünikasyon çerçevesine göre bir çağrı uygulaması oluşturmanıza yardımcı olacak sınıflar içeren android.telecom paketini içerir. Uygulamanızı telekomünikasyon çerçevesine göre oluşturmak aşağıdaki avantajları sağlar:

  • Uygulamanız, cihazdaki yerel telekom alt sistemiyle doğru bir şekilde birlikte çalışıyor.
  • Uygulamanız, çerçeveye uygun olan diğer çağrı uygulamalarıyla da doğru bir şekilde birlikte çalışıyor.
  • Bu çerçeve, uygulamanızın ses ve video yönlendirmesini yönetmesine yardımcı olur.
  • Bu çerçeve, uygulamanızın çağrılarının odak noktası olup olmadığını belirlemesine yardımcı olur.

Manifest beyanları ve izinleri

Uygulama manifestinizde, aşağıdaki örnekte gösterildiği gibi uygulamanızın MANAGE_OWN_CALLS iznini kullandığını beyan edin:

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

Uygulama izinlerini bildirme hakkında daha fazla bilgi için İzinler bölümüne bakın.

Uygulamanızda ConnectionService sınıfını uygulayan sınıfı belirten bir hizmet bildirmeniz gerekir. Telekom alt sistemi, hizmetin BIND_TELECOM_CONNECTION_SERVICE izninin bağlanabileceğini belirtmesini gerektirir. Aşağıdaki örnekte, uygulama manifestinizde hizmetin nasıl beyan edileceği gösterilmektedir:

<service android:name="com.example.MyConnectionService"
    android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
    <intent-filter>
        <action android:name="android.telecom.ConnectionService" />
    </intent-filter>
</service>

Hizmetler dahil olmak üzere uygulama bileşenlerini bildirme hakkında daha fazla bilgi için Uygulama Bileşenleri bölümüne bakın.

Bağlantı hizmetini uygulayın

Arama uygulamanız, telekom alt sisteminin bağlanabileceği ConnectionService sınıfının bir uygulamasını sağlamalıdır. ConnectionService uygulamanız aşağıdaki yöntemleri geçersiz kılar:

onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)

Telekom alt sistemi, uygulamanızın yeni bir giden çağrı oluşturmak için placeCall(Uri, Bundle) yöntemini çağırmasına yanıt olarak bu yöntemi çağırır. Uygulamanız, yeni giden çağrıyı temsil etmek için Connection sınıfı uygulamanızın yeni bir örneğini döndürür (daha fazla bilgi için Bağlantıyı uygulama bölümüne bakın). Aşağıdaki işlemleri gerçekleştirerek giden bağlantıyı daha da özelleştirebilirsiniz:

onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)

Uygulamanız placeCall(Uri, Bundle) yöntemini çağırdığında ve giden arama yapılamadığında telekom alt sistemi bu yöntemi çağırır. Bu durumda uygulamanız, kullanıcıya giden aramanın yapılamadığını bildirmelidir (örneğin, uyarı kutusu veya kısa mesaj göndererek). Devam eden bir acil durum araması varsa veya başka bir uygulamada arama yapılmadan önce beklemeye alınamayan devam eden bir arama varsa uygulamanız arama yapamayabilir.

onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)

Uygulamanız, uygulamanızda yeni bir gelen çağrıyı bildirmek için addNewIncomingCall(PhoneAccountHandle, Bundle) yöntemini çağırdığında telekom alt sistemi bu yöntemi çağırır. Uygulamanız, yeni gelen aramayı temsil etmek için Connection uygulamanızın yeni bir örneğini döndürür (daha fazla bilgi için Bağlantıyı uygulama bölümüne bakın). Aşağıdaki işlemleri gerçekleştirerek gelen bağlantıyı daha da özelleştirebilirsiniz:

onCreateIncomingConnectionFailed(PhoneAccountHandle, ConnectionRequest)

Uygulamanız, Telekom'a yeni bir gelen aramayı bildirmek için addNewIncomingCall(PhoneAccountHandle, Bundle) yöntemini çağırdığında telekom alt sistemi bu yöntemi çağırır ancak gelen çağrıya izin verilmez (daha fazla bilgi için arama kısıtlamalarına bakın). Uygulamanız gelen aramayı sessiz bir şekilde reddetmeli ve isteğe bağlı olarak kullanıcıyı cevapsız arama hakkında bilgilendirmek için bir bildirim yayınlamalıdır.

Bağlantıyı uygulayın

Uygulamanız, uygulamanızdaki çağrıları temsil etmek için Connection adlı bir alt sınıf oluşturmalıdır. Uygulamanızda aşağıdaki yöntemleri geçersiz kılmanız gerekir:

onShowIncomingCallUi()

Yeni bir gelen arama eklediğinizde telekom alt sistemi bu yöntemi çağırır ve uygulamanız gelen arama kullanıcı arayüzünü gösterir.

onCallAudioStateChanged(CallAudioState)

Telekom alt sistemi, uygulamanıza mevcut ses rotasının veya modunun değiştiğini bildirmek için bu yöntemi çağırır. Bu işlev, uygulamanızın setAudioRoute(int) yöntemi kullanılarak ses modunu değiştirmesi sonucunda çağrılır. Bu yöntem, sistem ses rotasını değiştirdiğinde de (örneğin, Bluetooth mikrofonlu kulaklık bağlantısı kesildiğinde) çağrılabilir.

onHold()

Telekom alt sistemi, bir çağrıyı beklemeye almak istediğinde bu yöntemi çağırır. Bu isteğe yanıt olarak, uygulamanız çağrıyı beklemeye alıp ardından çağrının bekletildiğini sisteme bildirmek için setOnHold() yöntemini çağırmalıdır. Android Auto gibi bir çağrı hizmeti, çağrınızı beklemeye almak için bir kullanıcı isteğini yeniden aktarmak istediğinde telekom alt sistemi bu yöntemi çağırabilir. Kullanıcı, aramayı başka bir uygulamada etkin hale getirirse telekom alt sistemi de bu yöntemi çağırır. Çağrı içi hizmetler hakkında daha fazla bilgi için InCallService adresine bakın.

onUnhold()

Telekom alt sistemi, beklemeye alınmış bir çağrıyı devam ettirmek istediğinde bu yöntemi çağırır. Uygulamanız çağrıyı devam ettirdikten sonra, sisteme çağrının artık beklemede olmadığını bildirmek için setActive() yöntemini çağırmalıdır. Android Auto gibi bir çağrı hizmeti, çağrınızı devam ettirmek için bir isteği aktarmak istediğinde telekomünikasyon alt sistemi bu yöntemi çağırabilir. Görüşme içi hizmetler hakkında daha fazla bilgi için InCallService inceleyin.

onAnswer()

Telekom alt sistemi, gelen bir aramanın yanıtlanması gerektiğini uygulamanıza bildirmek için bu yöntemi çağırır. Uygulamanız çağrıyı cevapladıktan sonra, çağrının yanıtlandığını sisteme bildirmek için setActive() yöntemini çağırmalıdır. Uygulamanız yeni bir gelen çağrı eklediğinde ve zaten başka bir uygulamada beklemeye alınamayan devam eden bir çağrı varsa telekom alt sistemi bu yöntemi çağırabilir. Bu gibi durumlarda telekom alt sistemi, gelen arama kullanıcı arayüzünü uygulamanız adına görüntüler. Çerçeve, çağrıyı cevaplayacağınız video durumunu belirtmek için destek sağlayan aşırı yüklenmiş bir yöntem sağlar. Daha fazla bilgi için onAnswer(int) sayfasını inceleyin.

onReject()

Telekom alt sistemi, gelen bir çağrıyı reddetmek istediğinde bu yöntemi çağırır. Uygulamanız çağrıyı reddettikten sonra, setDisconnected(DisconnectCause) yöntemini çağırmalı ve parametre olarak REJECTED değerini belirtmelidir. Ardından uygulamanız, çağrıyı işlediğini sisteme bildirmek için destroy() yöntemini çağırır. Kullanıcı, uygulamanızdan gelen bir aramayı reddettiğinde telekom alt sistemi bu yöntemi çağırır.

onDisconnect()

Telekom alt sistemi, bir çağrının bağlantısını kesmek istediğinde bu yöntemi çağırır. Görüşme sona erdiğinde, uygulamanız setDisconnected(DisconnectCause) yöntemini çağırmalı ve bir kullanıcı isteğinin aramanın bağlantısının kesilmesine neden olduğunu belirtmek için parametre olarak LOCAL yöntemini belirtmelidir. Bunun ardından uygulamanız, telekom alt sistemine uygulamanın çağrıyı işlediğini bildirmek için destroy() yöntemini çağırır. Kullanıcı, Android Auto gibi başka bir çağrı içi hizmet aracılığıyla yaptığı bir aramanın bağlantısını kestiğinde sistem bu yöntemi çağırabilir. Sistem, başka bir çağrının yapılmasına izin vermek için çağrınızın bağlantısının kesilmesi gerektiğinde de (örneğin, kullanıcı acil durum araması yapmak istediğinde) bu yöntemi çağırır. Görüşme içi hizmetler hakkında daha fazla bilgi için InCallService bölümüne bakın.

Yaygın çağrı senaryolarını ele alın

Çağrı akışınızda ConnectionService API'den yararlanmak için android.telecom paketindeki diğer sınıflarla etkileşimde bulunmanız gerekir. Aşağıdaki bölümlerde yaygın çağrı senaryoları ve uygulamanızın bunları ele almak için API'leri nasıl kullanması gerektiği açıklanmaktadır.

Gelen sesli aramaları yanıtlama

Gelen aramaları işleme akışı, diğer uygulamalarda arama olup olmamasına bakılmaksızın değişir. Akışlardaki farkın nedeni, cihazdaki tüm çağrı uygulamaları için kararlı bir ortam sağlamak amacıyla diğer uygulamalarda aktif çağrılar olduğunda telekomünikasyon çerçevesinin bazı kısıtlamalar belirlemesinin gerekmesidir. Daha fazla bilgi için Arama kısıtlamaları bölümünü inceleyin.

Diğer uygulamalarda etkin arama yok

Başka uygulamalarda etkin arama olmadığında gelen aramaları yanıtlamak için aşağıdaki adımları uygulayın:

  1. Uygulamanız, normal mekanizmalarını kullanarak yeni bir arama alıyor.
  2. Telekom alt sistemini yeni gelen arama hakkında bilgilendirmek için addNewIncomingCall(PhoneAccountHandle, Bundle) yöntemini kullanın.
  3. Telekom alt sistemi, uygulamanızın ConnectionService uygulamasına bağlanır ve onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest) yöntemini kullanarak yeni gelen aramayı temsil eden Connection sınıfının yeni bir örneğini ister.
  4. Telekom alt sistemi, uygulamanızı onShowIncomingCallUi() yöntemini kullanarak gelen arama kullanıcı arayüzünü göstermesi gerektiği konusunda bilgilendirir.
  5. Uygulamanız, gelen kullanıcı arayüzünü, ilişkili tam ekran intent'le birlikte bir bildirim kullanarak gösterir. Daha fazla bilgi için onShowIncomingCallUi() inceleyin.
  6. Kullanıcı gelen aramayı kabul ederse setActive() yöntemini çağırın veya kullanıcı gelen çağrıyı reddederse setDisconnected(DisconnectCause) tarafından parametre olarak REJECTED belirterek destroy() yöntemine çağrı yapın.

Diğer uygulamalarda bulunan ve beklemeye alınamayan etkin aramalar

Diğer uygulamalarda, beklemeye alınamayan aktif aramalar olduğunda gelen aramaları yanıtlamak için aşağıdaki adımları uygulayın:

  1. Uygulamanız, normal mekanizmalarını kullanarak yeni bir arama alıyor.
  2. Telekom alt sistemini yeni gelen arama hakkında bilgilendirmek için addNewIncomingCall(PhoneAccountHandle, Bundle) yöntemini kullanın.
  3. Telekom alt sistemi, uygulamanızın ConnectionService uygulamasına bağlanır ve onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest) yöntemini kullanarak yeni gelen çağrıyı temsil eden Connection nesnesinin yeni bir örneğini ister.
  4. Telekom alt sistemi, gelen çağrınız için gelen çağrı kullanıcı arayüzünü görüntüler.
  5. Kullanıcı çağrıyı kabul ederse telekom alt sistemi onAnswer() yöntemini çağırır. Telekom alt sistemine çağrının bağlandığını belirtmek için setActive() yöntemini çağırmanız gerekir.
  6. Kullanıcı çağrıyı reddederse telekom alt sistemi onReject() yöntemini çağırır. Parametre olarak REJECTED'yi belirten setDisconnected(DisconnectCause) yöntemini ve ardından destroy() yöntemi çağrısını çağırmanız gerekir.

Giden arama yapma

Giden arama yapma akışı, telekomünikasyon çerçevesinin uyguladığı kısıtlamalar nedeniyle aramanın yapılamama ihtimalinin ele alınmasını içerir. Daha fazla bilgi için Arama kısıtlamaları başlıklı makaleyi inceleyin.

Giden arama yapmak için aşağıdaki adımları uygulayın:

  1. Kullanıcı, uygulamanızda giden arama başlatır.
  2. Telekom alt sistemini yeni giden arama hakkında bilgilendirmek için placeCall(Uri, Bundle) yöntemini kullanın. Yöntem parametreleriyle ilgili olarak aşağıdakileri göz önünde bulundurun:
    • Uri parametresi, çağrının yapıldığı adresi temsil eder. Normal telefon numaraları için tel: URI şemasını kullanın.
    • Bundle parametresi, uygulamanızın PhoneAccountHandle nesnesini EXTRA_PHONE_ACCOUNT_HANDLE ekstrasına ekleyerek çağrı uygulamanız hakkında bilgi sağlamanıza olanak tanır. Uygulamanız, giden her çağrıya PhoneAccountHandle nesnesini sağlamalıdır.
    • Bundle parametresi, EXTRA_START_CALL_WITH_VIDEO_STATE ekstra öğesinde STATE_BIDIRECTIONAL değerini belirterek giden çağrının video içerip içermediğini belirtmenize de olanak tanır. Telekom alt sisteminin, görüntülü görüşmeleri varsayılan olarak hoparlöre yönlendirdiğini unutmayın.
  3. Telekom alt sistemi, uygulamanızın ConnectionService uygulamasına bağlanır.
  4. Uygulamanız giden arama yapamazsa telekom alt sistemi, uygulamanıza çağrının şu anda yapılamayacağını bildirmek için onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest) yöntemini çağırır. Uygulamanız, kullanıcıya arama yapılamayacağını bildirmelidir.
  5. Uygulamanız giden aramayı gerçekleştirebiliyorsa telekom alt sistemi onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest) yöntemini çağırır. Uygulamanız, yeni giden çağrıyı temsil etmek için Connection sınıfınızın bir örneğini döndürmelidir. Bağlantıda ayarlamanız gereken özellikler hakkında daha fazla bilgi için Bağlantı hizmetini uygulama bölümüne bakın.
  6. Giden çağrı bağlandığında, telekom alt sistemine aramanın etkin olduğunu bildirmek için setActive() yöntemini çağırın.

Çağrıyı bitirme

Bir aramayı sonlandırmak için aşağıdaki adımları uygulayın:

  1. Kullanıcı çağrıyı sonlandırdıysa LOCAL gönderen setDisconnected(DisconnectCause) parametresini, diğer taraf aramayı sonlandırdıysa parametre olarak REMOTE değerini gönderin.
  2. destroy() yöntemini çağırın.

Arama kısıtlamaları

Kullanıcılarınıza tutarlı ve basit bir arama deneyimi sunmak için telekomünikasyon çerçevesi, cihazdaki çağrıların yönetilmesinde bazı kısıtlamalar uygular. Örneğin, kullanıcının kendi kendine yönetilen ConnectionService API'sini (FoTalk ve BarTalk) uygulayan iki çağrı uygulaması yüklediğini varsayalım. Bu durumda aşağıdaki kısıtlamalar geçerli olur:

  • API düzeyi 27 veya altını çalıştıran cihazlarda aynı anda yalnızca bir uygulama devam eden bir çağrıyı sürdürebilir. Bu kısıtlama, kullanıcı FooTalk uygulamasını kullanarak devam eden bir arama yaparken BarTalk uygulamasının yeni bir arama başlatamayacağı veya alamayacağı anlamına gelir.

    API düzeyi 28 veya sonraki sürümleri çalıştıran cihazlarda hem FooTalk hem de BarTalk CAPABILITY_SUPPORT_HOLD ve CAPABILITY_HOLD izinleri beyan ediyorsa kullanıcı, başka bir çağrı başlatmak veya yanıtlamak için uygulamalar arasında geçiş yaparak birden fazla devam eden çağrıyı sürdürebilir.

  • Kullanıcı normal yönetilen aramalar yapıyorsa (örneğin, yerleşik Telefon veya Çevirici uygulamasını kullanarak) arama uygulamalarından kaynaklanan aramalara dahil edilemez. Bu, kullanıcı mobil operatörünü kullanarak düzenli bir aramadaysa aynı anda bir FooTalk veya BarTalk aramasında da bulunamayacağı anlamına gelir.

  • Kullanıcı bir acil durum araması ararsa telekom alt sistemi, uygulamanızın aramalarının bağlantısını keser.

  • Kullanıcı acil durum araması yaparken uygulamanız arama alamaz veya yapamaz.

  • Uygulamanız gelen bir arama aldığında başka bir arama uygulamasında devam eden bir çağrı varsa gelen çağrıyı cevapladığınızda, diğer uygulamada devam eden tüm çağrılar sonlandırılır. Uygulamanız, her zamanki gelen arama kullanıcı arayüzünü görüntülememelidir. Telekomünikasyon çerçevesi gelen arama kullanıcı arayüzünü görüntüler ve kullanıcıya, yeni çağrı cevaplandığında devam eden çağrıların sona ereceğini bildirir. Diğer bir deyişle, kullanıcı bir FooTalk aramasındaysa ve BarTalk uygulaması gelen bir arama alırsa, telekomünikasyon çerçevesi kullanıcıya yeni bir BarTalk araması olduğunu ve BarTalk çağrısına cevap verildiğinde kullanıcının FooTalk aramasının sona ereceğini bildirir.