ביטול

כבעלי אתרים בווידאו, ייתכן שתרצו למנוע מהצופים שלכם לדלג על מודעות באמצע סרטון (mid-roll). כשהמשתמש רץ מעבר להפסקה למודעות, אפשר להחזיר אותו לתחילת ההפסקה למודעה ולחזור למיקום הרצוי בסיום ההפסקה. התכונה הזו נקראת 'snapback'.

כדוגמה, עיין בתרשים הבא. הצופה שלכם צופה בסרטון, ומחליט לדלג מסימון 5 הדקות לסימון של 15 הדקות. עם זאת, יש הפסקה למודעה בתום פרק הזמן של 10 הדקות שאתם רוצים שהם יצפו בו, לפני שיוכלו לצפות בתוכן לאחר מכן:

כדי להציג את ההפסקה למודעה הזו:

  1. בודקים אם המשתמש ביצע דילוג מעבר להפסקה למודעות שלא נצפתה, ואם כן, החזירו אותו להפסקה למודעות.
  2. בסיום ההפסקה למודעה, מחזירים את הדילוגים לדילוג המקורי.

בדיאגרמה, התהליך נראה כך:

כך מטמיעים את תהליך העבודה הזה ב-IMA DAI SDK, כמו שמתואר בקטע AdvancedExample.

מניעת מעבר של הפסקה למודעה ללא צפייה

בודקים אם המשתמש ביצע דילוג מעבר להפסקה למודעות שלא נצפה, ואם כן, להחזיר אותו להפסקה למודעות. ב-Android SDK, משתמשים באובייקט PlayerControl כדי לזהות דילוג. כשהמשתמש מחפש, מפעילים את השיטה onSeek() של SampleHlsVideoPlayerCallback שהוטמעה על ידי SampleAdsWrapper. השיטה הזו (שמוצגת בהמשך) בודקת את נקודת הסימון לפני זמן החיפוש של המשתמש. אם היא לא מופעלת, מריצים אותה לתחילת ההפסקה למודעה ולא לנקודת ההרצה הראשונית הרצויה, ושומרים את נקודת הדילוג הרצויה ב-snapBackTime.

@Override
public void onSeek(int timeMillis) {
  double timeToSeek = timeMillis;
  if (streamManager != null) {
    CuePoint cuePoint =
        streamManager.getPreviousCuePointForStreamTime(timeMillis / 1000);
    if (cuePoint != null && !cuePoint.isPlayed()) {
      snapBackTime = timeToSeek / 1000.0; // Update snapback time.
      // Missed cue point, so snap back to the beginning of cue point.
      timeToSeek = cuePoint.getStartTime() * 1000;
      videoPlayer.seek(Math.round(timeToSeek));
      videoPlayer.setCanSeek(false);
      return;
    }
  }
  videoPlayer.seek(Math.round(timeToSeek));
}

החזרת המשתמש לדילוג המקורי

עכשיו, כשתקבל אירוע onAdBreakEnded, צריך לבדוק אם המדיניות snapBackTime מוגדרת. במקרה כזה, העבירו את המשתמש לנקודה הזו בזרם, מפני שההפסקה למודעות שבה הוא צפה עכשיו התקבלה מ-Snapback:

@Override
public void onAdBreakEnded() {
  // Re-enable player controls.
  videoPlayer.setCanSeek(true);
  videoPlayer.enableControls(true);
  if (snapBackTime > 0) {
    videoPlayer.seek(Math.round(snapBackTime * 1000));
  }
  snapBackTime = 0;
}