Triển khai IMS

Android 9 giới thiệu một giao diện SystemApi có tên là ImsService để giúp bạn triển khai Hệ thống con đa phương tiện IP (IMS). API ImsService là một giao diện được xác định rõ ràng giữa nền tảng Android và một nhà cung cấp hoặc phương thức triển khai IMS do nhà mạng cung cấp.

Tổng quan về ImsService

Hình 1. Tổng quan về ImsService

Bằng cách sử dụng giao diện ImsService, trình triển khai IMS có thể cung cấp thông tin quan trọng về tín hiệu cho nền tảng, chẳng hạn như thông tin đăng ký IMS, SMS qua tính năng tích hợp IMS và tích hợp tính năng MmTel để cung cấp tính năng gọi thoại và video. API ImsService cũng là một API Hệ thống Android, nghĩa là bạn có thể tạo API này trực tiếp dựa trên SDK Android thay vì dựa trên nguồn. Bạn cũng có thể định cấu hình một ứng dụng IMS đã cài đặt sẵn trên thiết bị để có thể cập nhật qua Cửa hàng Play.

Ví dụ và nguồn

Android cung cấp một ứng dụng trên AOSP triển khai các phần của API ImsService cho mục đích thử nghiệm và phát triển. Bạn có thể tìm thấy ứng dụng này tại /testapps/ImsTestService.

Bạn có thể tìm thấy tài liệu về API ImsService trong ImsService và trong các lớp khác trong API.

Triển khai

API ImsService là một API cấp cao cho phép bạn triển khai IMS theo nhiều cách, tuỳ thuộc vào phần cứng có sẵn. Ví dụ: phương thức triển khai sẽ thay đổi tuỳ thuộc vào việc triển khai IMS hoàn toàn trên bộ xử lý ứng dụng hay một phần hoặc toàn bộ được chuyển sang modem. Android không cung cấp HAL công khai để giảm tải cho bộ xử lý băng cơ sở, vì vậy, mọi hoạt động giảm tải phải diễn ra bằng cách sử dụng tiện ích HAL của bạn cho modem.

Khả năng tương thích với các phương thức triển khai IMS cũ

Mặc dù Android 9 có API ImsService, nhưng các thiết bị sử dụng phương thức triển khai cũ cho IMS sẽ không thể hỗ trợ API này. Đối với các thiết bị này, các giao diện AIDL cũ và lớp trình bao bọc đã được chuyển sang không gian tên android.telephony.ims.compat. Khi nâng cấp lên Android 9, các thiết bị cũ phải làm như sau để tiếp tục hỗ trợ API cũ.

  • Thay đổi không gian tên của quá trình triển khai ImsService để mở rộng từ API không gian tên android.telephony.ims.compat.
  • Sửa đổi định nghĩa dịch vụ ImsService trong AndroidManifest.xml để sử dụng thao tác bộ lọc ý định android.telephony.ims.compat.ImsService thay vì thao tác android.telephony.ims.ImsService.

Sau đó, khung này sẽ liên kết với ImsService bằng cách sử dụng lớp tương thích được cung cấp trong Android 9 để hoạt động với phương thức triển khai ImsService cũ.

Đăng ký ImsService bằng khung

API ImsService được triển khai dưới dạng một dịch vụ mà khung Android liên kết với để giao tiếp với quá trình triển khai IMS. Bạn cần thực hiện 3 bước để đăng ký một ứng dụng triển khai ImsService bằng khung. Trước tiên, quá trình triển khai ImsService phải tự đăng ký với nền tảng bằng cách sử dụng AndroidManifest.xml của ứng dụng; thứ hai, quá trình này phải xác định tính năng IMS nào mà quá trình triển khai hỗ trợ (MmTel hoặc RCS); và thứ ba, quá trình này phải được xác minh là quá trình triển khai IMS đáng tin cậy trong cấu hình của nhà mạng hoặc lớp phủ thiết bị.

Định nghĩa dịch vụ

Ứng dụng IMS đăng ký ImsService với khung bằng cách thêm mục nhập service vào tệp kê khai theo định dạng sau:

<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>

Định nghĩa service trong AndroidManifest.xml xác định các thuộc tính sau đây cần thiết để hoạt động chính xác:

  • directBootAware="true": Cho phép telephony phát hiện và chạy dịch vụ trước khi người dùng mở khoá thiết bị. Dịch vụ không thể truy cập vào bộ nhớ được mã hoá trên thiết bị trước khi người dùng mở khoá thiết bị. Để biết thêm thông tin, hãy xem phần Hỗ trợ chế độ Khởi động trực tiếpMã hoá dựa trên tệp.
  • persistent="true": Cho phép dịch vụ này chạy liên tục và không bị hệ thống tắt để thu hồi bộ nhớ. Thuộc tính này CHỈ hoạt động nếu ứng dụng được tạo dưới dạng ứng dụng hệ thống.
  • permission="android.permission.BIND_IMS_SERVICE": Đảm bảo rằng chỉ một quy trình đã được cấp quyền BIND_IMS_SERVICE mới có thể liên kết với ứng dụng. Điều này ngăn ứng dụng độc hại liên kết với dịch vụ, vì chỉ các ứng dụng hệ thống mới có thể được khung cấp quyền.

Dịch vụ cũng phải chỉ định phần tử intent-filter bằng thao tác android.telephony.ims.ImsService. Điều này cho phép khung tìm thấy ImsService.

Quy cách tính năng IMS

Sau khi ImsService được xác định là một dịch vụ Android trong AndroidManifest.xml, ImsService phải xác định những tính năng IMS mà nó hỗ trợ. Android hiện hỗ trợ các tính năng MmTel và RCS, tuy nhiên chỉ có MmTel được tích hợp vào khung này. Mặc dù không có API RCS nào được tích hợp vào khung này, nhưng việc khai báo API RCS dưới dạng một tính năng của ImsService vẫn có những lợi thế.

Dưới đây là các tính năng hợp lệ được xác định trong android.telephony.ims.ImsFeature mà ImsService có thể cung cấp, cũng như nội dung giải thích và ví dụ về lý do ứng dụng IMS muốn triển khai một hoặc tất cả các tính năng này. Sau khi xác định từng tính năng, trang này sẽ trình bày cách ImsService khai báo tập hợp tính năng mà nó xác định cho từng khe SIM.

FEATURE_MMTEL

ImsService triển khai tính năng IMS MMTEL, trong đó có hỗ trợ cho tất cả nội dung đa phương tiện IMS (quy cách IR.92 và IR.94), ngoại trừ trường hợp khẩn cấp đính kèm vào PDN IMS để gọi điện khẩn cấp. Mọi hoạt động triển khai ImsService muốn hỗ trợ các tính năng MMTEL đều phải mở rộng lớp cơ sở android.telephony.ims.MmTelFeature và trả về một hoạt động triển khai MmTelFeature tuỳ chỉnh trong ImsService#createMmTelFeature.

FEATURE_EMERGENCY_MMTEL

Việc khai báo tính năng này chỉ báo hiệu cho nền tảng rằng có thể đính kèm trường hợp khẩn cấp vào PDN IMS cho các dịch vụ khẩn cấp. Nếu bạn không khai báo tính năng này cho ImsService, thì nền tảng sẽ luôn mặc định sử dụng tính năng dự phòng Chuyển mạch vòng cho các dịch vụ khẩn cấp. Bạn phải xác định tính năng FEATURE_MMTEL để có thể xác định tính năng này.

FEATURE_RCS

API ImsService không triển khai bất kỳ tính năng IMS RCS nào, nhưng lớp cơ sở android.telephony.ims.RcsFeature vẫn có thể hữu ích. Khung này tự động liên kết với ImsService và gọi ImsService#createRcsFeature khi phát hiện gói này sẽ cung cấp RCS. Nếu thẻ SIM liên kết với dịch vụ RCS bị xoá, khung sẽ tự động gọi RcsFeature#onFeatureRemoved, sau đó dọn dẹp ImsService liên kết với tính năng RCS. Chức năng này có thể xoá một số logic liên kết hoặc phát hiện tuỳ chỉnh mà tính năng RCS phải cung cấp.

Đăng ký các tính năng được hỗ trợ

Trước tiên, khung điện thoại sẽ liên kết với ImsService để truy vấn các tính năng mà khung này hỗ trợ bằng cách sử dụng API ImsService#querySupportedImsFeatures. Sau khi tính toán những tính năng mà ImsService sẽ hỗ trợ, khung này sẽ gọi ImsService#create[...]Feature cho từng tính năng mà ImsService sẽ chịu trách nhiệm. Nếu các tính năng mà ứng dụng IMS hỗ trợ thay đổi, bạn có thể sử dụng ImsService#onUpdateSupportedImsFeatures để báo hiệu cho khung tính toán lại các tính năng được hỗ trợ. Hãy xem sơ đồ sau để biết thêm thông tin về việc khởi chạy và liên kết ImsService.

Khởi chạy và liên kết ImsService

Hình 2. Khởi chạy và liên kết ImsService

Phát hiện và xác minh khung triển khai ImsService

Sau khi xác định chính xác ImsService trong AndroidManifest.xml, bạn phải định cấu hình nền tảng để liên kết (một cách an toàn) với ImsService khi thích hợp. Khung này liên kết với hai loại ImsServices:

  1. Nhà mạng "ghi đè" ImsService: Các ImsService này được tải trước vào thiết bị nhưng được đính kèm với một hoặc nhiều nhà mạng di động và sẽ chỉ được liên kết khi bạn lắp thẻ SIM phù hợp. Điều này được định cấu hình bằng cách sử dụng
  2. ImsService "mặc định" của thiết bị: Đây là ImsService mặc định do OEM tải lên thiết bị và được thiết kế để cung cấp dịch vụ IMS trong mọi trường hợp không có ImsService của nhà mạng. Dịch vụ này cũng hữu ích trong trường hợp thiết bị không lắp thẻ SIM hoặc thẻ SIM đã lắp không cài đặt ImsService của nhà mạng. Giá trị này được xác định trong lớp phủ thiết bị bằng các cấu hình sau:

Android không hỗ trợ các ứng dụng có cách triển khai ImsService có thể tải xuống của bên thứ ba, vì vậy, mọi cách triển khai ImsService được xác định ở đây đều phải là ứng dụng Hệ thống và phải nằm trong thư mục /system/priv-app/ hoặc /product/priv-app/ để cấp các quyền thích hợp (cụ thể là quyền đối với điện thoại, micrô, vị trí, máy ảnh và danh bạ). Bằng cách xác minh xem tên gói của quá trình triển khai IMS có khớp với CarrierConfig hoặc giá trị lớp phủ thiết bị được xác định ở trên hay không, chỉ những ứng dụng đáng tin cậy, được cài đặt trước mới được liên kết.

Tuỳ chỉnh

Các ứng dụng triển khai ImsService chỉ được liên kết trên các thiết bị mà ứng dụng được định cấu hình là cấu hình ImsService "ghi đè" của nhà mạng hoặc cấu hình ImsService "mặc định" của thiết bị cho chức năng MMTEL hoặc RCS. ImsService cũng cho phép các tính năng IMS mà nó hỗ trợ (MMTEL và RCS) được bật hoặc tắt một cách linh động bằng cách sử dụng các bản cập nhật thông qua phương thức ImsService#onUpdateSupportedImsFeatures. Thao tác này sẽ kích hoạt khung để tính toán lại những ImsServices nào được liên kết và những tính năng mà chúng hỗ trợ. Nếu ứng dụng IMS cập nhật khung không hỗ trợ tính năng nào, thì ImsService sẽ bị huỷ liên kết cho đến khi điện thoại khởi động lại hoặc bạn lắp thẻ SIM mới khớp với ứng dụng IMS.

Mức độ ưu tiên liên kết cho nhiều ImsService

Khung này không thể hỗ trợ liên kết với tất cả các ImsServices có thể được tải trước vào thiết bị và sẽ liên kết với tối đa 2 ImsServices cho mỗi khe SIM (một ImsService cho mỗi tính năng) theo thứ tự sau đây trên cơ sở từng tính năng:

  1. Tên gói ImsService do giá trị CarrierConfig định nghĩa là config_ims_[mmtel/rcs]_package_override_string khi có thẻ SIM được lắp vào.
  2. Tên gói ImsService được xác định trong giá trị lớp phủ thiết bị cho config_ims_[mmtel/rcs]_package, bao gồm cả trường hợp không có thẻ SIM nào được lắp. ImsService này PHẢI hỗ trợ tính năng MmTel khẩn cấp.

Bạn phải xác định tên gói của ImsService trong CarrierConfig cho từng nhà mạng sẽ sử dụng gói đó hoặc trong lớp phủ thiết bị nếu ImsService sẽ là mặc định, như đã xác định ở trên.

Hãy cùng phân tích chi tiết từng tính năng. Đối với một thiết bị (một hoặc nhiều SIM) chỉ có một thẻ SIM được tải, bạn có thể sử dụng hai tính năng IMS: MMTel và RCS. Khung sẽ cố gắng liên kết theo thứ tự được xác định ở trên cho từng tính năng và nếu tính năng đó không có sẵn cho ImsService được xác định trong chế độ ghi đè Cấu hình nhà mạng, thì khung sẽ quay lại ImsService mặc định. Ví dụ: bảng dưới đây mô tả tính năng IMS mà khung sẽ sử dụng cho 3 ứng dụng IMS triển khai ImsServices được cài đặt trên một hệ thống có các tính năng sau:

  • ImsService của Nhà mạng A hỗ trợ RCS
  • ImsService của Nhà mạng B hỗ trợ RCS và MMTel
  • OEM ImsService hỗ trợ RCS và MMTel
Đã lắp thẻ SIM Tính năng RCS Tính năng MMTel
Nhà mạng A Nhà mạng A OEM (Nhà sản xuất thiết bị gốc)
Nhà mạng B Nhà mạng B Nhà mạng B
Không có SIM OEM (Nhà sản xuất thiết bị gốc) OEM (Nhà sản xuất thiết bị gốc)

Xác nhận kết quả

Bộ công cụ để xác minh việc triển khai IMS không được đưa vào vì thông số kỹ thuật của IMS cực kỳ lớn và sử dụng thiết bị xác minh đặc biệt. Các bài kiểm thử chỉ có thể xác minh rằng khung điện thoại phản hồi đúng cách với API ImsService.

Phát triển ứng dụng IMS

Khi phát triển một ứng dụng IMS giao tiếp với ngăn xếp điện thoại Android, bạn nên chỉ định rằng ứng dụng có thể nghe hoặc sửa đổi trạng thái của thực thể ImsService được đính kèm cho một gói thuê bao của nhà mạng cụ thể.

Để nghe hoặc sửa đổi trạng thái của ImsService cho các tính năng MMTEL và RCS, hãy sử dụng lớp ImsManager để lấy một thực thể của lớp ImsMmTelManager, ImsRcsManager hoặc lớp ProvisioningManager dành riêng cho IMS. Sau đó, ứng dụng có thể nghe các trạng thái cấp phép và dịch vụ dành riêng cho IMS, chẳng hạn như:

  • Các tính năng MMTEL hoặc RCS đã bật và có sẵn
  • Cập nhật khi trạng thái đăng ký IMS thay đổi
  • Trạng thái cấp phép của các tính năng IMS
  • Các tính năng IMS mà người dùng đã bật

Sử dụng ImsStateCallback

Mặc dù ImsService là một dịch vụ liên kết liên tục, nhưng dịch vụ được liên kết có thể thay đổi khi thẻ SIM mới hoặc gói thuê bao được nhúng trở nên hoạt động hoặc khi cấu hình của nhà mạng thay đổi. Vì ImsService không phải là một phần của quy trình điện thoại, nên ứng dụng có thể gặp phải các trường hợp ngoại lệ không lường trước được khi cố gắng truy cập vào các API IMS nếu ImsService gặp sự cố ẩn hoặc bị huỷ liên kết do thay đổi về gói thuê bao hoặc cấu hình.

Trên các thiết bị chạy Android 13 trở lên, để theo dõi xem thực thể ImsService cho một gói thuê bao được liên kết có hoạt động hay không, ứng dụng có thể sử dụng lớp ImsStateCallback. Khi lấy một thực thể của ImsMmTelManager hoặc ImsRcsManager, trước tiên, bạn nên đăng ký lệnh gọi lại trạng thái IMS bằng cách sử dụng ImsMmTelManager#registerImsStateCallback hoặc ImsRcsManager#registerImsStateCallback. Để tiếp tục nhận thông tin cập nhật về lệnh gọi lại cho các gói thuê bao cụ thể khi ImsService hoạt động trở lại, ứng dụng phải huỷ đăng ký hoặc loại bỏ các lệnh gọi lại hiện có đã đăng ký thông qua ImsMmTelManager, ImsRcsManager hoặc ProvisioningManager; đồng thời đăng ký các lệnh gọi lại mới.

Nếu có gói thuê bao không hỗ trợ IMS, khung này sẽ gọi ImsStateCallback#onUnavailable với lý do REASON_NO_IMS_SERVICE_CONFIGURED. Điều này có nghĩa là gói thuê bao không có ImsService và các API liên quan đến IMS.

Trong trường hợp hiếm gặp là quá trình điện thoại gặp sự cố, ứng dụng sẽ nhận được ImsStateCallback#onError và không còn nhận được thông tin cập nhật về thực thể ImsStateCallback đã đăng ký. Để khắc phục tình trạng này, hãy đăng ký lại thực thể ImsStateCallback cho gói thuê bao được liên kết bằng cách gọi ImsMmTelManager#registerImsStateCallback hoặc ImsRcsManager#registerImsStateCallback.