IMS'nin uygulanması

Android 9, IP Multimedya Alt Sistemini (IMS) uygulamanıza yardımcı olmak için ImsService adlı yeni bir SystemApi arayüzünü sunar. ImsService API, Android platformu ile satıcı 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 IMS kayıt bilgileri, IMS üzerinden SMS entegrasyonu ve sesli ve görüntülü arama sağlamak için MmTel özellik entegrasyonu gibi önemli sinyalleşme bilgilerini sağlayabilir. ImsService API aynı zamanda bir Android Sistem API'sidir; yani kaynağa karşı değil, doğrudan Android SDK'ya karşı oluşturulabilir. Cihaza önceden yüklenmiş bir IMS uygulaması, Play Store'da güncellenebilir olacak şekilde de yapılandırılabilir.

Örnekler ve kaynak

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

ImsService API'sine ilişkin belgeleri ImsService'de 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ının tamamen uygulama işlemcisi üzerinde olmasına veya kısmen ya da tamamen modeme devredilmesine bağlı olarak uygulama değişir. Android, temel bant işlemcisine yük aktarımı için genel bir HAL sağlamaz; dolayısıyla herhangi bir boşaltma işlemi, modeme giden HAL uzantınız kullanılarak gerçekleştirilmelidir.

Eski IMS uygulamalarıyla uyumluluk

Android 9, ImsService API'sini içermesine rağmen, IMS için daha eski bir uygulamayı kullanan cihazlar API'yi destekleyemez. Bu cihazlar için eski AIDL arayüzleri ve sarmalayıcı sınıfları android.telephony.ims.compat ad alanına taşınmıştır. Android 9'a yükseltme yaparken eski cihazların eski API desteğine 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.
  • android.telephony.ims.ImsService eylemi yerine android.telephony.ims.compat.ImsService amaç filtresi eylemini kullanmak için AndroidManifest.xml'deki ImsService hizmet tanımını değiştirin.

Çerçeve daha sonra eski ImsService uygulamasıyla çalışmak üzere Android 9'da sağlanan uyumluluk katmanını kullanarak ImsService'e bağlanacaktır.

Çerçeveye ImsService kaydı

ImsService API, IMS uygulamasıyla iletişim kurmak için Android çerçevesinin bağlandığı bir hizmet olarak uygulanır. Çerçeveye ImsService uygulayan bir uygulamayı kaydetmek için üç adım gereklidir. İlk olarak ImsService uygulamasının, uygulamanın AndroidManifest.xml dosyasını kullanarak kendisini platforma kaydetmesi gerekir; ikincisi, uygulamanın hangi IMS özelliklerini desteklediğini tanımlamalıdır (MmTel veya RCS); ve üçüncüsü, taşıyıcı yapılandırmasında veya cihaz katmanında güvenilir IMS uygulaması olarak doğrulanması gerekir.

Hizmet tanımı

IMS uygulaması, aşağıdaki formatı kullanarak bildirime bir service girişi ekleyerek bir ImsService'i çerçeveye 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 dosyasındaki service tanımı, doğru işlem için gerekli olan aşağıdaki nitelikleri tanımlar:

  • directBootAware="true" : Kullanıcı aygıtın kilidini açmadan önce hizmetin telephony tarafından keşfedilmesine ve çalıştırılmasına izin verir. Hizmet, kullanıcı cihazın kilidini açmadan önce cihazın şifrelenmiş depolama alanına erişemez. Daha fazla bilgi için bkz. Doğrudan Önyükleme modunu ve Dosya Tabanlı Şifrelemeyi Destekleme.
  • persistent="true" : Bu hizmetin kalıcı olarak çalıştırılmasına ve belleği geri kazanmak için sistem tarafından sonlandırılmamasına izin verir. Bu özellik YALNIZCA uygulama bir sistem uygulaması olarak oluşturulmuşsa çalışır.
  • permission="android.permission.BIND_IMS_SERVICE" : Yalnızca kendisine BIND_IMS_SERVICE izni verilen bir işlemin uygulamaya bağlanabilmesini sağlar. Bu, çerçeve tarafından yalnızca sistem uygulamalarına izin verilebildiğinden, hileli bir uygulamanın hizmete bağlanmasını engeller.

Hizmet ayrıca android.telephony.ims.ImsService eylemiyle intent-filter öğesini de belirtmelidir. Bu, çerçevenin ImsService bulmasını sağlar.

IMS özellik spesifikasyonu

ImsService, AndroidManifest.xml'de bir Android hizmeti olarak tanımlandıktan sonra ImsService'in hangi IMS özelliklerini desteklediğini tanımlaması gerekir. Android şu anda MmTel ve RCS özelliklerini desteklemektedir ancak çerçeveye yalnızca MmTel entegre edilmiştir. Çerçeveye entegre edilmiş hiçbir RCS API'si olmamasına rağmen, bunu ImsService'in bir özelliği olarak bildirmenin hâlâ avantajları vardır.

Aşağıda, bir ImsService'in sağlayabileceği, android.telephony.ims.ImsFeature tanımlanan geçerli özellikler ve bir IMS uygulamasının neden bu özelliklerden birini veya tümünü uygulamak isteyebileceğine ilişkin bir açıklama ve örnek bulunmaktadır. Her özellik tanımlandıktan sonra bu sayfa, ImsService her SIM yuvası için tanımladığı özellikler kümesini nasıl beyan ettiğini özetlemektedir.

FEATURE_MMTEL

ImsService , acil arama için IMS PDN'ye acil durum bağlantısı dışında tüm IMS ortamları (IR.92 ve IR.94 spesifikasyonları) için destek içeren IMS MMTEL özelliğini uygular. MMTEL özelliklerini desteklemek isteyen herhangi bir ImsService uygulaması, 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ğin bildirilmesi yalnızca platforma acil durum hizmetleri için IMS PDN'ye acil durum bağlantısının mümkün olduğunu bildirir. Bu özellik ImsService için bildirilmezse platform, acil servisler için her zaman varsayılan olarak Devre Anahtarı Geri Dönüşünü kullanacaktır. Bu özelliğin tanımlanabilmesi için FEATURE_MMTEL özelliğinin tanımlanması gerekmektedir.

FEATURE_RCS

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

Desteklenen özelliklerin kaydı

Telefon çerçevesi ilk olarak ImsService#querySupportedImsFeatures API'sini kullanarak desteklediği özellikleri sorgulamak için 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 çağıracaktır. IMS uygulamasının desteklediği özellikler değişirse, desteklenen özellikleri yeniden hesaplamak üzere çerçeveye sinyal göndermek için 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 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 platformun, uygun olduğunda ImsService'e (güvenli bir şekilde) bağlanacak şekilde yapılandırılması gerekir. Çerçevenin bağlandığı iki tür ImsServices vardır:

  1. Operatör "geçersiz kılma" ImsService: Bu ImsService'ler cihaza önceden yüklenmiştir ancak bir veya daha fazla hücresel operatöre eklenmiştir ve yalnızca eşleşen bir SIM kart takıldığında bağlanacaktır. Bu, kullanılarak yapılandırılır
  2. Cihaz "varsayılan" ImsService: Bu, bir OEM tarafından cihaza yüklenen varsayılan ImsService'dir ve operatör ImsService'in mevcut olmadığı tüm durumlarda IMS servislerini sağlayacak şekilde tasarlanmalıdır ve cihazın SIM kartı olmadığı durumlarda kullanışlıdır. takılıysa veya takılı SIM kartta yüklü bir ImsService taşıyıcısı bulunmuyorsa. Bu, aşağıdaki yapılandırmalar kullanılarak cihaz katmanında tanımlanır:

Android, üçüncü taraf indirilebilir ImsService uygulamalarına sahip uygulamaları desteklemez, dolayısıyla burada tanımlanan tüm ImsService uygulamalarının Sistem uygulaması olması gerekir ve uygun uygulamanın verilmesi için /system/priv-app/ veya /product/priv-app/ klasöründe bulunmalıdır. izinler (yani telefon, mikrofon, konum, kamera ve kişi izinleri). 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

Bir ImsService uygulayan uygulamalar yalnızca taşıyıcının ImsService'i "geçersiz kılması" veya MMTEL veya RCS işlevselliği için cihazın "varsayılan" ImsService yapılandırmaları olarak yapılandırıldıkları cihazlara bağlıdır. ImsService ayrıca desteklediği IMS özelliklerinin (MMTEL ve RCS), ImsService#onUpdateSupportedImsFeatures yöntemini kullanarak güncellemeler aracılığıyla dinamik olarak etkinleştirilmesine veya devre dışı bırakılmasına da olanak tanır. Bu, çerçevenin hangi ImsServices'in bağlı olduğunu ve hangi özellikleri desteklediğini yeniden hesaplamasını tetikler. IMS uygulaması çerçeveyi hiçbir özelliğin desteklenmediği şekilde 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ılacaktır.

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

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

  1. SIM kart takılı olduğunda CarrierConfig değeri config_ims_[mmtel/rcs]_package_override_string tarafından tanımlanan ImsService paket adı.
  2. SIM kartın 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'in Acil Durum MmTel özelliğini desteklemesi ZORUNLUDUR.

ImsService'inizin paket adının, bu paketi kullanacak operatörlerin her biri için CarrierConfig'de tanımlanmış olması veya ImsService'inizin yukarıda tanımlandığı gibi varsayılan olması durumunda cihaz katmanında tanımlanmış olması gerekir.

Bunu her özellik için ayrı ayrı inceleyelim. Tek SIM kart yüklü bir cihaz (tekli veya çoklu SIM) için iki IMS özelliği mümkündür: MMTel ve RCS. Çerçeve, her özellik için yukarıda tanımlanan sırayla bağlanmaya çalışacaktır ve eğer özellik, Taşıyıcı Yapılandırmasını geçersiz kılmada tanımlanan ImsService için mevcut değilse, çerçeve, varsayılan ImsService'inize geri dönecektir. Örneğin aşağıdaki tablo, aşağıdaki özelliklere sahip bir sistemde kurulu ImsServices'i uygulayan üç IMS uygulaması göz önüne alındığında, çerçevenin hangi IMS özelliğini kullanacağını açıklamaktadır:

  • Taşıyıcı A ImsService RCS'yi destekler
  • Taşıyıcı B ImsService, RCS ve MMTel'i destekler
  • OEM ImsService, RCS ve MMTel'i destekler
SIM Kart Takılı RCS Özelliği MMTel Özelliği
Taşıyıcı A Taşıyıcı A OEM
Taşıyıcı B Taşıyıcı B Taşıyıcı B
SIM yok OEM OEM

Doğrulama

IMS spesifikasyonları son derece büyük olduğundan ve özel doğrulama ekipmanı kullanıldığından, IMS uygulamasının kendisini doğrulamaya yönelik araçlar dahil edilmemiştir. Testler yalnızca telefon çerçevesinin ImsService API'ye düzgün şekilde yanıt verdiğini doğrulayabilir.

Bir IMS uygulaması geliştirin

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.

ImsService for MMTEL ve RCS özelliklerinin durumunu dinlemek veya değiştirmek için ImsMmTelManager , ImsRcsManager veya IMS'ye özgü ProvisioningManager sınıfının bir örneğini almak üzere ImsManager sınıfını kullanın. Uygulama daha sonra aşağıdakiler gibi IMS'ye özgü hizmet ve sağlama durumlarını dinleyebilir:

  • Etkinleştirilmiş 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'i kullanın

ImsService kalıcı olarak bağlı bir hizmet olmasına rağmen, bağlı olan hizmet, yeni bir SIM kart veya yerleşik abonelik etkin hale geldiğinde veya operatör yapılandırması değiştiğinde değişebilir. ImsService telefon sürecinin bir parçası olmadığından, bir abonelik veya yapılandırma değişikliği nedeniyle ImsService'in görünmez bir şekilde çökmesi veya bağlantısının kesilmesi durumunda bir uygulama, IMS API'lerine erişmeye çalışırken beklenmeyen istisnalarla karşılaşabilir.

Android 13 veya üstünü çalıştıran cihazlarda, ilişkili bir aboneliğe ilişkin ImsService örneğinin kullanılabilir olup olmadığını izlemek için bir uygulama, ImsStateCallback sınıfını kullanabilir. ImsMmTelManager veya ImsRcsManager örneğini alırken, uygulamanın ilk önce ImsMmTelManager#registerImsStateCallback veya ImsRcsManager#registerImsStateCallback kullanarak bir IMS durumu geri çağrısına kaydolmasını öneririz. ImsService tekrar kullanılabilir hale geldiğinde belirli aboneliklere ilişkin geri arama güncellemelerini almaya devam etmek için uygulamanın ImsMmTelManager , ImsRcsManager veya ProvisioningManager aracılığıyla kaydedilen mevcut geri aramaların kaydını kaldırması veya atması gerekir; ve yeni geri aramaları kaydedin.

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

Nadir de olsa telefon işleminin çökmesi durumunda uygulama ImsStateCallback#onError alır ve kayıtlı ImsStateCallback örneğindeki güncellemeleri artık almaz. Bu durumdan kurtulmak için ImsMmTelManager#registerImsStateCallback veya ImsRcsManager#registerImsStateCallback çağırarak ilişkili abonelik için ImsStateCallback örneğini yeniden kaydedin.