Varsayılan telefon uygulaması oluşturma

Varsayılan telefon uygulaması, Android Telecom çerçevesinin bir Android cihazdaki varsayılan telefon uygulamasının yerine geçecek bir hizmet oluşturmak için rol yöneticisi ve çağrı içi hizmeti kullanarak InCallService API'yi kullanarak uygulamanızı çağrı durumu konusunda bilgilendirmesini sağlar. Uygulamanız aşağıdaki şartları karşılamalıdır:

Arama özelliği olmamalı ve yalnızca arama için kullanılan kullanıcı arayüzünden oluşmalıdır. Telekomünikasyon çerçevesinin farkında olduğu tüm çağrıları ele almalı, çağrıların mahiyeti hakkında herhangi bir varsayımda bulunmamalıdır. Örneğin, çağrıların SIM tabanlı telefon çağrıları olduğunu varsaymamalı veya herhangi bir ConnectionService'e dayalı arama kısıtlamaları (video görüşmeleri için telefon kısıtlamalarının uygulanması gibi) uygulamamalıdır.

Arama uygulaması, kullanıcıların cihazlarına sesli veya görüntülü görüşme yapmalarına ya da olanak tanır. Uygulamalar, aramalar için aşağıdaki ekran görüntüsünde gösterildiği gibi, varsayılan Telefon uygulaması arayüzü.


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

Android çerçevesi, android.telecom paketini içerir. telekomünikasyon sektörüne uygun olarak arama uygulaması geliştirmenize yardımcı olacak bahsedeceğim. Uygulamanızı telekomünikasyon çerçevesine göre geliştirmek şu avantajları sağlar:

  • Uygulamanız Google Haritalar'daki yerel telekom alt sistemiyle olanak tanır.
  • Uygulamanız, şunlara da uyan diğer arama uygulamalarıyla doğru şekilde birlikte çalışıyor: bilmek zorundasınız.
  • Bu çerçeve, uygulamanızın ses ve video yönlendirmeyi 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, uygulamanızın MANAGE_OWN_CALLS izninin değerini değiştirin:

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

Uygulama izinlerini beyan etme hakkında daha fazla bilgi için bkz. İzinler.

Uygulamanızda ConnectionService sınıf bulunuyor. Telekomünikasyon alt sistem, hizmetin BIND_TELECOM_CONNECTION_SERVICE iznini beyan etmesini gerektirir. çok kolay oluyor. Aşağıdaki örnekte, uygulama manifestiniz:

<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 de dahil olmak üzere uygulama bileşenlerini bildirme hakkında daha fazla bilgi için bkz. Uygulama Bileşenleri.

Bağlantı hizmetini uygulama

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 kullanabilirsiniz:

onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)

Telekomünikasyon alt sistemi, çeşitli fonksiyonlara yanıt olarak uygulamanız placeCall(Uri, Bundle) numarasını arıyor simgesine dokunun. Uygulamanız, Connection sınıfı uygulamanızın yeni bir örneğini döndürüyor (daha fazla bilgi için bkz. Bağlantıyı uygulayın) giden çağrıya dokunun. Giden bağlantınızı aşağıdaki adımları uygulayarak daha da özelleştirebilirsiniz: şu işlemleri yapabilirsiniz:

onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)

Uygulamanız placeCall(Uri, Bundle) yöntemini çağırdığında ve giden çağrı şu an için çağrı yapamadığında telekomünikasyon alt sistemi bu yöntemi çağırır yerleştirilmelidir. Bu duruma yanıt olarak uygulamanız, kullanıcıyı ( Örneğin, bir uyarı kutusu veya kısa mesaj yer alır. Sürekli devam ederse uygulamanız arama yapamayabilir yoksa başka bir uygulamada devam eden bir çağrı olduğunda arama yapmadan önce beklemeye al.

onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)

Uygulamanız addNewIncomingCall(PhoneAccountHandle, Bundle) yöntemini çağırdığında telekomünikasyon alt sistemi bu yöntemi çağırır (uygulamanızda gelen yeni bir aramayı sisteme bildirmek için) Uygulamanız, Connection uygulamanızın yeni örneği ( daha fazla bilgi için Bağlantıyı uygulama bölümünü inceleyin) yeni gelen aramayı temsil eder. Gelen e-postaları bağlantısını kurmak için aşağıdaki işlemleri gerçekleştirin:

onCreateIncomingConnectionFailed(PhoneAccountHandle, ConnectionRequest)

Uygulamanız Telekom'a şu konuda bilgi vermek için addNewIncomingCall(PhoneAccountHandle, Bundle) yöntemini çağırdığında, telekomünikasyon alt sistemi bu yöntemi çağırır: yeni bir gelen çağrı, ancak gelen çağrıya izin verilmiyor (daha fazla çağrı kısıtlamaları bölümüne bakın). Uygulamanız gelen aramayı sessizce reddeder, isteğe bağlı olarak bir bildirim göndererek cevapsız çağrının kullanıcısıdır.

Bağlantıyı uygulayın

Uygulamanız aşağıdakileri yapmak için Connection alt sınıfı oluşturmalıdır: temsil eder. Aşağıdaki yöntemleri uygulamanız:

onShowIncomingCallUi()

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

onCallAudioStateChanged(CallAudioState)

Telekom alt sistemi, uygulamanıza mevcut sesin rota veya mod değişti. Bu, uygulamanızın ses modu için setAudioRoute(int) yöntemidir. Bu yöntem, sistem ses rotasını değiştirirse de çağrılabilir (örneğin, Bluetooth mikrofonlu kulaklık bağlantısı kesildiğinde).

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 aramayı beklemeli ve ardından Sisteme bilgi vermek için setOnHold() yöntemi olduğundan emin olun. Telekom alt sistemi aşağıdaki durumlarda bu yöntemi çağırabilir: gösteren bir çağrı hizmeti (ör. Android Auto) aramayı beklemeye almaya yönelik bir kullanıcı isteği iletmelidir. Telekom alt sistemi ayrıca bu yöntem, kullanıcı başka bir uygulamada etkin bir çağrı yaparsa. Daha fazla çağrı içi hizmetler hakkında bilgi için InCallService sayfasına bakın.

onUnhold()

Aşağıdaki durumlarda telekomünikasyon alt sistemi bu yöntemi çağırır: beklemeye alınan bir aramayı devam ettirmek istiyor. Uygulamanız devam ettirildiğinde çağırırsa setActive() yöntemini çağırır. yöntemini çağırın. Telekomünikasyon bir çağrı içi hizmet (ör. Android Auto, aramayı gösteren bir çağrıyı devam ettirmek için istek aktarmak istiyor. Örneğin, Arama içi hizmetler hakkında daha fazla bilgiyi InCallService adresinde bulabilirsiniz.

onAnswer()

Telekomünikasyon alt sistemi, bir e-posta göndererek uygulamanız gerektiğini de vurgulayabilirsiniz. Uygulamanız yanıt verdiğinde çağırırsa setActive() yöntemini çağırır. yöntemini kullanın. Telekomünikasyon uygulamanız yeni bir gelen çağrı eklediğinde ve alt sistem bu yöntemi çağırabilir. başka bir uygulamada beklemeye alınamayan devam eden bir arama var. Telekom alt sistemi, gelen arama kullanıcı arayüzünü uygulamanız adına şurada gösterir: bahsedeceğiz. Çerçeve, aşırı yüklenmiş bir yöntem sunar. destek simgesine dokunun. Daha fazla için bkz. onAnswer(int).

onReject()

Telekom alt sistemi, gelen bir iletiyi reddetmek istediğinde bu yöntemi çağırır. çağrısına bir tıklama URL'si eklemeniz gerekir. Uygulamanız çağrıyı reddettikten sonra, setDisconnected(DisconnectCause) öğesini çağırmalı ve parametre olarak REJECTED değerini belirtmelidir. Uygulamanız ardından destroy() yöntemini çağırarak uygulamanın aramayı işlediği sistem. Telekom alt sisteminin bu yöntem kullanıcı, uygulamanızdan gelen bir aramayı reddettiğinde kullanılabilir.

onDisconnect()

Telekom alt sistemi bir aramanın bağlantısını kesmek istediğinde bu yöntemi çağırır. Çağrı sona erdiğinde, uygulamanız setDisconnected(DisconnectCause) yöntemini çağırmalı ve parametre olarak LOCAL değerini belirterek kullanıcı isteği, aramanın bağlantısının kesilmesine neden oldu. Ardından uygulamanız Telekomünikasyona bilgi vermek için destroy() yöntem çağrıyı işlediği alt sistemdir. Sistem bu yöntemi çağırabilir Kullanıcı, başka bir görüşme içi hizmet (ör. Android Auto. Sistem, çağrınızın şöyle olması gerektiğinde de bu yöntemi çağırır: ve diğer çağrının yapılabilmesi için bağlantı kesildi (örneğin, kullanıcı isterse kullanıcı acil durum araması yapın. Görüşme içi hizmetler hakkında daha fazla bilgi edinmek için bkz. InCallService

Sık karşılaşılan arama senaryolarını yönetme

Çağrınızda ConnectionService API'den yararlanma android.telecom sınıfındaki diğer sınıflarla etkileşimde bulunur. paketinden yararlanın. Aşağıdaki bölümlerde, sık karşılaşılan arama senaryoları ve bu senaryoları bunları işlemek için API'leri kullanmalıdır.

Gelen sesli aramaları yanıtlama

Gelen aramaları işleme akışı, diğer uygulamalarda arama olup olmadığına bakılmaksızın değişir. hakkında bilgi edindiniz. Akışlardaki farkın nedeni, telekomünikasyon çerçevesinin diğer uygulamalarda etkin çağrılar olduğunda cihazdaki tüm arama uygulamaları için kararlı bir ortam sağlandığından emin olun. Daha fazla Arama kısıtlamaları bölümüne bakın.

Diğer uygulamalarda etkin arama yok

Diğer uygulamalarda etkin arama yokken gelen aramaları yanıtlamak için aşağıdaki adımları uygulayın: şu adımları uygulayın:

  1. Uygulamanız her zamanki mekanizmalarını kullanarak yeni bir gelen arama alır.
  2. addNewIncomingCall(PhoneAccountHandle, Bundle) yöntemini kullanarak telekom alt sistemini yeni gelen çağrı hakkında bilgilendirir.
  3. Telekom alt sistemi, uygulamanızın ConnectionService uygulamasına bağlanır ve yeni bir örnek ister yeni gelen trafiği temsil eden Connection sınıfının çağrısı için onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest) yöntemini kullanın.
  4. Telekom alt sistemi, uygulamanıza gelen aramayı göstermesi gerektiğini bildirir kullanıcı arayüzü için onShowIncomingCallUi() yöntemini kullanın.
  5. Uygulamanız, ilişkilendirilmiş bir bildirim kullanarak gelen kullanıcı arayüzünü gösterir. tam ekran intent. Daha fazla bilgiyi onShowIncomingCallUi() sayfasında bulabilirsiniz.
  6. Kullanıcı şu durumda setActive() yöntemini çağırın: gelen çağrıyı kabul eder veya setDisconnected(DisconnectCause), parametre olarak REJECTED değerini ve ardından gelen bir kullanıcı, destroy() yöntemini çağırırsa gelen aramayı reddeder.

Diğer uygulamalarda beklemeye alınamayan etkin aramalar

Diğer uygulamalarda şunu yapamayan etkin aramalar olduğunda gelen aramaları cevaplamak için: beklemeye alınırsa şu adımları uygulayın:

  1. Uygulamanız her zamanki mekanizmalarını kullanarak yeni bir gelen arama alır.
  2. addNewIncomingCall(PhoneAccountHandle, Bundle) yöntemini kullanarak telekom alt sistemini yeni gelen çağrı hakkında bilgilendirir.
  3. Telekom alt sistemi, uygulamanızın ConnectionService uygulamasına bağlanır ve yeni bir örnek ister yenisini temsil eden Connection nesnesinin onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest) yöntemini kullanarak gelen çağrı.
  4. Telekom alt sistemi, gelen çağrınız için gelen arama 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ünikasyona bildirmek için setActive() yöntemini çağırmalısınız çağrının bağlı olduğu alt sistemdir.
  6. Kullanıcı çağrıyı reddederse telekom alt sistemi onReject() yöntemini çağırır. REJECTED parametresini parametre olarak belirten setDisconnected(DisconnectCause) yöntemini ve ardından, destroy() yöntemine çağrı gönderir.

Giden arama yapma

Giden bir arama yapma akışı, müşterinin çağrısı, telekomünikasyon çerçevesinin uyguladığı kısıtlamalar nedeniyle gerçekleştirilemiyor. Daha fazla bilgi için Arama kısıtlamaları konusuna bakın.

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

  1. Kullanıcı, uygulamanızda giden bir arama başlatır.
  2. placeCall(Uri, Bundle) yöntemini kullanarak telekom alt sistemini bildirir. Aşağıdakileri alın yöntem parametreleriyle ilgili dikkat edilmesi gereken noktalar:
    • Uri parametresi, çağrısının yapıldığından emin olun. Normal telefon numaraları için tel: URI'sini kullanın şema.
    • Bundle parametresi, istenen bilgileri elde etmenize olanak tanır. EXTRA_PHONE_ACCOUNT_HANDLE ekstra öğesine uygulamanızın PhoneAccountHandle nesnesini ekleyerek arama uygulamanızla ilgili daha fazla bilgi edinin. Sizin uygulaması giden her çağrıya PhoneAccountHandle nesnesini sağlamalıdır.
    • Bundle parametresi, giden çağrı, EXTRA_START_CALL_WITH_VIDEO_STATE ek öğesinde STATE_BIDIRECTIONAL değerini belirterek video içerir. Varsayılan olarak, telekomünikasyon alt sisteminin görüntülü görüşmeleri hoparlör.
  3. Telekom alt sistemi, uygulamanızın ConnectionService öğesine bağlanır bazı ipuçları vereceğim.
  4. Uygulamanız giden arama yapamıyorsa telekom alt sistemi sizi onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest) yöntemini kullanarak Uygulamanıza aramanın şu anda yapılamayacağını bildirir. Uygulamanız kullanıcıya aramanın yapılamadığını bildirmelidir.
  5. Uygulamanız giden çağrıyı yapabiliyorsa telekom alt sistemi onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest) yöntemidir. Uygulamanız, giden yeni aramayı temsil etmek için Connection sınıfınızın bir örneğini döndürmelidir. Örneğin, bağlantıda ayarlamanız gereken özellikler hakkında daha fazla bilgi Bağlantı hizmetini uygulama başlıklı makaleyi inceleyin.
  6. Giden arama bağlandığında telekom alt sistemini bilgilendirmek için setActive() yöntemini çağırın etkin olduğundan emin olun.

Çağrıyı bitirme

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

  1. Kullanıcı aşağıdaki durumlarda parametre olarak LOCAL gönderen setDisconnected(DisconnectCause) öğesini çağırın: aramayı sonlandırın, veya REMOTE numaralı telefonu gönderin parametre olarak kullanır.
  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 şirketi çerçeve, cihazdaki aramaların yönetimi için bazı kısıtlamalar uygular. Örneğin, Örneğin, kullanıcının uygulama yükleme işlemini destekleyen kendi kendine yönetilen ConnectionService API'si, FooTalk ve BarTalk. Bu durumda, aşağıdaki kısıtlamalar geçerlidir:

  • API düzeyi 27 veya önceki sürümlerde çalışan cihazlarda yalnızca bir uygulama istediğiniz zaman devam edebilirsiniz. Bu kısıtlama, bir kullanıcının FooTalk uygulaması kullanılarak devam eden bir arama varsa, BarTalk uygulaması yeni bir çağrı.

    Hem FooTalk hem de BarTalk, API düzeyi 28 veya üstünde çalıştırılan cihazlarda beyan etmek CAPABILITY_SUPPORT_HOLD ve CAPABILITY_HOLD kullanıcı, birden fazla devam eden çağrı yürütebilir. Uygulamalar arasında geçiş yaparak başka bir aramayı başlatabilir ya da yanıtlayabilirsiniz.

  • Kullanıcı normal yönetilen aramalar yapıyorsa (örneğin, yerleşik Telefon veya Çevirici uygulaması) kullanıcı, ve uygulamaları arayın. Bu, kullanıcı eş zamanlı olarak FooTalk veya BarTalk görüşmesinde de bulunamazlar.

  • Kullanıcı bir arama yaparsa telekomünikasyon alt sistemi acil durum araması.

  • Uygulamanız, kullanıcı acil durum aramasındayken arama alamaz veya yapamaz.

  • Uygulamanız yanıt aldığında başka bir arama uygulamasında devam eden bir arama varsa gelen aramayı yanıtlarsanız, gelen çağrıyı yanıtlamak başka uygulama. Uygulamanız normal gelen arama kullanıcı arayüzünü göstermemelidir. Telekomünikasyon çerçevesi, gelen arama kullanıcı arayüzünü gösterir ve yeni aramayı yanıtlayan kullanıcının, devam eden aramaları sona erecek olması gerekir. Bu Kullanıcı bir FooTalk görüşmesindeyse ve BarTalk uygulaması, uyarsa telekomünikasyon çerçevesi kullanıcıya yeni bir cihazın olduğu BarTalk çağrısına cevap veren bir kullanıcı, telefonunu FooTalk araması.

Varsayılan Telefon Uygulaması Olma

Varsayılan numara çevirici/telefon uygulaması, cihaz açıkken görüşme içi kullanıcı arayüzünü sağlayan uygulamadır. karar verebilir. Ayrıca kullanıcıya arama başlatma ve arama geçmişini görme imkanı sunar. cihazlarında test edebilirsiniz. Bir cihaz, sistem tarafından sağlanan bir varsayılan numara çevirici/telefon uygulamasıyla birlikte gelir. Kullanıcı bu rolü tek bir uygulama üzerinden devralabilir. Bir uygulama rolü yerine getirmek için RoleManager RoleManager.ROLE_DIALER rol.

Varsayılan telefon uygulaması, cihaz arama sırasında bir kullanıcı arayüzü sağlar. Cihaz araç modunda değil (UiModeManager#getCurrentModeType() değil) Configuration.UI_MODE_TYPE_CAR) tıklayın.

RoleManager.ROLE_DIALER rolünün doldurulması için uygulamanın gereklilik sayısı:

  • Intent#ACTION_DIAL amacını işlemesi gerekir. Bu, uygulamanın kullanıcının giden aramaları başlatması için bir tuş takımı kullanıcı arayüzü.
  • InCallService API'yi tam olarak uygulamalı ve hem gelen çağrıyı hem de kullanıcı arayüzü ve devam eden çağrı kullanıcı arayüzü.

Not: RoleManager.ROLE_DIALER öğesini dolduran uygulama null InCallService, Telekom çerçevesi otomatik olarak düşer cihaza önceden yüklenmiş olarak gelen numara çevirici uygulamasına geri dönün. Sistem, şu adrese bir bildirim gösterir: kullanıcıya, aramalarının önceden yüklenmiş numara çevirici uygulaması ile devam ettiğini bildirmesi gerekir. Sizin uygulama hiçbir zaman null bağlaması döndürmemelidir; yani böyle bir durumda RoleManager.ROLE_DIALER gereksinimleri.

Not: Uygulamanız RoleManager.ROLE_DIALER dolduruyor ve şu saatte değişiklik yapıyorsa: bu rolün gerekliliklerini yerine getirememesine neden olabilir. RoleManager, uygulamanızı rolden otomatik olarak kaldıracak ve kapatacak en iyi şekilde yararlanabilirsiniz. Örneğin, PackageManager.setComponentEnabledSetting(ComponentName, int, int) - uygulamanızın manifest dosyasında beyan ettiği InCallService öğesini, uygulamanızda programatik olarak devre dışı bırakın artık proje yöneticisinin beklentileri ne kadar RoleManager.ROLE_DIALER.

Önceden yüklenmiş numara çevirici, aşağıdaki durumlarda bile kullanıcı bir acil durum araması yaptığında HER ZAMAN kullanılır. Uygulama RoleManager.ROLE_DIALER rolünü doldurduğunda. En uygun acil durum araması yaptığınızda varsayılan numara çevirici HER ZAMAN Arama yapmak için TelecomManager.placeCall(Uri, Bundle) (şunlar dahil: acil durum aramaları) ekleyebilirsiniz. Bu, platformun, isteğin geldiğini doğrulayabilmesini sağlar. otomatik olarak ayarlanır. Önceden yüklenmemiş bir numara çevirici uygulaması birIntent#ACTION_CALL acil durum araması, Intent#ACTION_DIAL kullanılarak önceden yüklenmiş numara çevirici uygulamasına yükseltilecek (Onay için; bu optimum olmayan bir kullanıcı deneyimidir.

Aşağıda, InCallService için manifest kaydı örneği verilmiştir. Meta veriler TelecomManager#METADATA_IN_CALL_SERVICE_UI, bu belirli InCallService uygulamasının uygulanması, yerleşik görüşme içi kullanıcı arayüzünün yerini almayı amaçlamaktadır. TelecomManager#METADATA_IN_CALL_SERVICE_RINGING meta verileri, bunun InCallService gelen aramalarda zil sesini çalacak. Görüntüleyin aşağıya bakın Kullanıcı arayüzü ve uygulamanızda zil sesi çalınıyor.

 <service android:name="your.package.YourInCallServiceImplementation"
          android:permission="android.permission.BIND_INCALL_SERVICE"
          android:exported="true">
      <meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
      <meta-data android:name="android.telecom.IN_CALL_SERVICE_RINGING"
          android:value="true" />
      <intent-filter>
          <action android:name="android.telecom.InCallService"/>
      </intent-filter>
 </service>

Not: InCallService özelliğini şu özellikle İŞARETLEMEMELİSİNİZ. android:exported="false"; bunu yapmak, uygulamanıza bağlanamaz dikkatinizi çekebilir.

InCallService API'yi uygulamanın yanı sıra aşağıdakileri de beyan etmeniz gerekir: Intent#ACTION_DIAL amacını işleyen manifest dosyanız. Aşağıdaki örnekte, nasıl yapılır?

 <activity android:name="your.package.YourDialerActivity"
           android:label="@string/yourDialerActivityLabel">
      <intent-filter>
           <action android:name="android.intent.action.DIAL" />
           <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
      <intent-filter>
           <action android:name="android.intent.action.DIAL" />
           <category android:name="android.intent.category.DEFAULT" />
           <data android:scheme="tel" />
      </intent-filter>
 </activity>

Bir kullanıcı uygulamanızı yüklediğinde ve ilk kez çalıştırdığında RoleManager: Kullanıcılardan uygulamanızın bunları isteyip istemediklerini telefon uygulamanız olacak.

Aşağıdaki kod, uygulamanızın varsayılan telefon/arama uygulaması olmak için nasıl istekte bulunabileceğini gösterir:

 private static final int REQUEST_ID = 1;

 public void requestRole() {
     RoleManager roleManager = (RoleManager) getSystemService(ROLE_SERVICE);
     Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_DIALER);
     startActivityForResult(intent, REQUEST_ID);
 }

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == REQUEST_ID) {
         if (resultCode == android.app.Activity.RESULT_OK) {
             // Your app is now the default dialer app
         } else {
             // Your app is not the default dialer app
         }
     }
 }

Giyilebilir Cihazlar için InCallService erişimi

    Uygulamanız bir üçüncü taraf tamamlayıcı uygulamasıysa ve InCallService API'lerine erişmek istiyorsa yapabilecekleri şunlardır:

    1. Manifest'inizde MANAGE_ONGOING_CALLS izni beyan edin
    2. Şunu kullanarak fiziksel bir giyilebilir cihazla ilişkilendirin: Tamamlayıcı uygulama olarak CompanionDeviceManager API. Bkz.: https://developer.android.com/guide/topics/connectivity/tamamlayıcı-device-pairing
    3. Bu InCallService'i BIND_INCALL_SERVICE izniyle uygulayın

Gelen Arama Bildirimi Gösteriliyor

Uygulamanız InCallService#onCallAdded(Call) üzerinden yeni bir arama aldığında gelen çağrı için gelen arama kullanıcı arayüzünü görüntülemekten sorumludur. Bu işlemi, NotificationManager API'leri kullanarak yeni bir gelen arama bildirimi yayınlayın.

Uygulamanızın meta verileri tanımladığı durumlarda TelecomManager#METADATA_IN_CALL_SERVICE_RINGING gelen aramalarda zil sesini çalmaktan sorumludur. Uygulamanız, İstenen zil sesini belirten NotificationChannel. Örnek:

 NotificationChannel channel = new NotificationChannel(YOUR_CHANNEL_ID, "Incoming Calls",
          NotificationManager.IMPORTANCE_MAX);
 // other channel setup stuff goes here.

 // We'll use the default system ringtone for our incoming call notification channel.  You can
 // use your own audio resource here.
 Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
 channel.setSound(ringtoneUri, new AudioAttributes.Builder()
          // Setting the AudioAttributes is important as it identifies the purpose of your
          // notification sound.
          .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
          .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
      .build());

 NotificationManager mgr = getSystemService(NotificationManager.class);
 mgr.createNotificationChannel(channel);

Uygulamanız yeni bir gelen arama aldığında, yeni gelen arama için bir Notification gelen çağrıyı, gelen çağrı bildirim kanalınızla ilişkilendirir. Hedeflerinize göre bir Bildirimde, tam ekranınızı başlatacak PendingIntent kullanıcı arayüzü. Bildirim yöneticisi çerçevesi, bildiriminizi Kullanıcı, telefonu aktif olarak kullanıyorsa uyarı bildirimi. Kullanıcı bunun yerine tam ekran gelen arama kullanıcı arayüzünüz kullanılır. Örnek:

 // Create an intent which triggers your fullscreen incoming call user interface.
 Intent intent = new Intent(Intent.ACTION_MAIN, null);
 intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION | Intent.FLAG_ACTIVITY_NEW_TASK);
 intent.setClass(context, YourIncomingCallActivity.class);
 PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_MUTABLE_UNAUDITED);
 // Build the notification as an ongoing high priority item; this ensures it will show as
 // a heads up notification which slides down over top of the current content.
 final Notification.Builder builder = new Notification.Builder(context);
 builder.setOngoing(true);
 builder.setPriority(Notification.PRIORITY_HIGH);
 // Set notification content intent to take user to the fullscreen UI if user taps on the
 // notification body.
 builder.setContentIntent(pendingIntent);
 // Set full screen intent to trigger display of the fullscreen UI when the notification
 // manager deems it appropriate.
 builder.setFullScreenIntent(pendingIntent, true);
 // Setup notification content.
 builder.setSmallIcon( yourIconResourceId );
 builder.setContentTitle("Your notification title");
 builder.setContentText("Your notification content.");
 // Use builder.addAction(..) to add buttons to answer or reject the call.
 NotificationManager notificationManager = mContext.getSystemService(
     NotificationManager.class);
 notificationManager.notify(YOUR_CHANNEL_ID, YOUR_TAG, YOUR_ID, builder.build());
```