Android 9 memperkenalkan antarmuka SystemApi baru 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 vendor atau operator.
Gambar 1. Ringkasan ImsService
Dengan menggunakan antarmuka ImsService, pengimplementasi IMS dapat memberikan informasi sinyal penting ke platform, seperti informasi pendaftaran IMS, SMS melalui integrasi IMS, dan integrasi fitur MmTel untuk menyediakan panggilan suara dan video. ImsService API juga merupakan Android System API, yang berarti dapat di-build dengan Android SDK secara langsung, bukan dengan 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 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 di API.
Implementasi
ImsService API adalah API tingkat tinggi yang memungkinkan Anda menerapkan IMS dengan banyak cara, bergantung pada hardware yang tersedia. Misalnya, implementasi berubah bergantung pada apakah implementasi IMS sepenuhnya berada di pemroses aplikasi atau dialihkan sebagian atau sepenuhnya ke modem. Android tidak menyediakan HAL publik untuk memindahkan beban ke prosesor baseband, sehingga setiap pengurangan beban harus terjadi menggunakan ekstensi HAL Anda ke modem.
Kompatibilitas dengan penerapan IMS lama
Meskipun Android 9 menyertakan ImsService API,
perangkat yang menggunakan implementasi lama untuk IMS tidak dapat mendukung API tersebut.
Untuk perangkat ini, class wrapper dan antarmuka AIDL 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 memperluasnya dari
API namespace
android.telephony.ims.compat
. - Ubah definisi layanan ImsService di AndroidManifest.xml untuk menggunakan
tindakan filter intent
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 berfungsi dengan penerapan
ImsService
lama.
Pendaftaran ImsService dengan framework
ImsService API diimplementasikan sebagai layanan, yang diikat oleh framework Android
untuk berkomunikasi dengan implementasi IMS. Ada tiga langkah yang
diperlukan untuk mendaftarkan aplikasi yang mengimplementasikan ImsService dengan
framework. Pertama, implementasi ImsService harus mendaftarkan dirinya ke
platform menggunakan AndroidManifest.xml
aplikasi; kedua, implementasi tersebut harus
menentukan fitur IMS yang didukung penerapan (MmTel atau RCS); dan ketiga,
implementasi tersebut harus diverifikasi sebagai implementasi IMS tepercaya baik dalam konfigurasi
operator atau 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 agar operasi benar:
directBootAware="true"
: Memungkinkan layanan ditemukan dan dijalankan olehtelephony
sebelum pengguna membuka kunci perangkat. Layanan tidak dapat mengakses penyimpanan yang dienkripsi perangkat sebelum pengguna membuka kunci perangkat. Untuk informasi selengkapnya, lihat Mendukung mode Direct Boot dan Enkripsi Berbasis File.persistent="true"
: Memungkinkan layanan ini dijalankan secara persisten dan tidak dihentikan oleh sistem untuk memperoleh kembali memori. Atribut ini HANYA berfungsi jika aplikasi dibuat sebagai aplikasi sistem.permission="android.permission.BIND_IMS_SERVICE"
: Memastikan bahwa hanya proses yang telah diberi izinBIND_IMS_SERVICE
yang dapat mengikat ke aplikasi. Hal ini mencegah aplikasi nakal mengikat ke layanan, karena hanya aplikasi sistem yang dapat diberi 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, masih ada keuntungan untuk mendeklarasikannya sebagai fitur ImsService.
Berikut adalah fitur valid yang ditentukan dalam android.telephony.ims.ImsFeature
yang
dapat disediakan ImsService serta penjelasan dan contoh alasan aplikasi
IMS ingin menerapkan 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
menerapkan 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. Setiap implementasi ImsService
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 memberikan sinyal ke platform bahwa lampiran darurat ke
PDN IMS untuk layanan darurat dapat dilakukan. Jika fitur ini tidak dideklarasikan untuk
ImsService
Anda, platform akan selalu ditetapkan secara default ke Penggantian Circuit Switch
untuk layanan darurat. Fitur FEATURE_MMTEL
harus ditentukan agar fitur
ini dapat ditentukan.
FITUR_RCS
ImsService API tidak mengimplementasikan fitur RCS IMS apa pun, tetapi
class dasar android.telephony.ims.RcsFeature
masih dapat berguna. Framework ini
akan otomatis diikat 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 binding kustom yang harus disediakan oleh fitur RCS.
Pendaftaran fitur yang didukung
Framework telefoni pertama-tama terikat dengan ImsService untuk membuat kueri fitur yang
didukungnya menggunakan ImsService#querySupportedImsFeatures
API. Setelah
menghitung fitur yang akan didukung ImsService, framework akan memanggil
ImsService#create[...]Feature
untuk setiap fitur yang akan
ditanggung oleh ImsService. Jika fitur yang didukung aplikasi IMS berubah, Anda
dapat menggunakan ImsService#onUpdateSupportedImsFeatures
untuk memberi sinyal ke framework agar
menghitung ulang fitur yang didukung. Lihat diagram berikut untuk mengetahui informasi selengkapnya
tentang inisialisasi dan pengikatan ImsService.
Gambar 2: Inisialisasi dan binding ImsService
Deteksi dan verifikasi framework dari implementasi ImsService
Setelah ImsService ditentukan dengan benar di AndroidManifest.xml, platform harus dikonfigurasi untuk (dengan aman) mengikat ke ImsService jika sesuai. Ada dua jenis ImsServices yang diikat oleh framework:
- ImsService "penggantian" operator: ImsService ini dimuat sebelumnya ke
perangkat, tetapi dilampirkan ke satu atau beberapa operator seluler dan hanya akan
diikat saat kartu SIM yang cocok dimasukkan. Hal 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 menerapkan 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 di 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 setiap 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 ponsel, mikrofon, lokasi, kamera, dan kontak). Dengan memverifikasi apakah nama paket implementasi IMS cocok dengan nilai overlay perangkat atau CarrierConfig yang ditentukan di atas, hanya aplikasi tepercaya yang diprainstal yang terikat.
Penyesuaian
Aplikasi yang mengimplementasikan ImsService hanya terikat di perangkat tempat
dikonfigurasi sebagai konfigurasi ImsService "penggantian" 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
. Tindakan ini memicu framework untuk
menghitung ulang ImsServices yang terikat dan fitur yang didukungnya. Jika
aplikasi IMS mengupdate framework tanpa fitur yang didukung, ImsService
akan di-unbound hingga ponsel dimulai ulang atau kartu SIM baru dimasukkan yang
cocok dengan aplikasi IMS.
Mengikat prioritas untuk beberapa ImsService
Framework tidak dapat mendukung binding 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 yang ditentukan oleh nilai CarrierConfig
config_ims_[mmtel/rcs]_package_override_string
saat 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 akan menjadi default, seperti yang didefinisikan di atas.
Mari kita uraikan untuk setiap fitur. Untuk perangkat (tunggal atau multi-SIM) dengan satu kartu SIM yang dimuat, dua fitur IMS dapat digunakan: MMTel dan RCS. Framework akan mencoba mengikat dalam urutan yang ditentukan di atas untuk setiap fitur dan jika fitur tidak tersedia untuk ImsService yang ditentukan dalam penggantian Konfigurasi Pembawa, framework akan kembali ke ImsService default Anda. Jadi, misalnya, tabel di bawah menjelaskan fitur IMS yang akan digunakan framework dengan tiga aplikasi IMS yang mengimplementasikan ImsServices yang diinstal di 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 penerapan IMS itu sendiri tidak disertakan karena spesifikasi IMS sangat besar dan menggunakan peralatan verifikasi khusus. Pengujian hanya dapat memverifikasi bahwa framework telefoni merespons ImsService API dengan benar.
Mengembangkan aplikasi IMS
Saat mengembangkan aplikasi IMS yang berinteraksi dengan stack telepon Android, sebaiknya tetapkan bahwa aplikasi tersebut dapat memproses atau mengubah status instance ImsService yang terpasang 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 khusus IMS
ProvisioningManager
. Selanjutnya, aplikasi dapat memproses status layanan dan penyediaan khusus IMS
seperti:
- Fitur MMTEL atau RCS yang diaktifkan dan tersedia
- Diperbarui saat status pendaftaran IMS berubah
- Status penyediaan fitur IMS
- Fitur IMS yang telah diaktifkan pengguna
Menggunakan ImsStateCallback
Meskipun ImsService adalah layanan yang terikat secara persisten, 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 telefoni, 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.
Pada perangkat yang menjalankan Android 13 atau yang lebih tinggi, untuk memantau
apakah instance ImsService untuk langganan terkait
tersedia atau tidak tersedia, aplikasi dapat menggunakan
class
ImsStateCallback
. Saat mendapatkan instance ImsMmTelManager
atau ImsRcsManager
, sebaiknya
daftarkan aplikasi terlebih dahulu 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.
Jika proses telefoni 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
.