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 pensinyalan 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 dibangun terhadap Android SDK secara langsung, bukan terhadap 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
API ImsService adalah API tingkat tinggi yang memungkinkan Anda mengimplementasikan IMS dalam banyak cara, tergantung pada perangkat keras yang tersedia. Misalnya, implementasi berubah tergantung pada apakah implementasi IMS sepenuhnya pada prosesor aplikasi atau jika sebagian atau seluruhnya diturunkan ke modem. Android tidak menyediakan HAL publik untuk pembongkaran ke prosesor pita dasar, sehingga pembongkaran apa pun harus dilakukan menggunakan ekstensi HAL Anda ke modem.
Kompatibilitas dengan implementasi IMS yang lebih lama
Meskipun Android 9 menyertakan API ImsService, perangkat yang menggunakan implementasi lama untuk IMS tidak dapat mendukung API. Untuk perangkat ini, antarmuka AIDL dan kelas pembungkus yang lebih lama telah dipindahkan ke ruang nama android.telephony.ims.compat
. Saat meningkatkan ke Android 9, perangkat yang lebih lama harus melakukan hal berikut untuk melanjutkan dukungan API yang lebih lama.
- Ubah namespace implementasi ImsService untuk memperluas dari API namespace
android.telephony.ims.compat
. - Ubah definisi layanan ImsService di AndroidManifest.xml untuk menggunakan tindakan filter maksud
android.telephony.ims.compat.ImsService
, alih-alih tindakanandroid.telephony.ims.ImsService
.
Kerangka kerja kemudian akan mengikat ke ImsService menggunakan lapisan kompatibilitas yang disediakan di Android 9 untuk bekerja dengan implementasi ImsService
lama.
Pendaftaran ImsService dengan kerangka kerja
API ImsService 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. Pertama, implementasi ImsService harus mendaftarkan dirinya ke platform menggunakan AndroidManifest.xml
dari aplikasi; kedua, itu harus menentukan fitur IMS mana yang didukung implementasi (MmTel atau RCS); dan ketiga, 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 operasi 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 memiliki izinBIND_IMS_SERVICE
yang diberikan padanya yang dapat mengikat ke aplikasi. Ini mencegah aplikasi jahat mengikat ke 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
. 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 RCS API yang terintegrasi ke dalam kerangka kerja, masih ada keuntungan untuk mendeklarasikannya sebagai fitur dari ImsService.
Di bawah ini adalah fitur valid yang didefinisikan dalam android.telephony.ims.ImsFeature
yang dapat diberikan oleh ImsService dan penjelasan serta contoh mengapa aplikasi IMS ingin mengimplementasikan satu atau semua fitur ini. Setelah setiap fitur didefinisikan, halaman ini menjelaskan bagaimana 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 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
kustom di ImsService#createMmTelFeature
.
FEATURE_EMERGENCY_MMTEL
Mendeklarasikan fitur ini hanya memberi sinyal ke platform bahwa pemasangan darurat ke IMS PDN untuk layanan darurat dimungkinkan. Jika fitur ini tidak dideklarasikan untuk ImsService
Anda, platform akan selalu default ke Circuit Switch Fallback untuk layanan darurat. Fitur FEATURE_MMTEL
harus ditentukan agar fitur ini dapat ditentukan.
FEATURE_RCS
API ImsService tidak mengimplementasikan fitur IMS RCS apa pun, tetapi kelas dasar android.telephony.ims.RcsFeature
masih dapat berguna. Kerangka kerja secara otomatis mengikat ke ImsService dan memanggil ImsService#createRcsFeature
ketika mendeteksi bahwa paket 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 telepon pertama-tama mengikat ke ImsService untuk menanyakan fitur yang didukungnya menggunakan ImsService#querySupportedImsFeatures
API. Setelah kerangka menghitung fitur mana yang akan didukung oleh ImsService, ia 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 kerangka kerja untuk 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 (dengan aman) mengikat ke ImsService bila perlu. Ada dua jenis ImsServices yang diikat oleh kerangka kerja:
- Carrier "override" ImsService: ImsServices ini sudah dimuat sebelumnya ke perangkat tetapi 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.
-
- Perangkat "default" ImsService: Ini adalah ImsService default yang dimuat ke perangkat oleh OEM dan harus dirancang untuk menyediakan layanan IMS dalam semua situasi ketika operator ImsService tidak tersedia dan berguna dalam situasi di mana perangkat tidak memiliki kartu SIM dimasukkan atau kartu SIM yang dimasukkan tidak memiliki operator ImsService yang terpasang dengannya. Ini didefinisikan 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 yang dapat diunduh pihak ketiga, jadi setiap implementasi ImsService yang didefinisikan di sini harus berupa aplikasi Sistem dan harus berada di folder /system/priv-app/ atau /product/priv-app/ untuk memberikan 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 dikonfigurasi sebagai operator "mengganti" ImsService atau perangkat "default" konfigurasi ImsService untuk fungsionalitas 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
. Ini memicu kerangka kerja untuk menghitung ulang ImsServices mana yang terikat dan fitur mana yang mereka dukung. Jika aplikasi IMS memperbarui kerangka kerja tanpa fitur yang didukung, IMSService tidak akan terikat hingga ponsel di-boot ulang atau kartu SIM baru dimasukkan yang cocok dengan aplikasi IMS.
Prioritas pengikatan untuk beberapa ImsService
Kerangka kerja tidak dapat mendukung pengikatan ke semua kemungkinan ImsServices yang dimuat sebelumnya ke perangkat dan akan mengikat hingga dua ImsServices per slot SIM (satu ImsService 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 yang ditentukan dalam nilai overlay perangkat untuk
config_ims_[mmtel/rcs]_package
termasuk kasus di mana tidak ada kartu SIM yang dimasukkan. ImsService ini HARUS mendukung fitur MmTel Darurat.
Anda harus memiliki nama paket ImsService Anda yang ditentukan di CarrierConfig untuk setiap operator yang akan menggunakan paket itu atau di overlay perangkat jika ImsService Anda akan menjadi default, seperti yang didefinisikan di atas.
Mari kita uraikan ini untuk setiap fitur. Untuk perangkat (tunggal atau multi-SIM) dengan satu kartu SIM dimuat, dua fitur IMS dimungkinkan: MMTel dan RCS. Kerangka kerja akan mencoba untuk 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 mundur ke ImsService default Anda. Jadi, misalnya, tabel di bawah ini menjelaskan fitur IMS mana yang akan digunakan kerangka kerja mengingat tiga aplikasi IMS yang mengimplementasikan IMSServices yang diinstal pada sistem dengan fitur berikut:
- Operator A ImsService mendukung RCS
- Operator B ImsService mendukung RCS dan MMTel
- OEM ImsService mendukung RCS dan MMTel
Kartu SIM Dimasukkan | Fitur RCS | Fitur MMTel |
---|---|---|
Pembawa A | Pembawa A | OEM |
Pembawa B | Pembawa B | Pembawa 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 kerangka kerja telepon merespons dengan benar ke ImsService API.
Kembangkan aplikasi IMS
Saat mengembangkan aplikasi IMS yang berinteraksi dengan tumpukan telepon Android, sebaiknya tentukan bahwa aplikasi dapat mendengarkan atau mengubah status instans ImsService yang dilampirkan 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 terus-menerus, layanan yang terikat mungkin berubah saat kartu SIM baru atau langganan yang disematkan 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 mogok atau tidak terikat karena langganan atau perubahan konfigurasi.
Pada perangkat yang menjalankan Android 13 atau lebih tinggi, untuk memantau apakah instans ImsService untuk langganan terkait tersedia atau tidak, aplikasi dapat menggunakan kelas ImsStateCallback
. Saat mendapatkan instance ImsMmTelManager
atau ImsRcsManager
, sebaiknya aplikasi terlebih dahulu mendaftar untuk panggilan balik status IMS menggunakan ImsMmTelManager#registerImsStateCallback
atau ImsRcsManager#registerImsStateCallback
. Untuk terus menerima pembaruan panggilan balik untuk langganan tertentu saat ImsService tersedia lagi, aplikasi harus membatalkan pendaftaran atau membuang panggilan balik yang ada yang terdaftar melalui ImsMmTelManager
, ImsRcsManager
, atau ProvisioningManager
; dan daftarkan panggilan balik baru.
Jika ada langganan yang tidak mendukung IMS, framework akan memanggil ImsStateCallback#onUnavailable
dengan alasan REASON_NO_IMS_SERVICE_CONFIGURED
. Ini berarti bahwa ImsService dan API terkait IMS tidak tersedia untuk langganan.
Jika proses telepon macet, aplikasi akan menerima ImsStateCallback#onError
dan tidak lagi menerima pembaruan pada ImsStateCallback
yang terdaftar. Untuk memulihkan dari kondisi ini, daftarkan ulang instance ImsStateCallback
untuk langganan terkait dengan memanggil ImsMmTelManager#registerImsStateCallback
atau ImsRcsManager#registerImsStateCallback
.