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à một giao diện được xác định rõ ràng giữa nền tảng Android và việc triển khai IMS do nhà cung cấp hoặc nhà cung cấp dịch vụ cung cấp.
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 tính năng gọi thoại và video. API ImsService cũng là một API hệ thống Android, có 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 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 tại / testapps / ImsTestService .
Bạn có thể tìm thấy tài liệu cho API ImsService trong ImsService và trong các lớp khác trong API.
Thực hiện
API ImsService là một 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 nó được giảm tải một phần hoặc toàn bộ cho modem. Android 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 mọi quá trình giảm tải phải xảy ra bằng cách sử dụng phần 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, 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 giao diện AIDL cũ hơn và các lớp trình bao bọc đã được chuyển đến 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ững việc sau để tiếp tục hỗ trợ API cũ hơn.
- Thay đổi không gian tên của 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 độngandroid.telephony.ims.ImsService
.
Sau đó, khung công tác 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 việc triển khai ImsService
cũ.
Đăng ký ImsService với khuôn khổ
API ImsService được triển khai như một dịch vụ mà khung công tác Android liên kết với để giao tiếp với việc triển khai IMS. Ba bước là cần thiết để đăng ký một ứng dụng triển khai ImsService với khuôn khổ. Đầ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 các tính năng IMS 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 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 khuôn khổ 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 cho hoạt động chính xác:
-
directBootAware="true"
: Cho phép dịch vụ được phát hiện và chạy bằngtelephony
trước khi người dùng mở khóa thiết bị. Dịch vụ không thể truy cập bộ nhớ đượ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ếp và Mã 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ị giết bởi hệ thống để 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. - allow
permission="android.permission.BIND_IMS_SERVICE"
: Đảm bảo rằng chỉ quy trình đã được cấp quyềnBIND_IMS_SERVICE
mới có thể liên kết với ứng dụng. Điều này ngăn không cho một ứng dụng giả mạo ràng buộc với dịch vụ, vì chỉ các ứng dụng hệ thống mới có thể được cấp quyền bởi khuôn khổ.
Dịch vụ cũng phải chỉ định phần tử intent-filter
với hành động android.telephony.ims.ImsService
. Điều này cho phép khung công tác tìm thấy ImsService
.
Đặc điểm kỹ thuật của 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 các 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. Mặc dù không có API RCS nào được tích hợp vào khuôn khổ, nhưng vẫn có 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 định nghĩa trong android.telephony.ims.ImsFeature
mà ImsService có thể cung cấp, 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 mỗi tính năng được xác định, trang này 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 mỗi khe cắm SIM.
FEATURE_MMTEL
ImsService
triển khai tính năng IMS MMTEL, hỗ trợ cho tất cả các phương tiện IMS (thông số kỹ thuật IR.92 và IR.94) ngoại trừ phần đính kèm khẩn cấp với IMS PDN để gọi khẩn cấp. Bất kỳ triển khai nào của ImsService
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ể đính kèm 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, nền tảng sẽ luôn mặc định là Dự phòng chuyển mạch mạch 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. Khuôn khổ tự động liên kết với ImsService và gọi ImsService#createRcsFeature
khi nó phát hiện ra rằng gói cần cung cấp RCS. Nếu thẻ SIM được liên kết với dịch vụ RCS bị xóa, khung sẽ tự động gọi RcsFeature#onFeatureRemoved
và sau đó 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 phát hiện / ràng buộc tùy chỉnh mà tính năng RCS nếu không sẽ phải cung cấp.
Đăng ký các tính năng được hỗ trợ
Đầu 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 khuôn khổ tính toán các tính năng mà ImsService sẽ hỗ trợ, nó sẽ gọi ImsService#create[...]Feature
cho mỗi 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 khuôn khổ 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.
Hình 2: Khởi tạo và liên kết ImsService
Khung phát hiện và xác minh việc 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 (an toàn) với ImsService khi thích hợp. Có hai loại ImsServices mà khuôn khổ liên kết với:
- Nhà cung cấp dịch vụ "ghi đè" ImsService: Các ImsService này được tải trước vào thiết bị 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ỉ bị ràng buộc khi lắp thẻ SIM phù hợp. Điều này được định cấu hình bằng cách sử dụng
-
config_ims_mmtel_package_override_string
Phím CarrierConfig cho ImsServices triển khai các tính năng MMTEL. -
config_ims_rcs_package_override_string
cho ImsServices triển khai các tính năng RCS.
-
- 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 nhà cung cấp dịch vụ ImsService không khả dụng và hữu ích trong trường hợp thiết bị không có thẻ SIM được lắp hoặc thẻ SIM được lắp không được cài đặt ImsService của nhà cung cấp dịch vụ. Đ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:
-
config_ims_mmtel_package
: Triển khai các tính năng MMTEL -
config_ims_rcs_package
: Triển khai các tính năng RCS
-
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 bất kỳ triển khai ImsService nào được xác định ở đây bắt buộc 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 quyền (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 việc triển khai IMS có khớp với CarrierConfig hoặc cá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 sẵn mới bị ràng buộc.
Tùy biến
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àm nhà cung cấp dịch vụ "ghi đè" ImsService hoặc các cấu hình 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) 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 khuôn khổ để tính toán lại ImsServices nào bị ràng buộc và chúng hỗ trợ các tính năng nào. 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ị ràng buộc 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 ràng buộc cho nhiều ImsService
Khuôn khổ 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 hai 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:
- Tên gói ImsService được xác định bởi giá trị
config_ims_[mmtel/rcs]_package_override_string
khi có thẻ SIM được lắp vào. - 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 mỗi 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ư đã định nghĩa ở 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 không khả dụng cho ImsService được xác định trong ghi đè Cấu hình nhà cung cấp, thì khung sẽ dự phòng cho 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à khuôn khổ sẽ sử dụng với ba ứng dụng IMS triển khai ImsServices đượ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
- Carrier 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 |
---|---|---|
Nhà cung cấp dịch vụ A | Nhà cung cấp dịch vụ A | OEM |
Nhà cung cấp dịch vụ B | Nhà cung cấp dịch vụ B | Nhà cung cấp dịch vụ B |
Không có sim | OEM | OEM |
Thẩm định
Bản thân các công cụ để xác minh việc triển khai IMS không được bao gồm vì các thông số kỹ thuật của IMS rất lớn và sử dụng thiết bị xác minh đặc biệt. Các bài kiểm tra chỉ có thể xác minh rằng khung điện thoại đáp ứng đúng với API ImsService.
Phát triển ứng dụng IMS
Khi phát triển một ứng dụng IMS giao diện với ngăn xếp đ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 một phiên bản của lớp ImsMmTelManager
, ImsRcsManager
hoặc 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 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 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 mới hoặc đăng ký nhúng 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 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 các API IMS nếu ImsService vô hình gặp sự cố hoặc không được gắ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ý được liên kết có sẵn 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
, chúng tôi khuyên ứng dụng trước tiên nên đăng ký 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ập nhật 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 hủy các lệnh gọi lại hiện có đã đăng ký thông qua ImsMmTelManager
, ImsRcsManager
hoặc ProvisioningManager
; và đăng ký các cuộc gọi lại mới.
Nếu có một gói đăng ký 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à ImsService và các API liên quan đến IMS không có sẵn cho đăng ký.
Trong trường hợp không chắc rằng quá trình điện thoại gặp sự cố, ứng dụng nhận được ImsStateCallback#onError
và không còn nhận được cập nhật trên phiên bản ImsStateCallback
đã đăng ký. Để khôi phục điều kiện này, hãy đăng ký lại phiên bản ImsStateCallback
cho đăng ký được liên kết bằng cách gọi ImsMmTelManager#registerImsStateCallback
hoặc ImsRcsManager#registerImsStateCallback
.