Các ứng dụng VoIP có thể tích hợp cuộc gọi của mình vào nhật ký cuộc gọi của hệ thống. Nhờ đó, người dùng có thể xem nhật ký cuộc gọi VoIP tập trung trong ứng dụng quay số hệ thống và trả lời cuộc gọi trực tiếp từ ứng dụng quay số. Hướng dẫn này mô tả những thay đổi bắt buộc đối với ứng dụng gọi VoIP và ứng dụng quay số hệ thống.
Các thay đổi đối với ứng dụng gọi điện
Để tích hợp ứng dụng VoIP với nhật ký cuộc gọi của hệ thống, hãy làm theo các bước sau.
Đăng ký bộ lọc ý định gọi lại
Đăng ký ý định được hệ thống bảo vệ TelecomManager.ACTION_CALL_BACK.
Sau khi bộ lọc ý định này được đăng ký đúng cách, mọi cuộc gọi mà ứng dụng của bạn thêm bằng cách sử dụng CallsManager.addCall hoặc các API Telecom liên quan khác sẽ được hệ thống tự động ghi lại. Sau đó, hệ thống sẽ dùng ý định đã đăng ký này để gửi một lệnh gọi lại đến ứng dụng của bạn khi người dùng chọn một mục nhật ký cuộc gọi VoIP trong trình quay số để gọi lại.
<!-- Activity to handle the callback intent from the system dialer --> <activity android:name=".VoipCallActivity" android:exported="true"> <!-- Register callback intent --> <intent-filter> <action android:name="android.telecom.action.CALL_BACK" /> </intent-filter> </activity>
Loại trừ tính năng ghi nhật ký cuộc gọi
Sau khi lệnh gọi lại được đăng ký, tất cả các cuộc gọi sẽ được ghi vào nhật ký của trình quay số hệ thống. Để loại trừ các lệnh gọi trên cơ sở từng lệnh gọi, hãy đặt giá trị boolean isLogExcluded thành true trong CallAttributesCompat.
CallAttributesCompat( displayName = displayName, address = address, isLogExcluded = excludeCallLogging, // to exclude call from logging direction = if (isIncoming) { CallAttributesCompat.DIRECTION_INCOMING } else { CallAttributesCompat.DIRECTION_OUTGOING }, callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL, callCapabilities = ( CallAttributesCompat.SUPPORTS_SET_INACTIVE or CallAttributesCompat.SUPPORTS_STREAM or CallAttributesCompat.SUPPORTS_TRANSFER ), )
Xử lý lệnh gọi lại
Các cuộc gọi được thêm thông qua CallsManager.addCall sẽ nhận được một UUID duy nhất thông qua CallControlScope.getCallId.
// check the intent action for CALL_BACK if (intent.action == TelecomManager.ACTION_CALL_BACK) { launchCall( // fetching stored call details for the UUID to initiate callback callDetails = getCallDetails( uuid = intent.getStringExtra(TelecomManager.EXTRA_UUID) ) ) }
Xác minh các mục trong nhật ký cuộc gọi
Nhật ký cuộc gọi của hệ thống duy trì một số lượng mục hữu hạn và cuối cùng sẽ xoá các bản ghi cuộc gọi cũ. Vì ứng dụng lưu trữ một mối liên kết giữa các UUID với thông tin chi tiết về lệnh gọi để xử lý lệnh gọi lại, nên ứng dụng phải định kỳ kiểm tra xem những UUID nào vẫn còn trong nhật ký cuộc gọi hệ thống. Nếu UUID không còn trong nhật ký hệ thống, thì người dùng không thể bắt đầu lệnh gọi lại cho lệnh gọi đó và ứng dụng có thể xoá an toàn mối liên kết khỏi bộ nhớ cục bộ. Việc này giúp tối ưu hoá bộ nhớ.
Để lấy danh sách hiện tại gồm các UUID được phân bổ cho ứng dụng trong nhật ký hệ thống, hãy dùng CallLog.Calls.CONTENT_VOIP_URI.
Các thay đổi đối với ứng dụng quay số
Hãy làm theo các bước sau để cho phép ứng dụng quay số hiển thị nhật ký cuộc gọi VoIP và bắt đầu gọi lại cho các ứng dụng VoIP.
Hiển thị nhật ký cuộc gọi VoIP trong ứng dụng quay số
Theo mặc định, nhật ký cuộc gọi của ứng dụng VoIP không xuất hiện trong ứng dụng quay số. Để hiển thị nhật ký cuộc gọi tích hợp trong ứng dụng quay số, hãy làm như sau:
Trên Android 16.1 (cấp độ API 36.1), hãy thêm tham số truy vấn
include_voip_callsvào trình cung cấp nội dungCallLog.Callsđể hiển thị nhật ký cuộc gọi VoIP:CallLog.Calls.CONTENT_URI.buildUpon() .appendQueryParameter("include_voip_calls", "true") .build()
Trên Android 17 (cấp độ API 37) trở lên, hãy sử dụng trình cung cấp nội dung và khoá tham số chính thức hoá sau:
Bắt đầu lệnh gọi lại từ ứng dụng quay số
Để bắt đầu một lệnh gọi lại từ trình quay số, hãy sử dụng TelecomManager.placeCall. Nền tảng này sử dụng CallLog.Calls._ID duy nhất của mục nhập nhật ký cuộc gọi để khởi chạy ứng dụng VoIP phù hợp. Lần khởi chạy này bao gồm một ý định TelecomManager.ACTION_CALL_BACK, đây là một thao tác do hệ thống xác định để bắt đầu cuộc gọi lại. Ý định này chứa UUID của cuộc gọi trong phần bổ sung ý định TelecomManager.EXTRA_UUID, cho phép ứng dụng VoIP xác định cuộc gọi cụ thể nào đang được gọi lại.
// Uri generated with unique ID of the call log entry to launch the respective VoIP app for callback val address = ContentUris.withAppendedId(CallLog.Calls.CONTENT_URI, callId) // extra information required to initiate callback val extras = Bundle() telecomManager.placeCall(address, extras)