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 đa phương tiện IP (IMS). API ImsService là giao diện được xác định rõ ràng giữa nền tảng Android và triển khai IMS do nhà cung cấp hoặc nhà cung cấp dịch vụ 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à API hệ thống Android, nghĩa là nó có thể được xây dựng dựa trên SDK Android trực tiếp thay vì dựa trên nguồn. Ứng dụng IMS đã được cài đặt sẵn trên thiết bị cũng có thể được định cấu hình để có thể cập nhật Play Store.

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

Thực hiện

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

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

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

  • 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 lọc ý định android.telephony.ims.compat.ImsService , thay vì hành động 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 cách triển khai ImsService cũ.

Đăng ký ImsService với framework

API ImsService được triển khai dưới dạng dịch vụ mà khung Android liên kết để giao tiếp với quá trình triển khai IMS. Cần có ba bước để đăng ký một ứng dụng triển khai ImsService với khung. Đầu 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, nó phải xác định tính năng IMS nào đượ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 cấu hình nhà cung cấp dịch vụ 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 bằng đị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 để hoạt động chính xác:

  • directBootAware="true" : Cho phép phát hiện và chạy dịch vụ bằng telephony trước khi người dùng mở khóa thiết bị. Dịch vụ không thể truy cập vào bộ lưu trữ được mã hóa của thiết bị trước khi người dùng mở khóa thiết bị. Để biết thêm thông tin, hãy xem Hỗ trợ chế độ Khởi động trực tiếpMã hóa 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 giết để lấy lại bộ nhớ. Thuộc tính này CHỈ hoạt động nếu ứng dụng được xây dựng 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 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ụ cũng phải chỉ định phần tử intent-filter bằng hành động android.telephony.ims.ImsService . Điều này cho phép khung tìm thấy ImsService .

Đặc tả 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 nào nó hỗ trợ. Android hiện hỗ trợ các tính năng MmTel và RCS, tuy nhiên chỉ 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 nhưng vẫn có những lợi thế khi khai báo nó 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 mà ImsService có thể cung cấp, đồng thời giải thích và ví dụ về lý do tại sao ứ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ẽ phác thảo 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, hỗ trợ tất cả phương tiện IMS (thông số kỹ thuật IR.92 và IR.94) ngoại trừ kết nối khẩn cấp với IMS PDN để gọi khẩn cấp. Bất kỳ triển khai ImsService nào muốn hỗ trợ các tính năng MMTEL phải mở rộng lớp cơ sở android.telephony.ims.MmTelFeature và trả về triển khai MmTelFeature tùy 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ể kết nối khẩn cấp với IMS PDN cho các dịch vụ khẩn cấp. Nếu tính năng này không được khai báo cho ImsService của bạn 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. Tính năng FEATURE_MMTEL phải được xác định để tính năng này được xác định.

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 thấy gói cần cung cấp RCS. Nếu thẻ SIM liên kết với dịch vụ RCS bị xóa, khung sẽ tự động gọi RcsFeature#onFeatureRemoved rồi xóa ImsService liên kết với tính năng RCS. Chức năng này có thể loại bỏ một số logic liên kết/phát hiện tùy chỉnh mà tính năng RCS lẽ ra 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 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 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ể sử dụng ImsService#onUpdateSupportedImsFeatures để báo hiệu khung tính toán lại các tính năng được hỗ trợ. Xem sơ đồ bên dưới để biết thêm thông tin về việc khởi tạo và ràng buộc ImsService.

Khởi tạo và ràng buộc ImsService

Hình 2: Khởi tạo và liên kết ImsService

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

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 (một cách an toàn) với ImsService khi thích hợp. Có hai loại ImsServices mà khung liên kết với:

  1. Nhà cung cấp dịch vụ "ghi đè" ImsService: Các ImsService này được tải sẵn trên thiết bị nhưng được gắn vào một hoặc nhiều nhà cung cấp dịch vụ di động và sẽ chỉ bị ràng buộc khi lắp thẻ SIM phù hợp. Điều này được 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 được OEM tải vào thiết bị và phải được thiết kế để cung cấp dịch vụ IMS trong mọi tình huống khi không có nhà cung cấp dịch vụ ImsService và hữu ích trong trường hợp thiết bị không có thẻ SIM đã lắp vào hoặc thẻ SIM đã lắp chưa được cài đặt 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ó triển khai ImsService có thể tải xuống của bên thứ ba, vì vậy mọi 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 quyền thích hợp quyền (cụ thể là quyền về đ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 triển khai IMS có khớp với các giá trị lớp phủ CarrierConfig hoặc thiết bị được xác định ở trên hay không, chỉ những ứng dụng được cài đặt sẵn, đáng tin cậy mới bị ràng buộc.

Tùy chỉnh

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

Ưu tiên liên kết cho nhiều ImsService

Khung không thể hỗ trợ liên kết với tất cả các ImsService có thể được tải sẵn trên thiết bị và sẽ liên kết với tối đa hai ImsService trên mỗi khe 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ởi giá trị CarrierConfig 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 lắp thẻ SIM. 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 ImsService của mình trong CarrierConfig cho từng nhà cung cấp dịch vụ sẽ sử dụng gói đó hoặc trong lớp phủ thiết bị nếu ImsService của bạn là mặc định, như được xác định ở trên.

Hãy chia nhỏ đ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) được nạp một thẻ SIM, 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 này không có sẵn cho ImsService được xác định trong ghi đè Cấu hình nhà cung cấp, thì khung sẽ chuyển về ImsService mặc định của bạn. Vì vậy, ví dụ: bảng bên dưới mô tả tính năng IMS nào mà khung sẽ sử dụng dựa trên ba ứng dụng IMS triển khai ImsService được cài đặt trên hệ thống có các tính năng sau:

  • Nhà cung cấp dịch vụ ImsService hỗ trợ RCS
  • Nhà cung cấp B ImsService 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
Hãng vận chuyển A Hãng vận chuyển A OEM
Hãng vận tải B Hãng vận tải B Hãng vận chuyển B
Không có sim OEM OEM

Thẩm định

Các công cụ để xác minh việc triển khai IMS không được bao gồm do các 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 cuộc kiểm tra 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 ứng dụng IMS có giao diện với dãy điện thoại Android, chúng tôi khuyên 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 phiên bản ImsService được đính kèm cho đăng ký nhà cung cấp dịch vụ 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 phiên bản của lớp ImsMmTelManager , ImsRcsManager hoặc lớp ProvisioningManager dành riêng cho IMS. Sau đó, ứng dụng có thể lắng nghe các trạng thái cung cấ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à khả dụng
  • Cập nhật khi trạng thái đăng ký IMS thay đổi
  • Trạng thái cung cấp các tính năng IMS
  • Các tính năng IMS người dùng đã kích hoạt

Sử dụng ImsStateCallback

Mặc dù ImsService là dịch vụ bị ràng buộc liên tục nhưng dịch vụ bị ràng buộc có thể thay đổi khi thẻ SIM hoặc đăng ký nhúng mới hoạt động hoặc khi cấu hình nhà cung cấp dịch vụ 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 ngoại lệ không lường trước được khi cố gắng truy cập API IMS nếu ImsService vô tình gặp sự cố hoặc không được liên kết do đăng ký hoặc thay đổi 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 đăng ký liên kết có sẵn hay không, ứng dụng có thể sử dụng lớp ImsStateCallback . Khi nhận được phiên bản của ImsMmTelManager hoặc ImsRcsManager , trước tiên, ứng dụng 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 được thông tin cập nhật về lệnh gọi lại cho các đăng ký cụ thể khi ImsService khả dụng trở lại, ứng dụng phải hủy đă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 ; và đăng ký cuộc gọi lại mới.

Nếu có đăng ký 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 đăng ký.

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 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 đăng ký liên quan bằng cách gọi ImsMmTelManager#registerImsStateCallback hoặc ImsRcsManager#registerImsStateCallback .