IMS uygulayın

Android 9, IP Multimedya Alt Sistemi'ni (IMS) uygulamanıza yardımcı olmak için ImsService adlı yeni bir SystemApi arayüzü sunar. ImsService API, Android platformu ile tedarikçi veya operatör tarafından sağlanan IMS uygulaması arasında iyi tanımlanmış bir arayüzdür.

ImsService'e genel bakış

Şekil 1. ImsService'e genel bakış

IMS uygulayıcısı, ImsService arayüzünü kullanarak platforma sesli ve görüntülü görüşme sağlamak için IMS kayıt bilgileri, IMS üzerinden SMS entegrasyonu ve MmTel özellik entegrasyonu gibi önemli sinyal bilgileri sağlayabilir. ImsService API de bir Android sistem API'sidir. Yani kaynak yerine doğrudan Android SDK'sına göre derlenebilir. Cihaza önceden yüklenmiş bir IMS uygulaması da Play Store'da güncellenebilir şekilde yapılandırılabilir.

Örnekler ve kaynak

Android, test ve geliştirme amacıyla ImsService API'nin bölümlerini uygulayan bir uygulamayı AOSP'de sağlar. Uygulamayı /testapps/ImsTestService adresinde bulabilirsiniz.

ImsService API'nin belgelerini ImsService'te ve API'deki diğer sınıflarda bulabilirsiniz.

Uygulama

ImsService API, mevcut donanıma bağlı olarak IMS'yi birçok şekilde uygulamanıza olanak tanıyan üst düzey bir API'dir. Örneğin, uygulama, IMS uygulamasının tamamen uygulama işlemcisinde mi yoksa kısmen veya tamamen modeme mi aktarıldığına bağlı olarak değişir. Android, baz band işlemciye aktarma işlemi için herkese açık bir HAL sağlamaz. Bu nedenle, tüm aktarma işlemleri modem için HAL uzantınız kullanılarak yapılmalıdır.

Eski IMS uygulamalarıyla uyumluluk

Android 9, ImsService API'yi içerse de IMS için eski bir uygulama kullanan cihazlar API'yi destekleyemez. Bu cihazlarda eski AIDL arayüzleri ve sarmalayıcı sınıfları android.telephony.ims.compat ad alanına taşındı. Android 9'a yükseltme yaparken eski cihazların eski API'yi desteklemeye devam edebilmesi için aşağıdakileri yapması gerekir.

  • ImsService uygulamasının ad alanını, android.telephony.ims.compat ad alanı API'sinden genişletilecek şekilde değiştirin.
  • AndroidManifest.xml'deki ImsService hizmet tanımını, android.telephony.ims.ImsService işlemi yerine android.telephony.ims.compat.ImsService intent-filter işlemini kullanacak şekilde değiştirin.

Daha sonra çerçeve, eski ImsService uygulamasıyla çalışmak için Android 9'da sağlanan uyumluluk katmanını kullanarak ImsService'e bağlanır.

Çerçeveye ImsService kaydı

ImsService API'si, Android çerçevesinin IMS uygulamasıyla iletişim kurmak için bağlandığı bir hizmet olarak uygulanır. Çerçeveye bir ImsService uygulayan bir uygulamayı kaydetmek için üç adım gerekir. Öncelikle, ImsService uygulaması kendisini uygulamanın AndroidManifest.xml değerini kullanarak platforma kaydettirmelidir. İkinci olarak, uygulamanın hangi IMS özelliklerini desteklediğini (MmTel veya RCS) tanımlamalıdır. Üçüncü olarak da, operatör yapılandırmasında veya cihaz yer paylaşımında güvenilir IMS uygulaması olarak doğrulanmalıdır.

Hizmet tanımı

IMS uygulaması, aşağıdaki biçimi kullanıp manifeste service girişi ekleyerek çerçeveyle bir ImsService kaydeder:

<service
    android:name="com.egcorp.ims.EgImsService"
    android:directBootAware="true"
    Android:persistent="true"
    ...
    android:permission="android.permission.BIND_IMS_SERVICE" >
    ...
    <intent-filter>
        <action android:name="android.telephony.ims.ImsService" />
    </intent-filter>
</service>

AndroidManifest.xml içindeki service tanımı, doğru çalışma için gerekli olan aşağıdaki özellikleri tanımlar:

  • directBootAware="true": Kullanıcı cihazın kilidini açmadan önce hizmetin telephony tarafından keşfedilmesini ve çalıştırılmasını sağlar. Kullanıcı cihazın kilidini açmadan önce hizmet, cihaz şifrelenmiş depolamaya erişemez. Daha fazla bilgi için Doğrudan önyükleme modunu destekleme ve Dosya tabanlı şifreleme başlıklı makaleleri inceleyin.
  • persistent="true": Bu hizmetin sürekli olarak çalıştırılmasına ve bellek geri almak için sistem tarafından kapatılmamasına olanak tanır. Bu özellik YALNIZCA uygulama sistem uygulaması olarak oluşturulmuşsa çalışır.
  • permission="android.permission.BIND_IMS_SERVICE": Yalnızca BIND_IMS_SERVICE izni verilen bir sürecin uygulamaya bağlanmasını sağlar. Çerçeve yalnızca sistem uygulamalarına izin verebileceğinden, bu izin kötü amaçlı bir uygulamanın hizmete bağlanmasını engeller.

Hizmet, android.telephony.ims.ImsService işlemini içeren intent-filter öğesini de belirtmelidir. Bu sayede çerçeve ImsService öğesini bulabilir.

IMS özellik spesifikasyonu

ImsService, AndroidManifest.xml'de Android hizmeti olarak tanımlandıktan sonra desteklediği IMS özelliklerini tanımlamalıdır. Android şu anda MmTel ve RCS özelliklerini desteklemektedir ancak yalnızca MmTel çerçeveye entegre edilmiştir. Çerçeveye entegre edilmiş RCS API'si olmasa da bu özelliği ImsService'in bir özelliği olarak belirtmenin avantajları vardır.

Aşağıda, bir ImsService tarafından sağlanabilecek android.telephony.ims.ImsFeature maddesinde tanımlanan geçerli özelliklerin yanı sıra bir IMS uygulamasının bu özelliklerden birini veya tümünü neden uygulamak isteyebileceğine dair bir açıklama ve örnek verilmiştir. Her özellik tanımlandıktan sonra bu sayfada, ImsService öğesinin her SIM yuvası için tanımladığı özellik grubunu nasıl açıkladığı özetlenir.

FEATURE_MMTEL

ImsService, acil durum araması için IMS PDN'ye acil durum eki dışında tüm IMS medyalarına (IR.92 ve IR.94 spesifikasyonları) destek içeren IMS MMTEL özelliğini uygular. MMTEL özelliklerini desteklemek isteyen tüm ImsService uygulamalarında android.telephony.ims.MmTelFeature temel sınıfı genişletmeli ve ImsService#createMmTelFeature içinde özel bir MmTelFeature uygulaması döndürülmelidir.

FEATURE_EMERGENCY_MMTEL

Bu özelliğin bildirilmesi yalnızca, platforma acil durum hizmetleri için IMS PDN'ye acil durum bağlantısının yapılabileceği sinyalini verir. Bu özellik ImsService cihazınız için bildirilmezse platform, acil durum hizmetleri için her zaman varsayılan olarak devre anahtarı yedeğini kullanır. Bu özelliğin tanımlanabilmesi için FEATURE_MMTEL özelliği tanımlanmış olmalıdır.

FEATURE_RCS

ImsService API, IMS RCS özelliklerini uygulamaz ancak android.telephony.ims.RcsFeature temel sınıfı yine de yararlı olabilir. Çerçeve, paketin RCS sağlaması gerektiğini algıladığında ImsService'e otomatik olarak bağlanır ve ImsService#createRcsFeature'yi çağırır. RCS hizmetiyle ilişkili SIM kart kaldırılırsa çerçeve otomatik olarak RcsFeature#onFeatureRemoved çağrısını yapar ve ardından RCS özelliğiyle ilişkili ImsService öğesini temizler. Bu işlev, bir RCS özelliğinin sağlaması gereken özel algılama veya bağlama mantığının bir kısmını kaldırabilir.

Desteklenen özelliklerin kaydı

Telefon çerçevesi, ImsService#querySupportedImsFeatures API'yi kullanarak desteklediği özellikleri sorgulamak için önce ImsService'e bağlanır. Çerçeve, ImsService'in hangi özellikleri destekleyeceğini hesapladıktan sonra ImsService'in sorumlu olacağı her özellik için ImsService#create[...]Feature işlevini çağırır. IMS uygulamasının desteklediği özellikler değişirse desteklenen özellikleri yeniden hesaplaması için çerçeveye sinyal göndermek üzere ImsService#onUpdateSupportedImsFeatures kullanabilirsiniz. ImsService'in başlatılması ve bağlanması hakkında daha fazla bilgi için aşağıdaki şemaya bakın.

ImsService&#39;i başlatma ve bağlama

Şekil 2: ImsService'i başlatma ve bağlama

ImsService uygulamasının çerçeve algılama ve doğrulama

ImsService, AndroidManifest.xml'de doğru şekilde tanımlandıktan sonra platform, uygun olduğunda ImsService'e (güvenli bir şekilde) bağlanacak şekilde yapılandırılmalıdır. Çerçevenin bağlandığı iki tür ImsServices vardır:

  1. Operatör "override" ImsService: Bu ImsServices cihaza önceden yüklenmiş olsa da bir veya daha fazla hücresel operatöre bağlıdır ve yalnızca eşleşen bir SIM kart takıldığında bağlanır. Bu,
  2. Cihazın "varsayılan" ImsService: Bu, bir OEM tarafından cihaza yüklenen varsayılan ImsService'tir ve operatör ImsService'inin kullanılamadığı tüm durumlarda IMS hizmetleri sağlamak üzere tasarlanmalıdır. Cihazın takılı SIM kartı yoksa veya takılı SIM kartta operatör ImsService yüklü değilse bu ImsService faydalıdır. Bu, cihaz yer paylaşımında aşağıdaki yapılandırmalar kullanılarak tanımlanır:

Android, üçüncü taraflarca indirilebilen ImsService uygulamalarını desteklemez. Bu nedenle, burada tanımlanan tüm ImsService uygulamalarının sistem uygulaması olması ve uygun izinleri (ör. telefon, mikrofon, konum, kamera ve kişiler izinleri) vermek için /system/priv-app/ veya /product/priv-app/ klasöründe bulunması gerekir. IMS uygulamasının paket adının, yukarıda tanımlanan CarrierConfig veya cihaz yer paylaşımı değerleriyle eşleşip eşleşmediğini doğrulayarak yalnızca güvenilir, önceden yüklenmiş uygulamalar bağlanır.

Özelleştirme

ImsService kullanan uygulamalar yalnızca operatör tarafından "geçersiz kıl" ImsService veya MMTEL ya da RCS işlevi için cihaz "varsayılan" olarak yapılandırıldıkları cihazlara bağlıdır. ImsService ayrıca, desteklediği IMS özelliklerinin (MMTEL ve RCS) ImsService#onUpdateSupportedImsFeatures yöntemi kullanılarak güncellemeler kullanılarak dinamik olarak etkinleştirilmesine veya devre dışı bırakılmasına olanak tanır. Bu, hangi ImsServices'in bağlı olduğunu ve hangi özellikleri desteklediğini yeniden hesaplama çerçevesini tetikler. IMS uygulaması, desteklenen özellik içermeyen bir çerçeve güncellemesi yaparsa telefon yeniden başlatılana veya IMS uygulamasıyla eşleşen yeni bir SIM kart takılana kadar ImsService bağlanmaz.

Birden fazla ImsService için bağlama önceliği

Çerçeve, cihaza önceden yüklenmiş tüm olası ImsServices'e bağlanmayı destekleyemez ve SIM yuvarı başına iki adede kadar ImsServices'e (her özellik için bir ImsService) aşağıdaki sırayla özellik bazında bağlanır:

  1. SIM kart takılıyken CarrierConfig değeri config_ims_[mmtel/rcs]_package_override_string tarafından tanımlanan ImsService paket adı.
  2. config_ims_[mmtel/rcs]_package için cihaz yer paylaşımı değerinde tanımlanan ImsService paketi adı, SIM kartın takılı olmadığı durumlar da dahildir. Bu ImsService, Acil Durum MmTel özelliğini DESTEKLEMELİDİR.

You must either have the package name of your ImsService defined in the CarrierConfig for each of the carriers that will use that package or in the device overlay if your ImsService will be the default, as defined above.

Bu metriği her bir özellik için ayrı ayrı inceleyelim. Tek SIM kart yüklü bir cihazda (tek veya çoklu SIM) iki IMS özelliği kullanılabilir: MMTel ve RCS. Çerçeve, her özellik için yukarıda tanımlanan sırayla bağlamaya çalışır. Bu özellik, Operatör Yapılandırması geçersiz kılmasında tanımlanan ImsService için kullanılamıyorsa çerçeve varsayılan ImsService hizmetinize döner. Örneğin, aşağıdaki tabloda, aşağıdaki özelliklere sahip bir sisteme ImsServices'i uygulayan üç IMS uygulamasının bulunduğu bir durumda çerçevenin hangi IMS özelliğini kullanacağı açıklanmaktadır:

  • Operatör A ImsService RCS'yi destekler
  • Operatör B ImsService, RCS ve MMTel'i destekler
  • OEM ImsService, RCS ve MMTel'i destekler
SIM Kart Takıldı RCS Özelliği MMTel Özelliği
A Operatörü A Operatörü OEM
Operatör B Operatör B Operatör B
SIM kart yok OEM OEM

Doğrulama

IMS spesifikasyonları son derece büyük olduğu ve özel doğrulama ekipmanları kullandığı için IMS uygulamasını doğrulamaya yönelik araçlar dahil edilmemiştir. Testler yalnızca telephony çerçevesinin ImsService API'ye doğru şekilde yanıt verdiğini doğrulayabilir.

IMS uygulaması geliştirme

Android telefon yığını ile arayüz oluşturan bir IMS uygulaması geliştirirken uygulamanın, belirli bir operatör aboneliği için eklenmiş ImsService örneğinin durumunu dinleyebilmesini veya değiştirebilmesini belirtmenizi öneririz.

MMTEL ve RCS özellikleri için ImsService'in durumunu dinlemek veya değiştirmek amacıyla ImsMmTelManager, ImsRcsManager veya IMS'ye özgü ProvisioningManager sınıfının bir örneğini almak için ImsManager sınıfını kullanın. Uygulama daha sonra IMS'ye özgü hizmet ve temel hazırlama durumlarını dinleyebilir. Örneğin:

  • Etkin ve kullanılabilir MMTEL veya RCS özellikleri
  • IMS kayıt durumu değiştiğinde yapılan güncellemeler
  • IMS özelliklerinin temel hazırlık durumu
  • Kullanıcının etkinleştirdiği IMS özellikleri

ImsStateCallback kullanma

ImsService kalıcı olarak bağlı bir hizmet olsa da yeni bir SIM kart veya yerleşik abonelik etkinleştiğinde ya da bir operatör yapılandırması değiştiğinde bağlı hizmet değişebilir. ImsService, telefon işleminin bir parçası olmadığından, ImsService görünmez bir şekilde kilitlenirse veya abonelik ya da yapılandırma değişikliği nedeniyle bağları kaldırılırsa uygulama, IMS API'lerine erişmeye çalışırken beklenmedik istisnalarla karşılaşabilir.

Android 13 veya sonraki sürümleri çalıştıran cihazlarda, ilişkili bir abonelik için ImsService örneğinin kullanılabilir olup olmadığını izlemek amacıyla ImsStateCallback sınıfı kullanılabilir. ImsMmTelManager veya ImsRcsManager örneği alırken uygulamanın önce ImsMmTelManager#registerImsStateCallback veya ImsRcsManager#registerImsStateCallback kullanarak bir IMS durumu geri çağırma işlevine kaydolmasını öneririz. ImsService tekrar kullanıma sunulduğunda belirli abonelikler için geri çağırma güncellemeleri almaya devam etmek istiyorsanız uygulamanın ImsMmTelManager, ImsRcsManager veya ProvisioningManager üzerinden kayıtlı mevcut geri çağırmaların kaydını iptal etmesi veya bunları silmesi ve yeni geri çağırma kayıt etmesi gerekir.

IMS'yi desteklemeyen bir abonelik varsa çerçeve, REASON_NO_IMS_SERVICE_CONFIGURED nedenini belirterek ImsStateCallback#onUnavailable işlevini çağırır. Bu, abonelik için ImsService ve IMS ile ilgili API'lerin kullanılamayacağı anlamına gelir.

Telefon işleminin çökmesi ihtimaline karşı uygulama ImsStateCallback#onError alır ve artık kayıtlı ImsStateCallback örneğiyle ilgili güncelleme almaz. Bu koşuldan kurtulmak için ImsMmTelManager#registerImsStateCallback veya ImsRcsManager#registerImsStateCallback numaralı telefonu arayarak ilişkilendirilmiş abonelik için ImsStateCallback örneğini yeniden kaydedin.