Ujednolicona historia połączeń

Aplikacje VoIP mogą integrować swoje połączenia z systemowym rejestrem połączeń. Dzięki temu użytkownicy mogą wyświetlać historię połączeń VoIP w centralnym miejscu w systemowej aplikacji telefonu i oddzwaniać bezpośrednio z tej aplikacji. W tym przewodniku opisujemy wymagane zmiany w aplikacjach do połączeń VoIP i systemowych aplikacjach telefonu.

Zmiany w aplikacji do połączeń

Aby zintegrować aplikację VoIP z systemowym rejestrem połączeń, wykonaj te czynności.

Zarejestruj filtr intencji wywołania zwrotnego

Zarejestruj chronioną przez system intencję TelecomManager.ACTION_CALL_BACK.

Gdy ten filtr intencji zostanie prawidłowo zarejestrowany, wszystkie połączenia dodawane przez aplikację za pomocą CallsManager.addCall lub innych powiązanych interfejsów API Telecom będą automatycznie rejestrowane przez system. System używa tej zarejestrowanej intencji, aby później wysłać wywołanie zwrotne do aplikacji, gdy użytkownik wybierze w aplikacji telefonu wpis w rejestrze połączeń VoIP, aby oddzwonić.

<!-- 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>

Wyklucz rejestrowanie połączeń

Po zarejestrowaniu wywołania zwrotnego wszystkie połączenia są rejestrowane w systemowej aplikacji telefonu. Aby wykluczyć połączenia na podstawie poszczególnych połączeń, ustaw wartość isLogExcluded logiczną na true w 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
        ),
)

Obsługa wywołań zwrotnych

Połączenia dodawane za pomocą CallsManager.addCall otrzymują unikalny identyfikator UUID za pomocą 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)
        )
    )
}

Sprawdzanie wpisów w rejestrze połączeń

Systemowy rejestr połączeń przechowuje ograniczoną liczbę wpisów i ostatecznie usuwa stare rekordy połączeń. Ponieważ aplikacja przechowuje mapowanie identyfikatorów UUID na szczegóły połączeń na potrzeby obsługi wywołań zwrotnych, powinna okresowo sprawdzać, które identyfikatory UUID są nadal obecne w systemowym rejestrze połączeń. Jeśli identyfikator UUID nie znajduje się już w dzienniku systemowym, użytkownik nie może zainicjować wywołania zwrotnego dla tego połączenia, a aplikacja może bezpiecznie usunąć mapowanie z pamięci lokalnej. Ta praktyka pomaga zoptymalizować miejsce na dane.

Aby uzyskać bieżącą listę UUID przypisanych do aplikacji w dzienniku systemowym, użyj CallLog.Calls.CONTENT_VOIP_URI.

Zmiany w aplikacji telefonu

Aby umożliwić aplikacji telefonu wyświetlanie rejestrów połączeń VoIP i inicjowanie wywołań zwrotnych do aplikacji VoIP, wykonaj te czynności.

Wyświetlanie rejestrów połączeń VoIP w aplikacji telefonu

Domyślnie rejestry połączeń aplikacji VoIP nie są wyświetlane w aplikacji telefonu. Aby wyświetlać zintegrowane rejestry połączeń w aplikacji telefonu:

Inicjowanie wywołań zwrotnych z aplikacji telefonu

Aby zainicjować wywołanie zwrotne z aplikacji telefonu, użyj TelecomManager.placeCall. Platforma używa unikalnego CallLog.Calls._ID wpisu logu w rejestrze połączeń, aby uruchomić prawidłową aplikację VoIP. To uruchomienie obejmuje TelecomManager.ACTION_CALL_BACK intencję, która jest zdefiniowaną przez system czynnością inicjującą połączenie zwrotne. Ta intencja zawiera identyfikator UUID połączenia w dodatkowej intencji TelecomManager.EXTRA_UUID, co umożliwia aplikacji VoIP określenie do którego połączenia ma nastąpić wywołanie zwrotne.

// 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)