Единая история звонков

Приложения VoIP могут интегрировать свои звонки в системный журнал вызовов. Это позволяет пользователям централизованно просматривать историю своих VoIP-звонков в системном приложении для набора номера и перезванивать непосредственно из этого приложения. В этом руководстве описаны необходимые изменения для приложений VoIP-звонков и системных приложений для набора номера .

Изменения в приложении для звонков

Для интеграции вашего VoIP-приложения с системным журналом вызовов выполните следующие действия.

Зарегистрировать фильтр намерения обратного вызова

Зарегистрируйте защищенный системой интент TelecomManager.ACTION_CALL_BACK .

После того, как этот фильтр намерений будет должным образом зарегистрирован, любые вызовы, добавленные вашим приложением с помощью CallsManager.addCall или других связанных API телекоммуникаций, будут автоматически регистрироваться системой. Система использует это зарегистрированное намерение для последующей отправки обратного вызова вашему приложению, когда пользователь выбирает запись в журнале 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>

Исключить регистрацию звонков

После регистрации обратного вызова все звонки регистрируются в системном дозвонщике. Чтобы исключить отдельные звонки, установите логическое значение isLogExcluded в true в классе 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
        ),
)

Обработка обратных вызовов

Вызовы, добавленные через CallsManager.addCall , получают уникальный UUID через 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)
        )
    )
}

Проверьте записи в журнале звонков.

Журнал системных вызовов хранит конечное количество записей и в конечном итоге удаляет старые записи о вызовах. Поскольку приложение хранит сопоставление 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 , который представляет собой системное действие для инициирования обратного вызова. Этот интент содержит UUID вызова в дополнительном интенте TelecomManager.EXTRA_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)