统一的通话记录

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 应用的通话记录不会显示在拨号器应用中。如需在拨号器应用中显示集成式通话记录,请执行以下操作:

从拨号器应用发起回调

如需从拨号器发起回调,请使用 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)