Triển khai IMS

Android 9 giới thiệu một giao diện SystemApi mới 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. Một ứng dụng IMS đã được cài đặt trước trên thiết bị cũng có thể được định cấu hình để có thể cập nhật trên 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 kiểm thử 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ụ: cách triển khai thay đổi tuỳ thuộc vào việc quá trình triển khai IMS đã hoàn toàn dựa trên bộ xử lý ứng dụng hay được giảm tải một phần hay hoàn toàn xuống 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 để làm việc với quá trình 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 để 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 này. 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ác thuộc tính này cần thiết để thực hiện đúng thao tá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 ImsService.

Quy cách tính năng của 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 làm 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ợ 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 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 phương thức 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 sử dụng tính năng Dự phòng công tắc mạch theo mặc định cho các dịch vụ khẩn cấp. Bạn phải xác định tính năng FEATURE_MMTEL thì mới có thể xác định tính năng này.

FEATURE_RCS

ImsService API không triển khai bất kỳ tính năng RCS nào của IMS, nhưng lớp cơ sở android.telephony.ims.RcsFeature vẫn có thể hữu ích. Khung này sẽ tự động liên kết với ImsService và gọi ImsService#createRcsFeature khi phát hiện thấy gói 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 điện thoại hỗ trợ bằ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. Có 2 loại ImsServices mà khung liên kết với:

  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 và hữu ích trong trường hợp thiết bị không có thẻ SIM hoặc thẻ SIM đã lắp không có ImsService của nhà mạng. Điều này được xác định trong lớp phủ thiết bị bằng cách sử dụ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 các giá trị lớp phủ của ProviderConfig hoặc thiết bị đã xác định ở trên hay không, chỉ những ứng dụng đáng tin cậy được cài đặt sẵn mới được ràng buộc.

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 bật hoặc tắt một cách linh động các tính năng IMS mà dịch vụ này hỗ trợ (MMTEL và RCS) bằng cách sử dụng bản cập nhật bằng 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 có tính năng nào được hỗ trợ, 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 config_ims_[mmtel/rcs]_package_override_string xác định 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 của 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ả

Các công cụ dùng để xác minh quá trình triển khai IMS không được đưa vào vì quy cách 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 ProvisioningManager hoặc ImsMmTelManager.ImsRcsManager 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 đã được bật và có thể sử dụng
  • 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 của gói thuê bao liên kết có hoạt động hay không, một ứ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à quy 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 bản cập nhật trên thực thể ImsStateCallback đã đăng ký. Để khôi phục khỏi 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.