Приложения 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)