Android 9, IP Multimedya Alt Sistemi'ni (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 IMS uygulaması arasında iyi tanımlanmış bir arayüzdür.
Ş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'sinin 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çermesine rağmen IMS için eski bir uygulama 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şı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 yerineandroid.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, Android çerçevesinin IMS uygulamasıyla iletişim kurmak için bağlandığı bir hizmet olarak uygulanır. Çerçeveye 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 kullanarak manifest dosyasına 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
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 hizmetintelephony
tarafından bulunmasına ve çalıştırılmasına izin verir. 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ızcaBIND_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, 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 özelliklerin bir 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
'ün her SIM yuvasında tanımladığı özellik grubunu nasıl beyan ettiği açıklanır.
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 beyan edilmesi, platforma yalnızca acil durum hizmetleri için IMS PDN'ye acil durum eklenmesi olası olduğunu bildirir. Bu özellik ImsService
için tanımlanmazsa platform, acil durum hizmetleri için varsayılan olarak her zaman devre anahtarı yedekleme seçeneğ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.
Ş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:
- Operatör "override" ImsService: Bu ImsServices cihaza önceden yüklenmiştir 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,
config_ims_mmtel_package_override_string
MMTEL özelliklerini uygulayan ImsServices için CarrierConfig anahtarı.config_ims_rcs_package_override_string
RCS özelliklerini uygulayan ImsServices için.
- 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 hizmet faydalıdır. Bu, cihaz yer paylaşımında aşağıdaki yapılandırmalar kullanılarak tanımlanır:
config_ims_mmtel_package
: MMTEL özelliklerini uygularconfig_ims_rcs_package
: RCS özelliklerini uygular
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 uygulayan uygulamalar yalnızca MMTEL veya RCS işlevi için operatör "override" ImsService veya cihaz "default" ImsService yapılandırmaları olarak yapılandırıldıkları cihazlarda bağlanır.
ImsService, desteklediği IMS özelliklerinin (MMTEL ve RCS) ImsService#onUpdateSupportedImsFeatures
yöntemini kullanarak güncellemelerle dinamik olarak etkinleştirilmesine veya devre dışı bırakılmasına da olanak tanır. Bu işlem, çerçevenin hangi ImsServices'in bağlı olduğunu ve hangi özellikleri desteklediğini yeniden hesaplamasını 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'in bağlaması kaldırılır.
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:
- SIM kart takılıyken CarrierConfig değeri
config_ims_[mmtel/rcs]_package_override_string
tarafından tanımlanan ImsService paket adı. - Takılı SIM kart olmadığı durumlar da dahil olmak üzere
config_ims_[mmtel/rcs]_package
için cihaz yer paylaşımı değerinde tanımlanan ImsService paketi adı. Bu ImsService, Acil Durum MmTel özelliğini DESTEKLEMELİDİR.
ImsService'inizin paket adı, bu paketi kullanacak operatörlerin her biri için CarrierConfig'de veya ImsService'iniz varsayılan olacaksa yukarıda belirtildiği gibi cihaz yer paylaşımında tanımlanmış olmalıdır.
Bu metriği her bir özellik için ayrı ayrı inceleyelim. Tek SIM kart yüklü bir cihazda (tek veya çoklu SIM kart) iki IMS özelliği kullanılabilir: MMTel ve RCS. Çerçeve, her özellik için yukarıda tanımlanan sırada bağlamayı dener ve özellik, Operatör Yapılandırması geçersiz kılma özelliğinde tanımlanan ImsService için kullanılamıyorsa varsayılan ImsService'inize geri 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:
- A operatörü ImsService, RCS'yi destekler
- Operatör B ImsService, RCS ve MMTel'i destekler
- OEM ImsService, RCS ve MMTel'i destekler
SIM Kart Takılı | RCS Özelliği | MMTel Özelliği |
---|---|---|
Operatör A | Operatör A | 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 telefon çerçevesinin ImsService API'ye düzgün 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:
- Etkinleştirilmiş ve kullanılabilen MMTEL veya RCS özellikleri
- IMS kaydı durumu değiştiğinde güncellenir
- IMS özelliklerinin temel hazırlık durumu
- Kullanıcının etkinleştirdiği IMS özellikleri
ImsStateCallback'i kullanma
ImsService kalıcı olarak bağlı bir hizmet olsa da yeni bir SIM kart veya yerleşik abonelik etkinleştiğinde ya da 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 bir uygulama ImsStateCallback
sınıfını kullanabilir. 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 durumdan kurtulmak için ImsMmTelManager#registerImsStateCallback
veya ImsRcsManager#registerImsStateCallback
çağrısını yaparak ilişkili abonelik için ImsStateCallback
örneğini yeniden kaydedin.