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 trình quay số hệ thống và trả lời cuộc gọi trực tiếp từ ứng dụng trình 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 trình quay số hệ thống và việc quản lý chế độ cài đặt nhật ký cuộc gọi hợp nhất.
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 lệnh gọi mà ứng dụng của bạn thêm bằng CallsManager.addCall hoặc các API Telecom liên quan khác sẽ được hệ thống tự động ghi lại. Hệ thống sử dụng ý định đã đăng ký này để sau đó 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ừ nhật ký cuộc gọi
Sau khi lệnh gọi lại được đăng ký, tất cả cuộc gọi sẽ được ghi vào 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 bản ánh xạ của các UUID để gọi thông tin chi tiết cho việc 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ộ. Phương pháp 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 sử 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 đây:
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ậ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)
Quản lý chế độ cài đặt nhật ký cuộc gọi hợp nhất
Kể từ Android 17 (cấp độ API 37), người dùng có thể xem và bật/tắt nhật ký cuộc gọi hợp nhất theo từng ứng dụng trong phần cài đặt hệ thống (thường là trong phần Cài đặt > Tài khoản gọi điện > Nhật ký cuộc gọi tích hợp hoặc ngay trong ứng dụng trình quay số mặc định). Cả ứng dụng gọi điện của bên thứ ba và ứng dụng quay số đều có thể tương tác với các chế độ cài đặt này.
Chuyển người dùng đến phần cài đặt
Để mở chế độ cài đặt nhật ký cuộc gọi hợp nhất, hãy bắt đầu một hoạt động bằng thao tác theo ý định TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION:
val intent = Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION) startActivity(intent)
Khi người dùng tắt nhật ký cuộc gọi hợp nhất cho một ứng dụng trong phần cài đặt hệ thống, hệ thống sẽ xoá ngay lập tức và vĩnh viễn tất cả các mục nhật ký cuộc gọi hiện có cho gói đó khỏi trình cung cấp nhật ký cuộc gọi gốc (CallLog.Calls). Các cuộc gọi trong tương lai do ứng dụng đó thực hiện hoặc nhận sẽ không được ghi lại trong trình quay số hệ thống.
Lắng nghe các thay đổi về lựa chọn ưu tiên
Để duy trì trạng thái đồng bộ hoá khi người dùng bật hoặc tắt nhật ký cuộc gọi hợp nhất cho ứng dụng gọi của bạn trong phần cài đặt hệ thống hoặc trình quay số, hãy đăng ký một bộ nhận tín hiệu truyền tin cho ý định truyền tin TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE (android.telecom.action.VOIP_CALL_LOG_PREFERENCE):
val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE) { // Status of the Unified Call History of the app val isEnabled = intent.getBooleanExtra( TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS, true ) } } }
Khi người dùng lật nút bật/tắt, nền tảng sẽ truyền ý định này đến ứng dụng của bạn, trong đó có trạng thái boolean đã cập nhật trong phần bổ sung TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS. Thay vì chờ xác minh định kỳ đối với CallLog.Calls, ứng dụng của bạn có thể theo dõi thông báo truyền tin này. Khi nhật ký cuộc gọi hợp nhất bị tắt (nói cách khác, được đặt thành false), ứng dụng của bạn có thể cập nhật trạng thái nội bộ hoặc thực hiện dọn dẹp, chẳng hạn như xoá các mối liên kết cuộc gọi được lưu vào bộ nhớ đệm cục bộ dùng để xử lý lệnh gọi lại.