אפליקציות VoIP יכולות לשלב את השיחות שלהן ביומן של המערכת. האפשרות הזו מאפשרת למשתמשים לראות את היסטוריית השיחות שלהם ב-VoIP באופן מרכזי באפליקציית החייגן של המערכת, ולחזור לשיחות ישירות מאפליקציית החייגן. במדריך הזה מתוארים השינויים הנדרשים באפליקציות לשיחות ב-VoIP ובאפליקציות של חייגן המערכת.
שינויים באפליקציה לשיחות
כדי לשלב את אפליקציית ה-VoIP עם יומן השיחות של המערכת, פועלים לפי השלבים הבאים.
רישום מסנן intent להתקשרות חזרה
רושמים את כוונת המשתמש שמוגנת על ידי המערכת TelecomManager.ACTION_CALL_BACK.
אחרי שמסנן Intent הזה נרשם בצורה תקינה, כל השיחות שהאפליקציה מוסיפה באמצעות CallsManager.addCall או ממשקי API אחרים שקשורים לטלקום יתועדו אוטומטית על ידי המערכת. המערכת משתמשת ב-Intent הרשום הזה כדי לשלוח בהמשך קריאה חוזרת (callback) לאפליקציה שלכם כשמשתמש בוחר רשומה של שיחת 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) ) ) }
אימות של רשומות ביומן השיחות
יומן השיחות של המערכת מכיל מספר סופי של רשומות, ובסופו של דבר הוא מוחק רשומות ישנות של שיחות. מכיוון שהאפליקציה שומרת מיפוי של UUIDs לפרטי שיחות לטיפול בהחזרת שיחות, היא צריכה לבדוק מעת לעת אילו UUIDs עדיין מופיעים ביומן השיחות של המערכת. אם UUID כבר לא נמצא ביומן המערכת, המשתמש לא יכול ליזום קריאה חוזרת לשיחה הזו, והאפליקציה יכולה להסיר בבטחה את המיפוי מהאחסון המקומי שלה. השיטה הזו עוזרת לבצע אופטימיזציה של האחסון.
כדי לקבל את הרשימה הנוכחית של UUIDs שמשויכים לאפליקציה ביומן המערכת, משתמשים ב-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 הנכונה. ההפעלה הזו כוללת כוונה (intent) של 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)