Android 9 cung cấp các API để hỗ trợ tốt hơn cho các ứng dụng gọi điện của bên thứ ba. Các ứng dụng gọi điện của bên thứ ba thường dựa vào Telephony API (API Điện thoại) như PHONE_STATEđể phát sóng cùng với các cuộc gọi điện thoại của nhà mạng. Do đó, các ứng dụng gọi điện của bên thứ ba phải ưu tiên các cuộc gọi qua nhà mạng và thường phải âm thầm từ chối cuộc gọi đến trong ứng dụng hoặc kết thúc cuộc gọi đang diễn ra để nhường chỗ cho cuộc gọi qua nhà mạng.
Các API trong Android 9 hỗ trợ các trường hợp gọi đồng thời giữa các ứng dụng bên thứ ba và các cuộc gọi qua nhà mạng. Ví dụ: điều này giúp bạn có thể nhận cuộc gọi đến của bên thứ ba trong khi đang thực hiện cuộc gọi qua nhà mạng. Khung này chịu trách nhiệm đảm bảo cuộc gọi qua nhà mạng được giữ lại khi người dùng tham gia cuộc gọi qua ứng dụng bên thứ ba.
Trong Android 9, các ứng dụng gọi điện của bên thứ ba nên triển khai lớp ConnectionService do chính ứng dụng đó quản lý. Để biết thêm thông tin về cách tạo ứng dụng gọi bằng lớp này, hãy xem phần Tạo ứng dụng gọi bằng thư viện Core-Telecom.
Lớp ConnectionService tự quản lý cũng mang đến cho nhà phát triển cơ hội chọn ghi lại các cuộc gọi trong ứng dụng của họ vào nhật ký cuộc gọi hệ thống (xem EXTRA_LOG_SELF_MANAGED_CALLS). Theo các yêu cầu trong Tài liệu định nghĩa về khả năng tương thích của Android (CDD) (mục 7.4.1.2), bạn phải đảm bảo rằng ứng dụng quay số hoặc ứng dụng điện thoại của bạn hiển thị các mục nhật ký cuộc gọi này và cho biết tên của ứng dụng gọi điện bên thứ ba nơi cuộc gọi bắt nguồn (để biết ví dụ về cách ứng dụng quay số AOSP đáp ứng yêu cầu này, hãy xem Các mục nhật ký cuộc gọi từ ứng dụng gọi điện bên thứ ba).
Các ứng dụng chịu trách nhiệm đặt CAPABILITY_SUPPORT_HOLD và CAPABILITY_HOLD trên các kết nối của ứng dụng. Tuy nhiên, có thể trong một số trường hợp, ứng dụng không giữ được cuộc gọi. Khung này có các quy định để giải quyết những loại trường hợp này.
Tình huống
Bạn nên sửa đổi ứng dụng quay số để xử lý các trường hợp sau.
Xử lý cuộc gọi đến làm ngắt kết nối cuộc gọi đang diễn ra
Trong trường hợp có cuộc gọi đang diễn ra của bên thứ ba (ví dụ: trong cuộc gọi SuperCaller) không hỗ trợ chế độ giữ cuộc gọi và người dùng nhận được cuộc gọi di động (ví dụ: sử dụng nhà mạng FooCom), ứng dụng Quay số hoặc Điện thoại của bạn phải cho người dùng biết rằng việc trả lời cuộc gọi di động sẽ kết thúc cuộc gọi đang diễn ra của bên thứ ba.
Trải nghiệm người dùng này rất quan trọng vì ứng dụng gọi điện của bên thứ ba có thể có một cuộc gọi đang diễn ra mà khung không thể giữ. Khi bạn trả lời một cuộc gọi mới trên thiết bị di động, cuộc gọi đang diễn ra với bên thứ ba sẽ bị ngắt kết nối.
Hãy xem giao diện người dùng trong hình minh hoạ để biết ví dụ:
Hình 1. Cuộc gọi đến ngắt cuộc gọi đang diễn ra với bên thứ ba.
Ứng dụng quay số có thể kiểm tra xem cuộc gọi đến có khiến một cuộc gọi khác bị ngắt kết nối hay không bằng cách kiểm tra phần bổ sung của cuộc gọi. Đảm bảo rằng EXTRA_ANSWERING_DROPS_FG_CALL được đặt thành TRUE và EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME được đặt thành tên của ứng dụng có cuộc gọi bị ngắt khi bạn trả lời cuộc gọi đến trên thiết bị di động.
Nhật ký cuộc gọi của các ứng dụng gọi điện bên thứ ba
Nhà phát triển ứng dụng gọi điện của bên thứ ba có thể chọn ghi nhật ký cuộc gọi trong ứng dụng của họ vào nhật ký cuộc gọi của hệ thống (xem EXTRA_LOG_SELF_MANAGED_CALLS). Điều này có nghĩa là có thể có các mục trong nhật ký cuộc gọi không phải là cuộc gọi qua mạng di động.
Khi ứng dụng quay số AOSP hiển thị các mục nhật ký cuộc gọi liên quan đến một ứng dụng gọi điện bên thứ ba, tên của ứng dụng nơi diễn ra cuộc gọi sẽ xuất hiện trong nhật ký cuộc gọi, như minh hoạ trong hình:
Hình 2. Mục nhập nhật ký cuộc gọi có tên của ứng dụng gọi điện bên thứ ba trên ứng dụng quay số.
Để xác định tên của một ứng dụng được liên kết với một mục nhập nhật ký cuộc gọi, hãy sử dụng các cột PHONE_ACCOUNT_COMPONENT_NAME và PHONE_ACCOUNT_ID trong trình cung cấp nhật ký cuộc gọi để tạo một thực thể của PhoneAccountHandle, xác định nguồn của một mục nhập nhật ký cuộc gọi. Truy vấn TelecomManager để nhận thông tin chi tiết cho lớp PhoneAccount. Để xác định xem một mục nhập nhật ký cuộc gọi có phải là của một ứng dụng gọi điện bên thứ ba hay không, hãy kiểm tra các chức năng PhoneAccount để xem CAPABILITY_SELF_MANAGED có được đặt hay không.
Phương thức getLabel của PhoneAccount được trả về sẽ trả về tên của ứng dụng được liên kết với một mục nhập nhật ký cuộc gọi từ ứng dụng gọi điện của bên thứ ba.
Các chế độ kiểm soát tích hợp nhật ký cuộc gọi VoIP
Kể từ Android 17 (cấp độ API 37), các ứng dụng gọi qua VoIP của bên thứ ba tích hợp với Core-Telecom và CallsManager có thể ghi nhật ký cuộc gọi trực tiếp vào nhật ký cuộc gọi của hệ thống Android gốc (CallLog.Calls).
Để đảm bảo quyền riêng tư của người dùng và làm sạch dữ liệu trên hệ sinh thái Android, tất cả thiết bị Android 17 (cấp độ API 37) trở lên khai báo cờ tính năng viễn thông (android.software.telecom) và có vai trò android.app.role.DIALER đều phải hỗ trợ các chế độ kiểm soát tích hợp nhật ký cuộc gọi VoIP cho từng ứng dụng theo Tài liệu định nghĩa về khả năng tương thích (CDD) của Android.
Yêu cầu về việc triển khai thiết bị
Thiết bị phải cung cấp màn hình Cài đặt mà người dùng có thể truy cập (thường nằm trong phần Cài đặt > Tài khoản gọi > Nhật ký cuộc gọi tích hợp) để cho phép người dùng xem và bật/tắt tính năng tích hợp nhật ký cuộc gọi cho từng ứng dụng VoIP bên thứ ba.
Để đáp ứng yêu cầu này, bạn phải tích hợp nền tảng mặc định về kho hàng:
- Tích hợp chế độ cài đặt nền tảng: Đảm bảo thiết bị của bạn có
com.android.phone.settings.PhoneAccountSettingsActivitydo nền tảng Android cung cấp ngay khi xuất xưởng (com.android.phone). - Yêu cầu về độ phân giải ý định: Thiết bị của bạn phải phân giải ý định
TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION(android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) thành màn hình quản lý nền tảng cổ phiếu.
Khi một ứng dụng, lời nhắc của hệ thống hoặc đường liên kết sâu gọi những nội dung sau, ý định phải khởi chạy thành công PhoneAccountSettingsActivity và không được gửi ActivityNotFoundException:
Intent intent = new Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION);
context.startActivity(intent);
Xác nhận kết quả
Để kiểm thử xem thiết bị của bạn có hỗ trợ các ứng dụng gọi điện của bên thứ ba hay không, hãy dùng ứng dụng kiểm thử Telecomm. Ứng dụng này triển khai lớp ConnectionService tự quản lý. Ứng dụng này nằm trong /packages/services/Telecomm/testapps/.
Tạo ứng dụng kiểm thử từ gốc của kho lưu trữ nguồn Android bằng cách sử dụng:
mmma packages/services/Telecomm/testapps/Cài đặt apk bản dựng bằng
adb install -g -r <apk path>. Sau đó, biểu tượng Mẫu tự quản lý sẽ được thêm vào trình chạy của bạn.Nhấn vào biểu tượng để mở ứng dụng kiểm thử.
Xử lý cuộc gọi đến làm ngắt kết nối cuộc gọi đang diễn ra
Làm theo các bước sau để xác minh rằng cuộc gọi đến sẽ ngắt cuộc gọi đang diễn ra của bên thứ ba.
Hình 3. Kiểm thử ứng dụng bằng các cách triển khai mẫu của lớp ConnectionService.
- Xoá lựa chọn Holdable.
- Nhấn vào CUỘC GỌI ĐI để bắt đầu một cuộc gọi đi mẫu mới.
- Nhấn vào nút ĐANG DIỄN RA để chuyển cuộc gọi sang trạng thái đang diễn ra.
- Gọi đến số điện thoại của thiết bị đang thử nghiệm bằng một điện thoại khác. Thao tác này sẽ kích hoạt trường hợp mà trình quay số của bạn được cung cấp tên của một ứng dụng, ứng dụng này sẽ bị ngắt cuộc gọi.
- Khi bạn hoàn tất, hãy nhấn vào nút DISCONNECT (NGẮT KẾT NỐI) trong ứng dụng kiểm thử.
Nhật ký cuộc gọi của các ứng dụng gọi điện bên thứ ba
Sau khi hoàn tất các bước trên, ứng dụng kiểm thử sẽ ghi lại một lệnh gọi vào nhật ký cuộc gọi hệ thống. Để xác nhận rằng thiết bị ghi nhật ký cuộc gọi từ các ứng dụng gọi điện bên thứ ba, hãy mở ứng dụng quay số và xác nhận cuộc gọi xuất hiện trong nhật ký cuộc gọi hệ thống.
Các chế độ kiểm soát tích hợp nhật ký cuộc gọi VoIP
Để xác minh việc tuân thủ yêu cầu về ý định tích hợp nhật ký cuộc gọi VoIP trên Android 17 trở lên, hãy chạy bài kiểm thử CtsTelecomTestCases Bộ kiểm tra tính tương thích (CTS). Bài kiểm thử này xác minh trên các ranh giới gói rằng việc gửi TelecomManager#ACTION_CONFIGURE_CALL_LOG_INTEGRATION(android.telecom.action.CONFIGURE_CALL_LOG_INTEGRATION) sẽ phân giải trên thiết bị thành một trình xử lý hoạt động được xuất hợp lệ (resolveActivity kiểm tra).