Nhật ký cuộc gọi hợp nhất

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ứ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_calls vào trình cung cấp nội dung CallLog.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)