Menerapkan IMS

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.

Ikhtisar Layanan Ims

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 tindakan android.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 melalui telephony 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 izin BIND_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.

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:

  1. 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
  2. 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:

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:

  1. Nama paket ImsService ditentukan oleh nilai CarrierConfig config_ims_[mmtel/rcs]_package_override_string ketika ada kartu SIM yang dimasukkan.
  2. 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 .