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:
W Androidzie 16.1 (poziom interfejsu API 36.1) dołącz parametr zapytania
include_voip_callsdo dostawcy treściCallLog.Calls, aby wyświetlać rejestry połączeń VoIP:CallLog.Calls.CONTENT_URI.buildUpon() .appendQueryParameter("include_voip_calls", "true") .build()
W Androidzie 17 (poziom interfejsu API 37) i nowszym użyj tego sformalizowanego dostawcy treści i klucza parametru:
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)