Triển khai IMS

Android 9 giới thiệu giao diện SystemApi mới có tên ImsService để giúp bạn triển khai hệ thống con xử lý nội dung đa phương tiện qua giao thức 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à nhà cung cấp hoặ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 tín hiệu đến nền tảng, chẳng hạn như thông tin đăng ký IMS, SMS qua việc tích hợp IMS và tích hợp tính năng MmTel để cung cấp thoại và video gọi điện. ImsService API cũng là một API Hệ thống Android, có nghĩa là API này có thể được tạo trực tiếp dựa trên SDK Android thay vì dựa trên nguồn. IMS ứng dụng đã đượ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 giúp triển khai các phần của ImsService API cho mục đích kiểm thử và phát triển. Bạn có thể tìm thấy ứng dụng tại /testapps/ImsTestService.

Bạn có thể tìm 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à 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 hiện có. Ví dụ: cách triển khai thay đổi tuỳ thuộc vào việc việc triển khai IMS có hoàn toàn trên ứng dụng hay không hoặc giảm tải một phần hoặc toàn bộ cho modem. Android thì không cung cấp HAL công khai để giảm tải cho bộ xử lý băng tần cơ sở, vì vậy, bất kỳ phải xảy ra tình trạng giảm tải khi sử dụng tiện ích HAL cho modem.

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

Mặc dù Android 9 bao gồm API ImsService, các thiết bị sử dụng cách triển khai cũ hơn cho IMS không thể hỗ trợ API. Đối với các thiết bị này, các giao diện AIDL và lớp trình bao bọc cũ đã được di chuyển vào 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 sự hỗ trợ của 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 Hành động 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 để tương thích với các phiên bản cũ Triển khai ImsService.

Đăng ký ImsService bằng khung này

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 triển khai IMS. Ba bước là việ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 sử dụng AndroidManifest.xml của ứng dụng; thứ hai, nó phải xác định tính năng IMS nào mà việc triển khai hỗ trợ (MmTel hoặc RCS); và thứ ba, nó phải được xác minh là triển khai IMS đáng tin cậy trong 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 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 những nội dung sau các thuộc tính cần thiết để thực hiện thao tác đúng:

  • directBootAware="true": Cho phép dịch vụ được phát hiện và chạy bởi telephony trước khi người dùng mở khoá thiết bị. Dịch vụ không thể truy cập thiết bị được mã hoá trước khi người dùng mở khoá thiết bị. Để biết thêm thông tin, xem 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 loại bỏ để lấy lạ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ỉ có một đã được cấp quyền BIND_IMS_SERVICE có thể liên kết với ứng dụng. Việc này giúp ngăn chặn một ứng dụng lừa đảo liên kết với vì chỉ các ứng dụng hệ thống mới có thể được cấp quyền khung.

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à 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 là đượ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, bạn vẫn có thể khai báo khung này như một tính năng của ImsService.

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

FEATURE_MMTEL

ImsService triển khai tính năng MMTEL của IMS, trong đó có hỗ trợ cho tất cả phương tiện IMS (thông số kỹ thuật IR.92 và IR.94) ngoại trừ đính kèm trong trường hợp khẩn cấp PDN của IMS để thực hiện cuộc gọi khẩn cấp. Mọi cách triển khai ImsService muốn Các tính năng MMTEL sẽ mở rộng lớp cơ sở android.telephony.ims.MmTelFeature và trả về một giá trị tuỳ chỉnh Cách triển khai MmTelFeature 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 mà khẩn cấp đính kèm với Dịch vụ PDN của IMS cho dịch vụ khẩn cấp có thể được cung cấp. Nếu tính năng này không được khai báo cho ImsService của mình, thì nền tảng sẽ luôn mặc định là Chuyển mạch dự phòng cho các dịch vụ khẩn cấp. Bạn phải xác định tính năng FEATURE_MMTEL cho thuộc tính này tính năng được xác định.

FEATURE_RCS

ImsService API không triển khai bất kỳ tính năng RCS nào, nhưng Lớp cơ sở android.telephony.ims.RcsFeature vẫn có thể hữu ích. Khung tự động liên kết với ImsService và gọi ImsService#createRcsFeature khi phát hiện thấy gói đó cung cấp RCS. Nếu thẻ SIM được liên kết khi dịch vụ RCS bị xoá, khung sẽ tự động gọi RcsFeature#onFeatureRemoved, sau đó sẽ 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ể xóa một số logic phát hiện hoặc liên kết mà tính năng RCS đáng lẽ sẽ 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à nó hỗ trợ bằng cách sử dụng API ImsService#querySupportedImsFeatures. Sau khung này sẽ tính toán những tính năng mà ImsService sẽ hỗ trợ, ImsService#create[...]Feature cho mỗi tính năng mà ImsService chịu trách nhiệm. Nếu 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ợ. Xem biểu đồ sau để biết thêm thông tin về việc khởi chạy và liên kết ImsService.

Khởi tạo 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 để liên kết (an toàn) với ImsService khi phù hợp. Có 2 loại ImsServices mà khung liên kết với:

  1. Nhà mạng "ghi đè" ImsService: Những ImsServices này được tải trước lên nhưng được gắn với một hoặc nhiều nhà cung cấp dịch vụ di động và sẽ chỉ được liên kết khi lắp thẻ SIM phù hợp. Trình điều khiển này được định cấu hình bằng cách sử dụng
  2. Thiết bị "mặc định" ImsService: Đây là ImsService mặc định được tải trên thiết bị của OEM (Nhà sản xuất thiết bị gốc) và phải được thiết kế để cung cấp dịch vụ IMS theo tất cả các trường hợp khi nhà cung cấp dịch vụ không có ImsService và hữu ích trong trong trường hợp thiết bị không lắp thẻ SIM hoặc có thẻ SIM đã chèn không có nhà cung cấp dịch vụ ImsService được cài đặt cùng. Đây là đượ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ợ những ứng dụng sử dụng ImsService có thể tải xuống của bên thứ ba nên mọi cách triển khai ImsService được xác định ở đây là phải là Ứng dụng hệ thống và phải nằm trong /system/feat-app/ hoặc /product/priv-app/ để cấp các quyền thích hợp (cụ thể là điện thoại, quyền truy cập vào 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 khớp với ProviderConfig hoặc thiết bị giá trị lớp phủ được xác định ở trên, thì chỉ những ứng dụng đáng tin cậy, được cài đặt sẵn mới bị 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à chúng được định cấu hình là "ghi đè" nhà mạng ImsService hoặc "mặc định" của thiết bị Cấu hình ImsService 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) để bật hoặc tắt một cách linh động bằng cách sử dụng thông tin cập nhật ImsService#onUpdateSupportedImsFeatures. Việc này sẽ kích hoạt khung tính toán lại xem ImsServices nào bị ràng buộc và những tính năng mà các ImsServices 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ợ, ImsService sẽ không bị liên kết cho đến khi điện thoại khởi động lại hoặc 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 hỗ trợ liên kết với tất cả các ImsServices có thể có được tải trước trên thiết bị và sẽ liên kết với tối đa 2 ImsServices trên mỗi khe cắm SIM (một ImsService cho mỗi tính năng) theo thứ tự sau trên cơ sở từng tính năng:

  1. Tên gói ImsService được xác định bằng giá trị ProviderConfig config_ims_[mmtel/rcs]_package_override_string khi có thẻ SIM đã 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]_packagebao gồm cả trường hợp không có SIM đã lắp thẻ. 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 Cấu hình nhà mạng cho từng nhà mạng sẽ sử dụng gói đó hoặc trong nếu ImsService của bạn là mặc định, như đã xác định ở trên.

Hãy cùng phân tích điều này cho từng tính năng. Đối với một thiết bị (một hoặc nhiều SIM) khi nạp một thẻ SIM, có thể sử dụng hai tính năng của IMS: MMTel và RCS. Khung này sẽ cố gắng ràng buộc theo thứ tự đã xác định ở trên cho mỗi tính năng và nếu tính năng này không hoạt động đối với ImsService được xác định trong Nhà mạng Ghi đè cấu hình, khung sẽ trở về phương án dự phòng cho ImsService mặc định của bạn. Ví dụ: bảng dưới đây mô tả tính năng IMS nào mà khung sẽ sử dụng ba ứng dụng IMS nhất định triển khai ImsServices được cài đặt trên một hệ thống với các tính năng sau:

  • Nhà mạng A ImsService hỗ trợ RCS
  • Nhà mạng B ImsService hỗ trợ RCS và MMTel
  • ImsService của OEM 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 việc triển khai IMS không được bao gồm kể từ là rất lớn và sử dụng thiết bị xác minh đặc biệt. Chiến lược phát hành đĩa đơn 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 có 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ể 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 sử dụng thời gian ImsManager để lấy một bản sao của lớp ImsMmTelManager! ImsRcsManager! hoặc IMS cụ thể ProvisioningManager . Sau đó, ứng dụng có thể nghe 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 lâu dài, nhưng dịch vụ này giới hạn có thể thay đổi khi thẻ SIM mới hoặc gói thuê bao được nhúng 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 qua điện thoại, ứng dụng có thể gặp phải các ngoại lệ không lường trước được khi thử truy cập API IMS nếu ImsService vô hình gặp sự cố hoặc không bị ràng buộc 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, để giám sát liệu bản sao ImsService cho gói thuê bao đã liên kết có sẵn hoặc không khả dụng, ứng dụng có thể sử dụng ImsStateCallback . Khi nhận một thực thể của ImsMmTelManager hoặc ImsRcsManager, chúng ta đề xuất ứng dụng trước tiê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 trở lại hoạt động, ứng dụng phải huỷ đăng ký hoặc loại bỏ những dịch vụ hiện có các lệnh gọi lại đã đăng ký qua ImsMmTelManager, ImsRcsManager hoặc ProvisioningManager; và đă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 kèm theo 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 khả dụng cho của bạn.

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 thông tin cập nhật trên thực thể ImsStateCallback đã đăng ký. Để khôi phục sau điều kiện 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.