IMS'yi uygulama

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

ImsService'e genel bakış

1. şekil. ImsService'e genel bakış

IMS uygulayıcısı, ImsService arayüzünü kullanarak platforma önemli sinyal bilgileri (ör. IMS kayıt bilgileri, IMS üzerinden SMS entegrasyonu ve sesli ve görüntülü görüşme sağlamak için MmTel özelliği entegrasyonu) sağlayabilir. ImsService API de bir Android sistem API'sidir. Bu nedenle, kaynak yerine doğrudan Android SDK'ya karşı oluşturulabilir. Cihaza önceden yüklenmiş bir IMS uygulaması da Play Store'dan güncellenebilecek ş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 sunar. Uygulamayı /testapps/ImsTestService adresinde bulabilirsiniz.

ImsService API'nin belgelerini ImsService 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, IMS uygulaması tamamen uygulama işlemcisinde mi yoksa kısmen veya tamamen modeme mi aktarılmış olduğuna bağlı olarak uygulama değişiklikleri yapılır. Android, temel bant işlemcisine yük boşaltma için herkese açık bir HAL sağlamaz. Bu nedenle, yük boşaltma işlemleri modem için HAL uzantınız kullanılarak yapılmalıdır.

Eski IMS uygulamalarıyla uyumluluk

Android 9, ImsService API'sini içerse de IMS için eski bir uygulamayı 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 desteğini sürdürmek için aşağıdakileri yapması gerekir.

  • ImsService uygulamasının ad alanını, android.telephony.ims.compat ad alanı API'sinden genişleyecek şekilde değiştirin.
  • AndroidManifest.xml dosyasındaki 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.

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

ImsService'in çerçeveye kaydı

ImsService API, Android çerçevesinin IMS uygulamasıyla iletişim kurmak için bağlandığı bir hizmet olarak uygulanır. ImsService'i çerçeveyle uygulayan bir uygulamayı kaydetmek için üç adım gerekir. İlk olarak, ImsService uygulaması, uygulamanın AndroidManifest.xml kullanarak kendisini platforma kaydetmelidir. İkinci olarak, uygulamanın hangi IMS özelliklerini desteklediğini (MmTel veya RCS) tanımlamalıdır. Üçüncü olarak, 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 kullanarak manifeste bir service girişi ekleyerek çerçeveye 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 bölümündeki 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 bulunup çalıştırılmasına izin verir. Hizmet, kullanıcı cihazın kilidini açmadan önce şifrelenmiş cihaz depolama alanına erişemez. Daha fazla bilgi için Doğrudan başlatma modunu destekleme ve Dosya tabanlı şifreleme başlıklı makaleleri inceleyin.
  • persistent="true": Bu hizmetin sürekli olarak çalışmasına ve sistem tarafından bellek geri kazanmak için sonlandırılmamasına olanak tanır. Bu özellik YALNIZCA uygulama sistem uygulaması olarak oluşturulduysa çalışır.
  • permission="android.permission.BIND_IMS_SERVICE": Yalnızca BIND_IMS_SERVICE izni verilmiş bir işlemin uygulamaya bağlanabilmesini sağlar. Bu, yalnızca sistem uygulamalarına çerçeve tarafından izin verilebildiğinden, kötü amaçlı bir uygulamanın hizmete bağlanmasını engeller.

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

IMS özelliği spesifikasyonu

ImsService, AndroidManifest.xml'de bir Android hizmeti olarak tanımlandıktan sonra hangi IMS özelliklerini desteklediğini 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'leri olmasa da ImsService'in bir özelliği olarak bildirilmesinin avantajları vardır.

Aşağıda, android.telephony.ims.ImsFeature içinde tanımlanan ve bir ImsService'in sağlayabileceği geçerli özellikler ile bir IMS uygulamasının bu özelliklerden birini veya tümünü neden uygulamak isteyeceğine dair açıklama ve örnek verilmiştir. Her özellik tanımlandıktan sonra bu sayfada, ImsService öğesinin her SIM yuvası için tanımladığı özellikler kümesini nasıl bildirdiği açıklanmaktadır.

FEATURE_MMTEL

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

FEATURE_EMERGENCY_MMTEL

Bu özelliği beyan etmek, yalnızca platforma acil durum hizmetleri için IMS PDN'ye acil durum eklemenin mümkün olduğunu bildirir. Bu özellik ImsService için bildirilmezse platform, acil durum hizmetleri için her zaman devre anahtarlama geri dönüşünü varsayılan olarak kullanır. Bu özelliğin tanımlanabilmesi için FEATURE_MMTEL özelliği tanımlanmalıdır.

FEATURE_RCS

ImsService API, herhangi bir IMS RCS özelliği uygulamamaktadır 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'ı çağırır. RCS hizmetiyle ilişkili SIM kart çıkarılırsa çerçeve otomatik olarak RcsFeature#onFeatureRemoved işlevini çağırır ve ardından RCS özelliğiyle ilişkili ImsService temizlenir. Bu işlev, bir RCS özelliğinin aksi takdirde sağlaması gereken özel algılama veya bağlama mantığının bir kısmını kaldırabilir.

Desteklenen özelliklerin kaydı

Telefon çerçevesi, desteklediği özellikleri ImsService#querySupportedImsFeatures API'sini kullanarak 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 ImsService#onUpdateSupportedImsFeatures kullanarak çerçeveye desteklenen özellikleri yeniden hesaplaması için sinyal gönderebilirsiniz. ImsService'in başlatılması ve bağlanması hakkında daha fazla bilgi için aşağıdaki şemaya bakın.

ImsService başlatılıyor ve bağlanıyor

Şekil 2. ImsService başlatma ve bağlama

ImsService uygulamasının çerçeve tespiti ve doğrulanması

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 ImsService vardır:

  1. Operatör "geçersiz kılma" ImsService'leri: Bu ImsService'ler cihaza önceden yüklenir ancak 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 "varsayılan" ImsService: Bu, bir OEM tarafından cihaza yüklenen varsayılan ImsService'dir. Operatör ImsService'in kullanılamadığı tüm durumlarda IMS hizmetleri sağlamak üzere tasarlanmalıdır. Cihaza SIM kart takılmadığı veya takılan SIM kartta operatör ImsService'in yüklü olmadığı durumlarda kullanışlıdır. Bu, aşağıdaki yapılandırmalar kullanılarak cihaz yer paylaşımında tanımlanır:

Android, üçüncü taraf tarafından indirilebilen ImsService uygulamalarını desteklemez. Bu nedenle, burada tanımlanan tüm ImsService uygulamalarının sistem uygulaması olması ve uygun izinleri (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 yerleşimi değerleriyle eşleşip eşleşmediği doğrulanarak yalnızca güvenilir, önceden yüklenmiş uygulamalar bağlanır.

Özelleştirme

ImsService'i uygulayan uygulamalar yalnızca MMTEL veya RCS işlevselliği için operatör "geçersiz kılma" ImsService'i ya da cihaz "varsayılan" ImsService yapılandırmaları olarak ayarlandıkları cihazlarda bağlanır. ImsService, desteklediği IMS özelliklerinin (MMTEL ve RCS) ImsService#onUpdateSupportedImsFeatures yöntemi kullanılarak güncellemelerle dinamik olarak etkinleştirilmesine veya devre dışı bırakılmasına da olanak tanır. Bu işlem, hangi ImsService'lerin bağlı olduğunu ve hangi özellikleri desteklediğini yeniden hesaplamak için çerçeveyi tetikler. IMS uygulaması, desteklenen özellikler olmadan çerçeveyi güncellerse telefon yeniden başlatılana veya IMS uygulamasıyla eşleşen yeni bir SIM kart takılana kadar ImsService'in bağlantısı kaldırılır.

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

Çerçeve, cihaza önceden yüklenmiş olası tüm ImsService'lere bağlanmayı destekleyemez ve SIM yuvası başına en fazla iki ImsService'e (her özellik için bir ImsService) aşağıdaki sırayla 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. SIM kart takılı olmadığı durum da dahil olmak üzere, config_ims_[mmtel/rcs]_package için cihaz yer paylaşımı değerinde tanımlanan ImsService paket adı. Bu ImsService, Acil Durum MmTel özelliğini DESTEKLEMELİDİR.

Yukarıda tanımlandığı gibi ImsService'iniz varsayılan olacaksa bu paketi kullanacak her operatör için CarrierConfig'de veya ImsService'inizin paket adını cihaz yer paylaşımında tanımlamanız gerekir.

Şimdi her bir özellik için bu durumu inceleyelim. Tek bir SIM kart yüklü olan 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 ve özellik, CarrierConfiguration geçersiz kılma işleminde tanımlanan ImsService için kullanılamıyorsa çerçeve, varsayılan ImsService'inize geri döner. Örneğin, aşağıdaki tabloda, aşağıdaki özelliklere sahip bir sisteme yüklenen ImsServices'i uygulayan üç IMS uygulaması göz önüne alındığında, çerçevenin hangi IMS özelliğini kullanacağı açıklanmaktadır:

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

Doğrulama

IMS spesifikasyonları son derece büyük olduğundan ve özel doğrulama ekipmanları kullandığından, IMS uygulamasının kendisini doğrulama araçları dahil edilmemiştir. Testler yalnızca telefon görüşmesi çerçevesinin ImsService API'ye doğru şekilde yanıt verdiğini doğrulayabilir.

IMS uygulaması geliştirme

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

MMTEL ve RCS özellikleri için ImsService'in durumunu dinlemek veya değiştirmek üzere ImsManager sınıfını kullanarak ImsMmTelManager, ImsRcsManager veya IMS'ye özgü ProvisioningManager sınıfının bir örneğini alın. Uygulama daha sonra IMS'ye özgü hizmet ve temel hazırlık durumlarını (ör. aşağıdakiler) dinleyebilir:

  • Etkinleştirilmiş ve kullanılabilen MMTEL veya RCS özellikleri
  • IMS kaydı durumu değiştiğinde güncellemeler
  • IMS özelliklerinin temel hazırlık durumu
  • Kullanıcının etkinleştirdiği IMS özellikleri

ImsStateCallback kullanma

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

Android 13 veya sonraki sürümlerin yüklü olduğu cihazlarda, ilişkili bir abonelik için ImsService örneğinin kullanılabilir veya kullanılamaz olup olmadığını izlemek üzere ImsStateCallback sınıfı kullanılabilir. ImsMmTelManager veya ImsRcsManager örneği alırken uygulamanın önce ImsMmTelManager#registerImsStateCallback veya ImsRcsManager#registerImsStateCallback kullanarak IMS durumu geri çağırma için kaydolmasını öneririz. ImsService tekrar kullanılabilir olduğunda belirli abonelikler için geri arama güncellemeleri almaya devam etmek istiyorsanız uygulamanın ImsMmTelManager, ImsRcsManager veya ProvisioningManager üzerinden kaydedilen mevcut geri aramaların kaydını silmesi ya da bunları silmesi ve yeni geri aramalar kaydetmesi gerekir.

IMS'yi desteklemeyen bir abonelik varsa çerçeve, ImsStateCallback#onUnavailableREASON_NO_IMS_SERVICE_CONFIGURED nedeni ile çağırır. Bu nedenle, ImsService ve IMS ile ilgili API'ler abonelikte kullanılamaz.

Telefon görüşmesi sürecinin kilitlenmesi gibi nadir durumlarda uygulama, ImsStateCallback#onError alır ve kayıtlı ImsStateCallback örneğinde artık güncelleme almaz. Bu durumdan kurtulmak için ImsStateCallback örneğini ilişkili abonelik için ImsMmTelManager#registerImsStateCallback veya ImsRcsManager#registerImsStateCallback numaralı telefonu arayarak yeniden kaydedin.