Android 9 memperkenalkan antarmuka SystemApi baru yang disebut ImsService untuk membantu Anda mengimplementasikan IP Multimedia Subsystem (IMS). ImsService API adalah antarmuka yang terdefinisi dengan baik antara platform Android dan implementasi IMS yang disediakan vendor atau operator.
Gambar 1. Ikhtisar ImsService
Dengan menggunakan antarmuka ImsService, pelaksana 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 API Sistem Android, artinya API ini dapat dibuat dengan menggunakan SDK Android secara langsung dan bukan dengan sumbernya. Aplikasi IMS yang telah diinstal sebelumnya pada perangkat juga dapat dikonfigurasi agar Play Store dapat diperbarui.
Contoh dan sumber
Android menyediakan aplikasi di AOSP yang mengimplementasikan bagian dari ImsService API untuk tujuan pengujian dan pengembangan. Anda dapat menemukan aplikasinya di /testapps/ImsTestService .
Anda dapat menemukan dokumentasi untuk ImsService API di ImsService dan di kelas lain di API.
Penerapan
ImsService API adalah API tingkat tinggi yang memungkinkan Anda mengimplementasikan IMS dengan berbagai cara, bergantung pada perangkat keras yang tersedia. Misalnya, implementasinya berubah tergantung pada apakah implementasi IMS sepenuhnya ada pada prosesor aplikasi atau sebagian atau seluruhnya dipindahkan ke modem. Android tidak menyediakan HAL publik untuk pembongkaran ke prosesor baseband, jadi pembongkaran apa pun harus dilakukan menggunakan ekstensi HAL Anda ke modem.
Kompatibilitas dengan implementasi IMS yang lebih lama
Meskipun Android 9 menyertakan ImsService API, perangkat yang menggunakan implementasi IMS yang lebih lama tidak dapat mendukung API tersebut. Untuk perangkat ini, antarmuka AIDL dan kelas 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 agar diperluas dari namespace API
android.telephony.ims.compat
. - Ubah definisi layanan ImsService di AndroidManifest.xml untuk menggunakan tindakan filter maksud
android.telephony.ims.compat.ImsService
, bukan tindakanandroid.telephony.ims.ImsService
.
Kerangka kerja ini kemudian akan diikat ke ImsService menggunakan lapisan kompatibilitas yang disediakan di Android 9 agar dapat berfungsi dengan implementasi ImsService
lama.
Pendaftaran ImsService dengan kerangka kerja
ImsService API diimplementasikan sebagai layanan, yang diikat oleh kerangka kerja Android untuk berkomunikasi dengan implementasi IMS. Tiga langkah diperlukan untuk mendaftarkan aplikasi yang mengimplementasikan ImsService dengan kerangka kerja tersebut. Pertama, implementasi ImsService harus mendaftarkan dirinya ke platform menggunakan aplikasi AndroidManifest.xml
; kedua, ia harus menentukan fitur IMS mana yang didukung implementasinya (MmTel atau RCS); dan ketiga, ini harus diverifikasi sebagai implementasi IMS tepercaya baik dalam konfigurasi operator atau overlay perangkat.
Definisi layanan
Aplikasi IMS mendaftarkan ImsService dengan kerangka kerja 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
mendefinisikan atribut berikut, yang diperlukan untuk pengoperasian yang benar:
-
directBootAware="true"
: Memungkinkan layanan ditemukan dan dijalankan melaluitelephony
sebelum pengguna membuka kunci perangkat. Layanan tidak dapat mengakses penyimpanan terenkripsi perangkat sebelum pengguna membuka kunci perangkat. Untuk informasi lebih lanjut, lihat Mendukung mode Boot Langsung dan Enkripsi Berbasis File . -
persistent="true"
: Memungkinkan layanan ini dijalankan terus-menerus dan tidak dimatikan oleh sistem untuk mendapatkan kembali memori. Atribut ini HANYA berfungsi jika aplikasi dibangun sebagai aplikasi sistem. -
permission="android.permission.BIND_IMS_SERVICE"
: Memastikan bahwa hanya proses yang telah diberikan izinBIND_IMS_SERVICE
yang dapat mengikat aplikasi. Hal ini mencegah aplikasi jahat mengikat layanan, karena hanya aplikasi sistem yang dapat diberikan izin oleh kerangka kerja.
Layanan juga harus menentukan elemen intent-filter
dengan tindakan android.telephony.ims.ImsService
. Hal ini memungkinkan kerangka kerja untuk menemukan ImsService
.
Spesifikasi fitur IMS
Setelah ImsService didefinisikan sebagai layanan Android di AndroidManifest.xml, ImsService harus menentukan fitur IMS mana yang didukungnya. Android saat ini mendukung fitur MmTel dan RCS, namun hanya MmTel yang terintegrasi ke dalam kerangka kerja. Meskipun tidak ada API RCS yang terintegrasi ke dalam kerangka kerja, masih ada keuntungan mendeklarasikannya sebagai fitur ImsService.
Di bawah ini adalah fitur valid yang didefinisikan dalam android.telephony.ims.ImsFeature
yang dapat diberikan oleh ImsService serta penjelasan dan contoh mengapa aplikasi IMS ingin mengimplementasikan satu atau semua fitur ini. Setelah setiap fitur ditentukan, halaman ini menguraikan bagaimana ImsService
mendeklarasikan serangkaian 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 PDN IMS untuk panggilan darurat. Implementasi ImsService
apa pun yang ingin mendukung fitur MMTEL harus memperluas kelas dasar android.telephony.ims.MmTelFeature
dan mengembalikan implementasi MmTelFeature
khusus di ImsService#createMmTelFeature
.
FEATURE_EMERGENCY_MMTEL
Menyatakan fitur ini hanya memberi sinyal kepada platform bahwa lampiran darurat ke IMS PDN untuk layanan darurat dimungkinkan. Jika fitur ini tidak dideklarasikan untuk ImsService
Anda, platform akan selalu menggunakan Circuit Switch Fallback secara default untuk layanan darurat. Fitur FEATURE_MMTEL
harus ditentukan agar fitur ini dapat ditentukan.
FEATURE_RCS
ImsService API tidak mengimplementasikan fitur IMS RCS apa pun, namun kelas dasar android.telephony.ims.RcsFeature
masih dapat berguna. Kerangka kerja secara otomatis mengikat ke ImsService dan memanggil ImsService#createRcsFeature
ketika mendeteksi bahwa paket tersebut harus menyediakan RCS. Jika kartu SIM yang terkait dengan layanan RCS dihapus, kerangka kerja secara otomatis memanggil RcsFeature#onFeatureRemoved
dan kemudian membersihkan ImsService
yang terkait dengan fitur RCS. Fungsionalitas ini dapat menghapus beberapa logika deteksi/pengikatan khusus yang seharusnya disediakan oleh fitur RCS.
Pendaftaran fitur yang didukung
Kerangka kerja telepon pertama-tama mengikat ke ImsService untuk menanyakan fitur yang didukungnya menggunakan API ImsService#querySupportedImsFeatures
. Setelah kerangka menghitung fitur mana yang akan didukung oleh ImsService, kerangka tersebut akan memanggil ImsService#create[...]Feature
untuk setiap fitur yang menjadi tanggung jawab ImsService. Jika fitur yang didukung aplikasi IMS berubah, Anda dapat menggunakan ImsService#onUpdateSupportedImsFeatures
untuk memberi sinyal pada kerangka kerja agar menghitung ulang fitur yang didukung. Lihat diagram di bawah untuk informasi lebih lanjut tentang inisialisasi dan pengikatan ImsService.
Gambar 2: Inisialisasi dan pengikatan ImsService
Deteksi kerangka kerja dan verifikasi implementasi ImsService
Setelah ImsService didefinisikan dengan benar di AndroidManifest.xml, platform harus dikonfigurasi untuk mengikat (dengan aman) ke ImsService jika diperlukan. Ada dua jenis ImsServices yang diikat oleh kerangka kerja:
- ImsService "override" operator: ImsServices ini dimuat sebelumnya ke perangkat namun terpasang ke satu atau lebih operator seluler dan hanya akan terikat ketika kartu SIM yang cocok dimasukkan. Ini dikonfigurasi menggunakan
-
config_ims_mmtel_package_override_string
Kunci CarrierConfig untuk ImsServices yang mengimplementasikan fitur MMTEL. -
config_ims_rcs_package_override_string
untuk ImsServices 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 ketika ImsService operator tidak tersedia dan berguna dalam situasi di mana perangkat tidak memiliki kartu SIM dimasukkan atau kartu SIM yang dimasukkan tidak memiliki operator ImsService yang terinstal di dalamnya. Ini ditentukan dalam overlay perangkat menggunakan konfigurasi berikut:
-
config_ims_mmtel_package
: Mengimplementasikan fitur MMTEL -
config_ims_rcs_package
: Mengimplementasikan fitur RCS
-
Android tidak mendukung aplikasi dengan implementasi ImsService pihak ketiga yang dapat diunduh, jadi implementasi ImsService apa pun yang didefinisikan di sini harus merupakan aplikasi Sistem dan harus berada di folder /system/priv-app/ atau /product/priv-app/ untuk memberikan hak yang sesuai izin (yaitu izin telepon, mikrofon, lokasi, kamera, dan kontak). Dengan memverifikasi apakah nama paket implementasi IMS cocok dengan CarrierConfig atau nilai overlay perangkat yang ditentukan di atas, hanya aplikasi pra-instal tepercaya yang terikat.
Kustomisasi
Aplikasi yang mengimplementasikan ImsService hanya terikat pada perangkat yang dikonfigurasikan sebagai operator "override" ImsService atau konfigurasi ImsService "default" perangkat untuk fungsi MMTEL atau RCS. ImsService juga memungkinkan fitur IMS yang didukungnya (MMTEL dan RCS) untuk diaktifkan atau dinonaktifkan secara dinamis melalui pembaruan menggunakan metode ImsService#onUpdateSupportedImsFeatures
. Hal ini memicu kerangka kerja untuk menghitung ulang ImsServices mana yang terikat dan fitur mana yang didukungnya. Jika aplikasi IMS memperbarui kerangka kerja tanpa fitur yang didukung, ImsService akan dibatalkan hingga ponsel di-boot ulang atau kartu SIM baru dimasukkan yang cocok dengan aplikasi IMS.
Prioritas pengikatan untuk beberapa ImsService
Kerangka kerja ini tidak dapat mendukung pengikatan ke semua kemungkinan ImsServices yang dimuat sebelumnya ke perangkat dan akan mengikat hingga dua ImsServices per slot SIM (satu ImsServices untuk setiap fitur) dalam urutan berikut berdasarkan per fitur:
- Nama paket ImsService ditentukan oleh nilai CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
ketika ada kartu SIM yang dimasukkan. - Nama paket ImsService ditentukan dalam nilai overlay perangkat untuk
config_ims_[mmtel/rcs]_package
termasuk jika tidak ada kartu SIM yang dimasukkan. ImsService ini WAJIB support dengan fitur Emergency MmTel.
Anda harus menentukan nama paket ImsService Anda di CarrierConfig untuk setiap operator yang akan menggunakan paket tersebut atau di hamparan perangkat jika ImsService Anda akan menjadi default, seperti yang ditentukan di atas.
Mari kita uraikan ini untuk setiap fitur. Untuk perangkat (tunggal atau multi-SIM) dengan satu kartu SIM yang dimuat, dua fitur IMS dimungkinkan: MMTel dan RCS. Kerangka kerja akan mencoba mengikat dalam urutan yang ditentukan di atas untuk setiap fitur dan jika fitur tersebut tidak tersedia untuk ImsService yang ditentukan dalam penggantian Konfigurasi Operator, kerangka kerja akan kembali ke ImsService default Anda. Jadi, misalnya, tabel di bawah menjelaskan fitur IMS mana yang akan digunakan kerangka kerja dengan adanya tiga aplikasi IMS yang mengimplementasikan ImsServices yang diinstal pada sistem dengan fitur berikut:
- Operator A ImsService mendukung RCS
- Carrier B ImsService mendukung RCS dan MMTel
- OEM ImsService mendukung RCS dan MMTel
Kartu SIM Dimasukkan | Fitur RCS | Fitur MM Tel |
---|---|---|
Pembawa A | Pembawa A | OEM |
Pembawa B | Pembawa B | Pembawa B |
Tidak ada SIM | OEM | OEM |
Validasi
Alat untuk memverifikasi implementasi IMS sendiri tidak disertakan karena spesifikasi IMS sangat besar dan menggunakan peralatan verifikasi khusus. Pengujian hanya dapat memverifikasi bahwa kerangka telepon merespons API ImsService dengan benar.
Kembangkan aplikasi IMS
Saat mengembangkan aplikasi IMS yang berinteraksi dengan tumpukan telepon Android, sebaiknya tentukan bahwa aplikasi tersebut dapat mendengarkan atau mengubah status instance ImsService yang terpasang untuk langganan operator tertentu.
Untuk mendengarkan atau mengubah status ImsService untuk fitur MMTEL dan RCS, gunakan kelas ImsManager
untuk mendapatkan instance kelas ImsMmTelManager
, ImsRcsManager
, atau ProvisioningManager
khusus IMS. Aplikasi kemudian dapat mendengarkan layanan khusus IMS dan status penyediaan seperti:
- Fitur MMTEL atau RCS yang diaktifkan dan tersedia
- Pembaruan ketika status pendaftaran IMS berubah
- Status penyediaan fitur IMS
- Fitur IMS yang telah diaktifkan pengguna
Gunakan ImsStateCallback
Meskipun ImsService adalah layanan yang terikat secara persisten, layanan yang terikat mungkin berubah ketika kartu SIM baru atau langganan tertanam menjadi aktif atau ketika konfigurasi operator berubah. Karena ImsService bukan bagian dari proses telepon, aplikasi mungkin mengalami pengecualian yang tidak terduga saat mencoba mengakses API IMS jika ImsService mengalami crash atau tidak terikat karena perubahan langganan atau konfigurasi.
Pada perangkat yang menjalankan Android 13 atau lebih tinggi, untuk memantau apakah instance ImsService untuk langganan terkait tersedia atau tidak, aplikasi dapat menggunakan kelas ImsStateCallback
. Saat mendapatkan instance ImsMmTelManager
atau ImsRcsManager
, sebaiknya aplikasi terlebih dahulu mendaftar untuk callback status IMS menggunakan ImsMmTelManager#registerImsStateCallback
atau ImsRcsManager#registerImsStateCallback
. Untuk terus menerima pembaruan panggilan balik untuk langganan tertentu ketika ImsService tersedia lagi, aplikasi harus membatalkan pendaftaran atau membuang panggilan balik yang ada yang didaftarkan melalui ImsMmTelManager
, ImsRcsManager
, atau ProvisioningManager
; dan mendaftarkan panggilan balik baru.
Jika ada langganan yang tidak mendukung IMS, kerangka kerja akan memanggil ImsStateCallback#onUnavailable
dengan alasan REASON_NO_IMS_SERVICE_CONFIGURED
. Ini berarti ImsService dan API terkait IMS tidak tersedia untuk langganan.
Jika proses telepon mengalami crash, aplikasi akan menerima ImsStateCallback#onError
dan tidak lagi menerima pembaruan pada instans ImsStateCallback
yang terdaftar. Untuk memulihkan kondisi ini, daftarkan ulang instans ImsStateCallback
untuk langganan terkait dengan memanggil ImsMmTelManager#registerImsStateCallback
atau ImsRcsManager#registerImsStateCallback
.