היסטוריית שיחות מאוחדת

אפליקציות 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)