Android 9 memperkenalkan antarmuka SystemApi yang disebut ImsService untuk membantu Anda menerapkan IP Multimedia Subsystem (IMS). ImsService API adalah antarmuka yang ditentukan dengan baik antara platform Android dan implementasi IMS yang disediakan oleh vendor atau operator.

Gambar 1. Ringkasan ImsService
Dengan menggunakan antarmuka ImsService, pengimplementasi IMS dapat memberikan informasi sinyal penting ke platform, seperti informasi pendaftaran IMS, integrasi SMS melalui IMS, dan integrasi fitur MmTel untuk menyediakan panggilan suara dan video. ImsService API juga merupakan Android System API, yang berarti dapat dibuat langsung terhadap Android SDK, bukan terhadap sumber. Aplikasi IMS yang telah diinstal sebelumnya di perangkat juga dapat dikonfigurasi agar dapat diupdate di Play Store.
Contoh dan sumber
Android menyediakan aplikasi di AOSP yang mengimplementasikan bagian dari ImsService API untuk tujuan pengujian dan pengembangan. Anda dapat menemukan aplikasi di /testapps/ImsTestService.
Anda dapat menemukan dokumentasi untuk ImsService API di ImsService dan di class lain dalam API.
Penerapan
ImsService API adalah API tingkat tinggi yang memungkinkan Anda menerapkan IMS dalam berbagai cara, bergantung pada hardware yang tersedia. Misalnya, implementasi berubah bergantung pada apakah implementasi IMS sepenuhnya berada di prosesor aplikasi atau apakah sebagian atau sepenuhnya di-offload ke modem. Android tidak menyediakan HAL publik untuk offloading ke prosesor baseband, sehingga offloading apa pun harus terjadi menggunakan ekstensi HAL ke modem.
Kompatibilitas dengan implementasi IMS lama
Meskipun Android 9 menyertakan ImsService API, perangkat yang menggunakan implementasi lama untuk IMS tidak dapat mendukung API.
Untuk perangkat ini, antarmuka AIDL dan class wrapper yang lebih lama telah dipindahkan ke namespace android.telephony.ims.compat. Saat mengupgrade ke Android 9, perangkat lama harus melakukan hal berikut untuk melanjutkan dukungan API lama.
- Ubah namespace implementasi ImsService untuk diperluas dari
android.telephony.ims.compatnamespace API. - Ubah definisi layanan ImsService di AndroidManifest.xml untuk menggunakan tindakan intent-filter
android.telephony.ims.compat.ImsService, bukan tindakanandroid.telephony.ims.ImsService.
Framework kemudian akan terikat ke ImsService menggunakan lapisan kompatibilitas yang disediakan di Android 9 untuk bekerja dengan implementasi ImsService lama.
Pendaftaran ImsService dengan framework
ImsService API diimplementasikan sebagai layanan, yang terikat dengan framework Android untuk berkomunikasi dengan implementasi IMS. Tiga langkah diperlukan untuk mendaftarkan aplikasi yang mengimplementasikan ImsService dengan framework. Pertama, implementasi ImsService harus mendaftarkan dirinya ke platform menggunakan AndroidManifest.xml aplikasi; kedua, implementasi harus menentukan fitur IMS yang didukung (MmTel atau RCS); dan ketiga, implementasi harus diverifikasi sebagai implementasi IMS tepercaya baik dalam konfigurasi operator maupun overlay perangkat.
Definisi layanan
Aplikasi IMS mendaftarkan ImsService dengan framework dengan menambahkan entri service ke dalam manifes menggunakan format berikut:
<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>
Definisi service di AndroidManifest.xml menentukan atribut berikut, yang diperlukan untuk operasi yang benar:
directBootAware="true": Memungkinkan layanan ditemukan dan dijalankan olehtelephonysebelum pengguna membuka kunci perangkat. Layanan tidak dapat mengakses penyimpanan terenkripsi perangkat sebelum pengguna membuka kunci perangkat. Untuk mengetahui informasi selengkapnya, lihat Mendukung mode Direct Boot dan Enkripsi Berbasis File.persistent="true": Memungkinkan layanan ini dijalankan secara terus-menerus dan tidak di hentikan oleh sistem untuk mengklaim kembali memori. Atribut ini HANYA berfungsi jika aplikasi dibuat sebagai aplikasi sistem.permission="android.permission.BIND_IMS_SERVICE": Memastikan bahwa hanya proses yang telah diberikan izinBIND_IMS_SERVICEyang dapat terikat ke aplikasi. Hal ini mencegah aplikasi berbahaya terikat ke layanan, karena hanya aplikasi sistem yang dapat diberikan izin oleh framework.
Layanan juga harus menentukan elemen intent-filter dengan tindakan android.telephony.ims.ImsService. Hal ini memungkinkan framework menemukan ImsService.
Spesifikasi fitur IMS
Setelah ImsService ditentukan sebagai layanan Android di AndroidManifest.xml, ImsService harus menentukan fitur IMS yang didukungnya. Android saat ini mendukung fitur MmTel dan RCS, tetapi hanya MmTel yang terintegrasi ke dalam framework. Meskipun tidak ada RCS API yang terintegrasi ke dalam framework, ada keuntungan untuk mendeklarasikannya sebagai fitur ImsService.
Di bawah ini adalah fitur valid yang ditentukan dalam android.telephony.ims.ImsFeature yang dapat disediakan oleh ImsService serta penjelasan dan contoh alasan aplikasi IMS ingin mengimplementasikan satu atau semua fitur ini. Setelah setiap fitur ditentukan, halaman ini menguraikan cara ImsService mendeklarasikan kumpulan fitur yang ditentukan untuk setiap slot SIM.
FEATURE_MMTEL
ImsService mengimplementasikan fitur IMS MMTEL, yang berisi dukungan untuk semua media IMS (spesifikasi IR.92 dan IR.94) kecuali lampiran darurat ke IMS PDN untuk panggilan darurat. Implementasi ImsService apa pun yang ingin
mendukung fitur MMTEL harus memperluas class dasar
android.telephony.ims.MmTelFeature dan menampilkan implementasi
MmTelFeature kustom di
ImsService#createMmTelFeature.
FEATURE_EMERGENCY_MMTEL
Mendeklarasikan fitur ini hanya memberi sinyal ke platform bahwa lampiran darurat ke IMS PDN untuk layanan darurat dimungkinkan. Jika fitur ini tidak dideklarasikan untuk ImsService, platform akan selalu menggunakan Circuit Switch Fallback untuk layanan darurat. Fitur FEATURE_MMTEL harus ditentukan agar fitur ini dapat ditentukan.
FEATURE_RCS
ImsService API tidak mengimplementasikan fitur IMS RCS apa pun, tetapi class dasar android.telephony.ims.RcsFeature masih dapat berguna. Framework secara otomatis terikat ke ImsService dan memanggil ImsService#createRcsFeature saat mendeteksi bahwa paket harus menyediakan RCS. Jika kartu SIM yang terkait dengan layanan RCS dihapus, framework akan otomatis memanggil RcsFeature#onFeatureRemoved, lalu membersihkan ImsService yang terkait dengan fitur RCS. Fungsi ini dapat menghapus beberapa logika deteksi atau pengikatan kustom yang seharusnya disediakan oleh fitur RCS.
Pendaftaran fitur yang didukung
Framework telepon pertama-tama terikat ke ImsService untuk meminta fitur yang didukungnya menggunakan ImsService#querySupportedImsFeatures API. Setelah framework menghitung fitur yang akan didukung ImsService, framework akan memanggil ImsService#create[...]Feature untuk setiap fitur yang akan menjadi tanggung jawab ImsService. Jika fitur yang didukung aplikasi IMS berubah, Anda dapat menggunakan ImsService#onUpdateSupportedImsFeatures untuk memberi sinyal kepada framework agar menghitung ulang fitur yang didukung. Lihat diagram berikut untuk mengetahui informasi selengkapnya tentang inisialisasi dan pengikatan ImsService.
Gambar 2. Inisialisasi dan pengikatan ImsService
Deteksi dan verifikasi framework implementasi ImsService
Setelah ImsService ditentukan dengan benar di AndroidManifest.xml, platform harus dikonfigurasi untuk (secara aman) terikat ke ImsService jika sesuai. Ada dua jenis ImsService yang terikat dengan framework:
- ImsService "pengganti" operator: ImsService ini telah dimuat sebelumnya ke perangkat, tetapi dilampirkan ke satu atau beberapa operator seluler dan hanya akan terikat saat kartu SIM yang cocok dimasukkan. Hal ini dikonfigurasi menggunakan
config_ims_mmtel_package_override_stringKunci CarrierConfig untuk ImsService yang mengimplementasikan fitur MMTEL.config_ims_rcs_package_override_stringuntuk ImsService yang mengimplementasikan fitur RCS.
- ImsService "default" perangkat: Ini adalah ImsService default yang dimuat ke perangkat oleh OEM dan harus dirancang untuk menyediakan layanan IMS dalam semua situasi saat ImsService operator tidak tersedia dan berguna dalam situasi saat perangkat tidak memiliki kartu SIM yang dimasukkan atau kartu SIM yang dimasukkan tidak memiliki ImsService operator yang diinstal. Hal ini ditentukan dalam overlay perangkat menggunakan konfigurasi berikut:
config_ims_mmtel_package: Mengimplementasikan fitur MMTELconfig_ims_rcs_package: Mengimplementasikan fitur RCS
Android tidak mendukung aplikasi dengan implementasi ImsService pihak ketiga yang dapat didownload, sehingga implementasi ImsService yang ditentukan di sini harus berupa aplikasi Sistem dan harus berada di folder /system/priv-app/ atau /product/priv-app/ untuk memberikan izin yang sesuai (yaitu izin telepon, mikrofon, lokasi, kamera, dan kontak). Dengan memverifikasi apakah nama paket implementasi IMS cocok dengan nilai CarrierConfig atau overlay perangkat yang ditentukan di atas, hanya aplikasi tepercaya yang telah diinstal sebelumnya yang terikat.
Penyesuaian
Aplikasi yang mengimplementasikan ImsService hanya terikat pada perangkat yang dikonfigurasi sebagai konfigurasi ImsService "pengganti" operator atau ImsService "default" perangkat untuk fungsi MMTEL atau RCS.
ImsService juga memungkinkan fitur IMS yang didukungnya (MMTEL dan RCS) diaktifkan atau dinonaktifkan secara dinamis menggunakan update menggunakan metode ImsService#onUpdateSupportedImsFeatures. Hal ini memicu framework untuk menghitung ulang ImsService mana yang terikat dan fitur mana yang didukungnya. Jika aplikasi IMS mengupdate framework tanpa fitur yang didukung, ImsService akan dilepas ikatannya hingga ponsel di-reboot atau kartu SIM baru yang cocok dengan aplikasi IMS dimasukkan.
Prioritas pengikatan untuk beberapa ImsService
Framework tidak dapat mendukung pengikatan ke semua kemungkinan ImsService yang telah dimuat sebelumnya ke perangkat dan akan terikat ke maksimal dua ImsService per slot SIM (satu ImsService untuk setiap fitur) dalam urutan berikut berdasarkan per fitur:
- Nama paket ImsService yang ditentukan oleh nilai CarrierConfig
config_ims_[mmtel/rcs]_package_override_stringsaat ada kartu SIM yang dimasukkan. - Nama paket ImsService yang ditentukan dalam nilai overlay perangkat untuk
config_ims_[mmtel/rcs]_package, termasuk kasus saat tidak ada kartu SIM yang dimasukkan. ImsService ini HARUS mendukung fitur MmTel Darurat.
Anda harus memiliki nama paket ImsService yang ditentukan di CarrierConfig untuk setiap operator yang akan menggunakan paket tersebut atau di overlay perangkat jika ImsService Anda akan menjadi default, seperti yang ditentukan di atas.
Mari kita bahas ini untuk setiap fitur. Untuk perangkat (SIM tunggal atau multi-SIM) dengan satu kartu SIM yang dimuat, dua fitur IMS dimungkinkan: MMTel dan RCS. Framework akan mencoba terikat dalam urutan yang ditentukan di atas untuk setiap fitur dan jika fitur tidak tersedia untuk ImsService yang ditentukan dalam penggantian Konfigurasi Operator, framework akan kembali ke ImsService default Anda. Jadi, misalnya, tabel di bawah menjelaskan fitur IMS mana yang akan digunakan framework mengingat tiga aplikasi IMS yang mengimplementasikan ImsService yang diinstal pada sistem dengan fitur berikut:
- ImsService Operator A mendukung RCS
- ImsService Operator B mendukung RCS dan MMTel
- ImsService OEM mendukung RCS dan MMTel
| Kartu SIM Dimasukkan | Fitur RCS | Fitur MMTel |
|---|---|---|
| Operator A | Operator A | OEM |
| Operator B | Operator B | Operator B |
| Tidak ada SIM | OEM | OEM |
Validasi
Alat untuk memverifikasi implementasi IMS itu sendiri tidak disertakan karena spesifikasi IMS sangat besar dan menggunakan peralatan verifikasi khusus. Pengujian hanya dapat memverifikasi bahwa framework telepon merespons ImsService API dengan benar.
Mengembangkan aplikasi IMS
Saat mengembangkan aplikasi IMS yang berinteraksi dengan tumpukan telepon Android, sebaiknya tentukan bahwa aplikasi dapat memproses atau mengubah status instance ImsService yang dilampirkan untuk langganan operator tertentu.
Untuk memproses atau mengubah status ImsService untuk fitur MMTEL dan RCS, gunakan
class
ImsManager
untuk mendapatkan instance class
ImsMmTelManager,
ImsRcsManager,
atau
ProvisioningManager
khusus IMS. Aplikasi kemudian dapat memproses status layanan dan penyediaan khusus IMS seperti:
- Fitur MMTEL atau RCS yang diaktifkan dan tersedia
- Update saat status pendaftaran IMS berubah
- Status penyediaan fitur IMS
- Fitur IMS yang telah diaktifkan pengguna
Menggunakan ImsStateCallback
Meskipun ImsService adalah layanan yang terikat secara terus-menerus, layanan yang terikat dapat berubah saat kartu SIM baru atau langganan tersemat menjadi aktif atau saat konfigurasi operator berubah. Karena ImsService bukan bagian dari proses telepon, aplikasi mungkin mengalami pengecualian yang tidak terduga saat mencoba mengakses IMS API jika ImsService mengalami error secara tidak terlihat atau tidak terikat karena perubahan langganan atau konfigurasi.
Di perangkat yang menjalankan Android 13 atau yang lebih tinggi, untuk memantau
apakah instance ImsService untuk langganan terkait
tersedia atau tidak tersedia, aplikasi dapat menggunakan
ImsStateCallback
class. Saat mendapatkan instance ImsMmTelManager atau ImsRcsManager, sebaiknya aplikasi terlebih dahulu mendaftar untuk callback status IMS menggunakan
ImsMmTelManager#registerImsStateCallback
atau
ImsRcsManager#registerImsStateCallback.
Untuk terus menerima update callback untuk langganan tertentu saat ImsService tersedia lagi, aplikasi harus membatalkan pendaftaran atau menghapus callback yang ada yang terdaftar melalui ImsMmTelManager, ImsRcsManager, atau ProvisioningManager; dan mendaftarkan callback baru.
Jika ada langganan yang tidak mendukung IMS, framework akan memanggil
ImsStateCallback#onUnavailable
dengan alasan
REASON_NO_IMS_SERVICE_CONFIGURED.
Artinya, ImsService dan API terkait IMS tidak tersedia untuk langganan tersebut.
Jika proses telepon mengalami error, aplikasi akan menerima
ImsStateCallback#onError
dan tidak lagi menerima update pada instance ImsStateCallback yang terdaftar.
Untuk memulihkan dari kondisi ini, daftarkan ulang instance ImsStateCallback untuk
langganan terkait dengan memanggil
ImsMmTelManager#registerImsStateCallback
atau
ImsRcsManager#registerImsStateCallback.