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). ImsService API 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 một chế độ 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, người triển khai IMS có thể cung cấp thông tin báo hiệu quan trọng cho nền tảng, chẳng hạn như thông tin đăng ký IMS, tích hợp SMS qua IMS và tích hợp tính năng MmTel để cung cấp cuộc gọi thoại và video. API ImsService cũng là một API Hệ thống Android, tức là có thể được tạo 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 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 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

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

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

Mặc dù Android 9 có API ImsService, nhưng các thiết bị sử dụng một phương thức triển khai cũ cho IMS không thể hỗ trợ API này. Đối với những thiết bị này, các giao diện AIDL và lớp trình bao bọc 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 thực hiện những việc sau để tiếp tục hỗ trợ API cũ.

  • Thay đổi không gian tên của việc 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 android.telephony.ims.compat.ImsService intent-filter thay vì thao tác android.telephony.ims.ImsService.

Sau đó, khung sẽ liên kết với ImsService bằng lớp tương thích có trong Android 9 để hoạt động với việc triển khai ImsService cũ.

Đăng ký ImsService với 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. Trước tiên, việc 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, việc triển khai này phải xác định những tính năng IMS mà nó hỗ trợ (MmTel hoặc RCS); và thứ ba, việc triển khai này phải được xác minh là việc triển khai IMS đáng tin cậy trong cấu hình nhà mạng hoặc lớp phủ thiết bị.

Định nghĩa dịch vụ

Ứng dụng IMS đăng ký một ImsService với khung bằng cách thêm một mục 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, cần thiết cho 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 huỷ để giải phóng bộ nhớ. Thuộc tính này CHỈ hoạt động nếu ứng dụng được tạo dưới dạng một ứng dụng hệ thống.
  • permission="android.permission.BIND_IMS_SERVICE": Đảm bảo rằng chỉ có 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 chặn một ứng dụng giả mạo 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ụ này 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à dịch vụ này 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. 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 này là một tính năng của ImsService vẫn có những lợi ích.

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 với phần giải thích và ví dụ về lý do tại sao một ứ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 các tính năng mà nó xác định cho từng khe cắm SIM.

FEATURE_MMTEL

ImsService triển khai tính năng IMS MMTEL, có hỗ trợ tất cả nội dung nghe nhìn IMS (thông số kỹ thuật IR.92 và IR.94) ngoại trừ tính năng đính kèm khẩn cấp vào IMS PDN để 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 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 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 chuyển sang Chế độ dự phòng chuyển mạch cho các dịch vụ khẩn cấp. Bạn phải xác định tính năng FEATURE_MMTEL để 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 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 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 rồi dọn dẹp ImsService được liên kết với tính năng RCS. Chức năng này có thể xoá một số logic phát hiện hoặc liên kết tuỳ chỉnh mà một tính năng RCS sẽ phải cung cấp.

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

Khung điện thoại trước tiên sẽ liên kết với ImsService để truy vấn các tính năng mà dịch vụ này hỗ trợ bằng cách sử dụng API ImsService#querySupportedImsFeatures. Sau khi khung tính toán những tính năng mà ImsService sẽ hỗ trợ, khung 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ể 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ề quá trình khởi tạo và liên kết ImsService.

Khởi động 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 ImsService được xác định chính xác trong AndroidManifest.xml, nền tảng phải được định cấu hình để (bảo mật) liên kết với ImsService khi thích hợp. Có hai loại ImsServices mà khung liên kết đến:

  1. Nhà mạng "ghi đè" ImsService: Các ImsService này được tải sẵn vào thiết bị nhưng được gắn vào 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. Bạn có thể định cấu hình chế độ này bằng cách sử dụng
  2. ImsService "mặc định" của thiết bị: Đây là ImsService mặc định được OEM tải vào thiết bị và được thiết kế để cung cấp các dịch vụ IMS trong mọi trường hợp khi không có ImsService của nhà mạng và 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ó 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ó chế độ triển khai ImsService có thể tải xuống của bên thứ ba, vì vậy, mọi 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í, camera và danh bạ). Bằng cách xác minh xem tên gói của việc triển khai IMS có khớp với các giá trị CarrierConfig hoặc 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 sẵn 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 những thiết bị mà chúng được định cấu hình là 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à dịch vụ này hỗ trợ (MMTEL và RCS) được bật hoặc tắt linh hoạt bằng cách sử dụng các 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 ImsService đượ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 mà không có tính năng nào được hỗ trợ, thì ImsService sẽ không liên kết cho đến khi điện thoại khởi động lại hoặc một thẻ SIM mới được lắp vào 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ả ImsService có thể được tải sẵn vào thiết bị và sẽ liên kết tối đa 2 ImsService cho mỗi khe cắm 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 chèn.
  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, kể 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 của bạn sẽ là mặc định, như được xác định ở trên.

Hãy cùng phân tích từng tính năng. Đối với thiết bị (một hoặc nhiều SIM) có một thẻ SIM được tải, có thể có 2 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 của bạn. Ví dụ: bảng dưới đây mô tả tính năng IMS mà khung sẽ sử dụng khi có 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ụ để xác minh việc triển khai IMS không được đưa vào vì các quy cách IMS có dung lượng cực 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 truyền thông 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 có giao diện với ngăn xếp điện thoại Android, bạn nên chỉ định rằng ứng dụng có thể theo dõi hoặc sửa đổi trạng thái của phiên bản ImsService được đính kèm cho một gói thuê bao cụ thể của nhà mạng.

Để 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 dùng lớp ImsManager để nhận một phiên bản của ImsMmTelManager, ImsRcsManager hoặc lớp ProvisioningManager dành riêng cho IMS. Sau đó, ứng dụng có thể theo dõi các trạng thái dịch vụ và trạng thái cung cấp cụ thể của IMS, chẳng hạn như:

  • Các tính năng MMTEL hoặc RCS được 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ụ được 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 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 thuộc quy trình điện thoại, nên một ứ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ố một cách âm thầm hoặc bị huỷ liên kết do thay đổi 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 phiên bản ImsService cho một thuê bao được 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 nhận được một phiên bản của ImsMmTelManager hoặc ImsRcsManager, ứng dụng nên đăng ký trước cho một lệnh gọi lại trạng thái IMS bằng ImsMmTelManager#registerImsStateCallback hoặc ImsRcsManager#registerImsStateCallback. Để tiếp tục nhận các bản cập nhật 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ó một gói thuê bao không hỗ trợ IMS, khung sẽ gọi ImsStateCallback#onUnavailable với lý do REASON_NO_IMS_SERVICE_CONFIGURED. Điều này có nghĩa là ImsService và các API liên quan đến IMS không có sẵn cho gói thuê bao.

Trong trường hợp không mong muốn 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 thông tin cập nhật về phiên bản ImsStateCallback đã đăng ký nữa. Để khắc phục tình trạng này, hãy đăng ký lại phiên bản ImsStateCallback cho gói thuê bao có liên quan bằng cách gọi ImsMmTelManager#registerImsStateCallback hoặc ImsRcsManager#registerImsStateCallback.