Hỗ trợ ứng dụng gọi điện của bên thứ ba

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 các API Điện thoại như thông báo PHONE_STATE để cùng tồn tại 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 các cuộc gọi đến trong ứng dụng hoặc kết thúc một 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 ứng dụng bên thứ ba và cuộc gọi của 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 của nhà mạng được giữ lại khi người dùng tham gia cuộc gọi của 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 API ConnectionService tự quản lý. Để biết thêm thông tin về cách tạo ứng dụng gọi điện bằng API này, hãy xem phần Tạo ứng dụng gọi điện.

API ConnectionService tự quản lý cũng cho phép nhà phát triển 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 của 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 ứ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 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 bên thứ ba).

Các ứng dụng chịu trách nhiệm thiết lập CAPABILITY_SUPPORT_HOLDCAPABILITY_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 thể giữ 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 qua 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ụ:

Cuộc gọi đến ngắt cuộc gọi đang diễn ra với bên thứ ba

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ủa bạn 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 TRUEEXTRA_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 di động đến.

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

Mục nhật ký cuộc gọi có ứng dụng gọi của bên thứ ba

Hình 2. Mục nhật ký cuộc gọi có tên của ứng dụng gọi 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ật ký cuộc gọi, hãy sử dụng các cột PHONE_ACCOUNT_COMPONENT_NAMEPHONE_ACCOUNT_ID trong trình cung cấp nhật ký cuộc gọi để tạo một phiên bản của PhoneAccountHandle. Thao tác này sẽ xác định nguồn của một mục nhật ký cuộc gọi. Truy vấn TelecomManager để biết thông tin chi tiết về PhoneAccount.
Để xác định xem một mục trong nhật ký cuộc gọi có phải là của ứng dụng gọi 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ật ký cuộc gọi từ ứng dụng gọi điện của bên thứ ba.

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 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 API ConnectionService tự quản lý. Ứng dụng này nằm trong /packages/services/Telecomm/testapps/.

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

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

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

Ứng dụng kiểm thử cho các ứng dụng gọi điện của bên thứ ba

Hình 3. Kiểm thử ứng dụng bằng các mẫu triển khai ConnectionService API.

  1. Bỏ chọn mục Holdable (Có thể giữ).
  2. Nhấn vào CUỘC GỌI ĐI để bắt đầu một cuộc gọi đi mẫu mới.
  3. 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.
  4. 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.
  5. 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ý các cuộc gọi từ ứng dụng gọi điện của bên thứ ba, hãy mở ứng dụng quay số và xác nhận rằng cuộc gọi xuất hiện trong nhật ký cuộc gọi hệ thống.