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.
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ácandroid.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ởitelephony
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ếp và Mã 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ềnBIND_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.
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:
- 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
config_ims_mmtel_package_override_string
Khoá providerConfig để triển khai các tính năng MMTEL của ImsServices.config_ims_rcs_package_override_string
cho ImsServices triển khai các tính năng RCS.
- 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:
config_ims_mmtel_package
: Triển khai các tính năng MMTELconfig_ims_rcs_package
: Triển khai các tính năng RCS
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:
- 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. - 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ó 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
.