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.
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 yerineandroid.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 hizmetintelephony
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ızcaBIND_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.
Ş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:
- 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,
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 "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:
config_ims_mmtel_package
: MMTEL özelliklerini uygularconfig_ims_rcs_package
: RCS özelliklerini uygular
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:
- SIM kart takılıyken CarrierConfig değeri
config_ims_[mmtel/rcs]_package_override_string
tarafından tanımlanan ImsService paket adı. - 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#onUnavailable
'ı REASON_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.