VoIP 应用可以将通话记录集成到系统通话记录中。这样一来,用户便可在系统拨号器应用中集中查看 VoIP 通话记录,并直接从拨号器应用中回拨电话。本指南介绍了对 VoIP 通话应用和系统拨号器应用的必要更改。
通话应用的变更
如需将 VoIP 应用与系统通话记录集成,请按以下步骤操作。
注册回调 intent 过滤器
注册受系统保护的 intent TelecomManager.ACTION_CALL_BACK。
正确注册此 intent 过滤器后,您的应用使用 CallsManager.addCall 或其他相关 Telecom API 添加的任何调用都会被系统自动记录。系统会使用此已注册的 intent,以便在用户选择拨号器中的 VoIP 通话记录条目来回拨电话时,向您的应用发送回调。
<!-- 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>
排除通话日志记录
注册回调后,所有通话都会记录到系统拨号器中。如需按每次通话排除通话,请在 CallAttributesCompat 内将 isLogExcluded 布尔值设置为 true。
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 ), )
处理回调
通过 CallsManager.addCall 添加的调用会通过 CallControlScope.getCallId 获取唯一的 UUID。
// 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) ) ) }
验证通话记录条目
系统调用日志会保留有限数量的条目,并最终清除旧的通话记录。由于应用会存储 UUID 到用于回调处理的调用详细信息的映射,因此应定期检查系统通话记录中仍存在哪些 UUID。如果 UUID 不再位于系统日志中,用户将无法针对相应调用发起回调,并且应用可以安全地从其本地存储中移除相应映射。这种做法有助于优化存储空间。
如需获取系统日志中归因于应用的 UUID 的当前列表,请使用 CallLog.Calls.CONTENT_VOIP_URI。
针对拨号器应用的变更
请按以下步骤操作,以使拨号器应用能够显示 VoIP 通话记录并向 VoIP 应用发起回拨。
在拨号器应用中显示 VoIP 通话记录
默认情况下,VoIP 应用的通话记录不会显示在拨号器应用中。如需在拨号器应用中显示集成式通话记录,请执行以下操作:
在 Android 16.1(API 级别 36.1)中,将查询参数
include_voip_calls附加到CallLog.Calls内容提供程序以显示 VoIP 通话记录:CallLog.Calls.CONTENT_URI.buildUpon() .appendQueryParameter("include_voip_calls", "true") .build()
在 Android 17(API 级别 37)及更高版本中,请使用以下正式的内容提供程序和参数键:
从拨号器应用发起回调
如需从拨号器发起回调,请使用 TelecomManager.placeCall。平台使用通话记录条目的唯一 CallLog.Calls._ID 来启动正确的 VoIP 应用。此启动包含 TelecomManager.ACTION_CALL_BACK intent,这是一个用于发起回拨的系统定义的操作。此 intent 在 intent extra TelecomManager.EXTRA_UUID 中包含通话的 UUID,从而使 VoIP 应用能够识别正在回拨的具体通话。
// 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)