מעורבות SDK Watch: הוראות לשילוב טכני של צד שלישי

Google יוצרת פלטפורמה במכשיר שמארגנת את המשתמשים אפליקציות לפי ענף ומאפשר חוויה סוחפת חדשה לצריכת תוכן מותאם אישית באפליקציות ועל הגילוי. החוויה הזו במסך מלא מספקת למפתחים לשותפים הזדמנות להציג את התוכן העשיר הטוב ביותר שלהם בערוץ ייעודי באפליקציה שלהם.

המדריך הזה כולל הוראות למפתחים שותפים לשילוב הסרטון שלהם להשתמש ב-Engage SDK כדי לאכלס גם את אזור השטח החדש וגם בפלטפורמות השונות של Google.

פרטי השילוב

טרמינולוגיה

השילוב הזה כולל את שלושת סוגי האשכולות הבאים: המלצה, המשך ומוצגים.

  • באשכולות של המלצות מוצגות הצעות מותאמות אישית לתוכן לצפייה משותף מפתחים יחיד.

    ההמלצות שלכם בנויות באופן הבא:

    • אשכול המלצות: תצוגה של ממשק משתמש שמכילה קבוצה של מאותו מפתח שותף.

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

      איור 2. ממשק משתמש של חבילת הבידור שמציג סינגל ישות שמופיעה באשכול ההמלצות של שותף יחיד.
  • באשכול המשך מוצגים סרטונים שלא סיימתם לצפות בהם וסרטונים חדשים רלוונטיים פרקים שפורסמו מכמה שותפים למפתחים בקיבוץ אחד של ממשק המשתמש. כל אחד המפתח השותף יוכל לשדר עד 10 ישויות אשכול המשך. מחקרים הראו שהמלצות מותאמות אישית יחד עם תכני המשך מותאמים אישית, יוצרים את התעניינות המשתמשים הכי טובה.

    איור 3. ממשק משתמש של חבילת הבידור שמציג אשכול המשך עם המלצות לא גמורות מכמה קבוצות שותפים (כרגע מוצגת רק המלצה אחת).
  • באשכול מוצגים מוצגים מבחר ישויות מכמה ישויות שותפים למפתחים בקיבוץ אחד של ממשק המשתמש. יהיה סרטון מוצגים אחד שמופיע סמוך לחלק העליון של ממשק המשתמש, עם מיקום בעדיפות גבוהה מעל כל אשכולות ההמלצות. כל שותף מפתחים יוכל: לשדר עד 10 ישויות באשכול המומלץ.

    איור 4. ממשק משתמש של חבילת הבידור שמציג 'סרטונים מוצגים' אשכול עם המלצות מכמה שותפים (רק שותף אחד) ההמלצה מוצגת כרגע).

הכנה לעבודה

רמת API מינימלית: 19

מוסיפים את הספרייה com.google.android.engage:engage-core לאפליקציה:

dependencies {
    // Make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.engage:engage-core:1.5.2'
}

מידע נוסף זמין במאמר בנושא הרשאות גישה לחבילה ב-Android 11.

סיכום

התכנון מבוסס על יישום של גבול .

הנתונים שלקוח יכול לפרסם כפופים למגבלות הבאות סוגי אשכולות:

סוג האשכול מגבלות של אשכולות תקרות של ישויות באשכול
אשכולות של המלצות 5 לכל היותר 50 לכל היותר
אשכול המשך 1 לכל היותר 10 לכל היותר
אשכול נבחר 1 לכל היותר 10 לכל היותר

שלב 0: העברה משילוב קיים של SDK של Media Home

מיפוי מודלים של נתונים משילוב קיים

אם אתם מבצעים העברה משילוב קיים של Media Home, עליכם: פירטנו כאן איך למפות מודלים של נתונים בערכות SDK קיימות ל-Engage SDK החדש:

המקבילה לשילוב של MediaHomeVideoContract שילוב שווה ערך לשילוב עם SDK
com.google.android.mediahome.video.PreviewChannel com.google.android.engage.common.datamodel.RecommendationCluster
com.google.android.mediahome.video.PreviewChannel.Builder com.google.android.engage.common.datamodel.RecommendationCluster.Builder
com.google.android.mediahome.video.PreviewChannelHelper com.google.android.engage.video.service.AppEngageVideoClient
com.google.android.mediahome.video.PreviewProgram מחולקות לכיתות נפרדות: EventVideo, LiveStreamingVideo, Movie TvEpisode, TvSeason, TvShow, VideoClipEntity
com.google.android.mediahome.video.PreviewProgram.Builder מחולקות ל-builders במחלקות נפרדות: EventVideo, LiveStreamingVideo, Movie TvEpisode, TvSeason, TvShow, VideoClipEntity
com.google.android.mediahome.video.VideoContract ההנחה כבר לא נחוצה.
com.google.android.mediahome.video.WatchNextProgram הוא מחולק למאפיינים במחלקות נפרדות: EventVideoEntity, LiveStreamingVideoEntity MovieEntity, TvEpisodeEntity TvSeasonEntity, TvShowEntity, VideoClipEntity
com.google.android.mediahome.video.WatchNextProgram.Builder הוא מחולק למאפיינים במחלקות נפרדות: EventVideoEntity, LiveStreamingVideoEntity MovieEntity, TvEpisodeEntity TvSeasonEntity, TvShowEntity, VideoClipEntity

פרסום אשכולות ב-Media Home SDK לעומת Engage SDK

באמצעות Media Home SDK, אשכולות וישויות פורסמו באמצעות ממשקי API נפרדים:

// 1. Fetch existing channels
List<PreviewChannel> channels = PreviewChannelHelper.getAllChannels();

// 2. If there are no channels, publish new channels
long channelId = PreviewChannelHelper.publishChannel(builder.build());

// 3. If there are existing channels, decide whether to update channel contents
PreviewChannelHelper.updatePreviewChannel(channelId, builder.build());

// 4. Delete all programs in the channel
PreviewChannelHelper.deleteAllPreviewProgramsByChannelId(channelId);

// 5. publish new programs in the channel
PreviewChannelHelper.publishPreviewProgram(builder.build());

עם Engage SDK, פרסום אשכולות וישויות משולבים בממשק API אחד. שיחה. כל הישויות ששייכות לאשכול מתפרסמות יחד עם אותו cluster:

Kotlin


RecommendationCluster.Builder()
            .addEntity(MOVIE_ENTITY)
            .addEntity(MOVIE_ENTITY)
            .addEntity(MOVIE_ENTITY)
            .setTitle("Top Picks For You")
            .build()

Java


new RecommendationCluster.Builder()
                        .addEntity(MOVIE_ENTITY)
                        .addEntity(MOVIE_ENTITY)
                        .addEntity(MOVIE_ENTITY)
                        .setTitle("Top Picks For You")
                        .build();

שלב 1: מסירת נתוני הישות

ב-SDK הוגדרו ישויות שונות שמייצגות כל סוג פריט. אנחנו תומכים הישויות הבאות של קטגוריית השעון:

  1. MovieEntity
  2. TvShowEntity
  3. TvSeasonEntity
  4. TvEpisodeEntity
  5. LiveStreamingVideoEntity
  6. VideoClipEntity

בתרשים הבא מפורטים המאפיינים והדרישות לכל סוג.

MovieEntity

מאפיין דרישה הערות
שם חובה
תמונות של פוסטר חובה נדרשת תמונה אחת לפחות, ויש לספק אותה עם היבט יחס הגובה-רוחב. (עדיף להשתמש בפורמט אופקי, אבל מומלץ להעביר גם לאורך וגם לרוחב במקרים שונים).

לקבלת הנחיות, אפשר לעיין במפרטי תמונות.

URI להפעלה חובה

קישור העומק לאפליקציית הספק כדי להתחיל להפעיל את הסרט.

הערה: אפשר להשתמש בקישורי עומק לצורך שיוך. אפשר לעיין בשאלות הנפוצות האלה

URI של דף מידע אופציונלי

קישור העומק לאפליקציית הספק שבו מוצגים פרטים על הסרט.

הערה: אפשר להשתמש בקישורי עומק לצורך שיוך. אפשר לעיין בשאלות הנפוצות האלה

תאריך הפצה חובה בפרק זמן של אלפיות שנייה.
זמינות חובה

זמין: התוכן זמין למשתמש ללא צורך פעולה.

FREE_WITH_SUBSCRIPTION: התוכן זמין אחרי שהמשתמש רוכש מינוי.

paid_CONTENT: התוכן מחייב רכישה או השכרה של המשתמשים.

נרכש: התוכן נרכש או נשכר על ידי משתמש.

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

יש לציין כשהפריט נמצא באשכול ההמשך חייב להיות אחד מארבעת הסוגים הבאים:

המשך: המשתמש כבר צפה ביותר מדקה בפרק הזה תוכן.

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

הבא: המשתמש צפה בפרק שלם אחד או יותר מכמה פרקים פרקי תוכן, אבל נותר יותר מפרק אחד נשאר או בדיוק פרק אחד שנשאר כשהפרק האחרון לא נמצא "חדש" והוא שוחרר לפני שהמשתמש התחיל לצפות בפרק תוכן.

רשימת צפייה: המשתמש בחר באופן מפורש להוסיף סרט, אירוע או לרשימת צפייה כדי לאסוף באופן ידני את התכנים שהם רוצים לצפות בהם הבא.

מועד ההתעניינות האחרון נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך. בתקופה מסוימת אלפיות שנייה.
זמן המיקום האחרון של ההפעלה נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך WatchNextType הוא Continue. בפרק זמן של אלפיות שנייה.

TvShowEntity

מאפיין דרישה הערות
שם חובה
תמונות של פוסטר חובה נדרשת תמונה אחת לפחות, ויש לספק אותה עם היבט יחס הגובה-רוחב. (עדיף להשתמש בפורמט אופקי, אבל מומלץ להעביר גם לאורך וגם לרוחב במקרים שונים).

לקבלת הנחיות, אפשר לעיין במפרטי תמונות.

URI של דף מידע חובה

קישור העומק לאפליקציית הספק שבו מוצגים פרטי הטלוויזיה להציג.

הערה: אפשר להשתמש בקישורי עומק לצורך שיוך. אפשר לעיין בשאלות הנפוצות האלה

URI להפעלה אופציונלי

קישור העומק לאפליקציית הספק כדי להתחיל להפעיל את תוכנית הטלוויזיה.

הערה: אפשר להשתמש בקישורי עומק לצורך שיוך. אפשר לעיין בשאלות הנפוצות האלה

תאריך הקרנת הפרק הראשון חובה בפרק זמן של אלפיות שנייה.
תאריך הקרנת הפרק האחרון אופציונלי בפרק זמן של אלפיות שנייה.
זמינות חובה

זמין: התוכן זמין למשתמש ללא צורך פעולה.

FREE_WITH_SUBSCRIPTION: התוכן זמין אחרי שהמשתמש רוכש מינוי.

paid_CONTENT: התוכן מחייב רכישה או השכרה של המשתמשים.

נרכש: התוכן נרכש או נשכר על ידי משתמש.

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

יש לציין כשהפריט נמצא באשכול ההמשך חייב להיות אחד מארבעת הסוגים הבאים:

המשך: המשתמש כבר צפה ביותר מדקה בפרק הזה תוכן.

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

הבא: המשתמש צפה בפרק שלם אחד או יותר מכמה פרקים פרקי תוכן, אבל נותר יותר מפרק אחד נשאר או בדיוק פרק אחד שנשאר כשהפרק האחרון לא נמצא "חדש" והוא שוחרר לפני שהמשתמש התחיל לצפות בפרק תוכן.

רשימת צפייה: המשתמש בחר באופן מפורש להוסיף סרט, אירוע או לרשימת צפייה כדי לאסוף באופן ידני את התכנים שהם רוצים לצפות בהם הבא.

מועד ההתעניינות האחרון נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך. בתקופה מסוימת אלפיות שנייה.
זמן המיקום האחרון של ההפעלה נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך WatchNextType הוא Continue. בפרק זמן של אלפיות שנייה.

TvSeasonEntity

מאפיין דרישה הערות
שם חובה
תמונות של פוסטר חובה נדרשת תמונה אחת לפחות, ויש לספק אותה עם היבט יחס הגובה-רוחב. (עדיף להשתמש בפורמט אופקי, אבל מומלץ להעביר גם לאורך וגם לרוחב במקרים שונים).

לקבלת הנחיות, אפשר לעיין במפרטי תמונות.

URI של דף מידע חובה

קישור העומק לאפליקציית הספק שבו מוצגים הפרטים של תוכנית הטלוויזיה העונה.

הערה: אפשר להשתמש בקישורי עומק לצורך שיוך. אפשר לעיין בשאלות הנפוצות האלה

URI להפעלה אופציונלי

קישור העומק לאפליקציית הספק כדי להתחיל לצפות בתוכנית הטלוויזיה העונה.

הערה: אפשר להשתמש בקישורי עומק לצורך שיוך. אפשר לעיין בשאלות הנפוצות האלה

הצגת מספר העונה

אופציונלי

זמין בגרסה 1.3.1

מחרוזת
תאריך הקרנת הפרק הראשון חובה בפרק זמן של אלפיות שנייה.
תאריך הקרנת הפרק האחרון אופציונלי בפרק זמן של אלפיות שנייה.
זמינות חובה

זמין: התוכן זמין למשתמש ללא צורך פעולה.

FREE_WITH_SUBSCRIPTION: התוכן זמין אחרי שהמשתמש רוכש מינוי.

paid_CONTENT: התוכן מחייב רכישה או השכרה של המשתמשים.

נרכש: התוכן נרכש או נשכר על ידי משתמש.

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

יש לציין כשהפריט נמצא באשכול ההמשך חייב להיות אחד מארבעת הסוגים הבאים:

המשך: המשתמש כבר צפה ביותר מדקה בפרק הזה תוכן.

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

הבא: המשתמש צפה בפרק שלם אחד או יותר מכמה פרקים פרקי תוכן, אבל נותר יותר מפרק אחד נשאר או בדיוק פרק אחד שנשאר כשהפרק האחרון לא נמצא "חדש" והוא שוחרר לפני שהמשתמש התחיל לצפות בפרק תוכן.

רשימת צפייה: המשתמש בחר באופן מפורש להוסיף סרט, אירוע או לרשימת צפייה כדי לאסוף באופן ידני את התכנים שהם רוצים לצפות בהם הבא.

מועד ההתעניינות האחרון נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך. בתקופה מסוימת אלפיות שנייה.
זמן המיקום האחרון של ההפעלה נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך WatchNextType הוא Continue. בפרק זמן של אלפיות שנייה.

TvEpisodeEntity

מאפיין דרישה הערות
שם חובה
תמונות של פוסטר חובה נדרשת תמונה אחת לפחות, ויש לספק אותה עם היבט יחס הגובה-רוחב. (עדיף להשתמש בפורמט אופקי, אבל מומלץ להעביר גם לאורך וגם לרוחב במקרים שונים).

לקבלת הנחיות, אפשר לעיין במפרטי תמונות.

URI להפעלה חובה

קישור העומק לאפליקציית הספק כדי להתחיל להפעיל את הפרק.

הערה: אפשר להשתמש בקישורי עומק לצורך שיוך. אפשר לעיין בשאלות הנפוצות האלה

URI של דף מידע אופציונלי

קישור העומק לאפליקציית הספק שבו מוצגים פרטים על תוכנית הטלוויזיה בפרק.

הערה: אפשר להשתמש בקישורי עומק לצורך שיוך. אפשר לעיין בשאלות הנפוצות האלה

הצגת מספר הפרק

אופציונלי

זמין בגרסה 1.3.1

מחרוזת
תאריך השידור חובה בפרק זמן של אלפיות שנייה.
זמינות חובה

זמין: התוכן זמין למשתמש ללא צורך פעולה.

FREE_WITH_SUBSCRIPTION: התוכן זמין אחרי שהמשתמש רוכש מינוי.

paid_CONTENT: התוכן מחייב רכישה או השכרה של המשתמשים.

נרכש: התוכן נרכש או נשכר על ידי משתמש.

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

יש לציין כשהפריט נמצא באשכול ההמשך חייב להיות אחד מארבעת הסוגים הבאים:

המשך: המשתמש כבר צפה ביותר מדקה בפרק הזה תוכן.

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

הבא: המשתמש צפה בפרק שלם אחד או יותר מכמה פרקים פרקי תוכן, אבל נותר יותר מפרק אחד נשאר או בדיוק פרק אחד שנשאר כשהפרק האחרון לא נמצא "חדש" והוא שוחרר לפני שהמשתמש התחיל לצפות בפרק תוכן.

רשימת צפייה: המשתמש בחר באופן מפורש להוסיף סרט, אירוע או לרשימת צפייה כדי לאסוף באופן ידני את התכנים שהם רוצים לצפות בהם הבא.

מועד ההתעניינות האחרון נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך. בתקופה מסוימת אלפיות שנייה.
זמן המיקום האחרון של ההפעלה נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך WatchNextType הוא Continue. בפרק זמן של אלפיות שנייה.

LiveStreamingVideoEntity

מאפיין דרישה הערות
שם חובה
תמונות של פוסטר חובה נדרשת תמונה אחת לפחות, ויש לספק אותה עם היבט יחס הגובה-רוחב. (עדיף להשתמש בפורמט אופקי, אבל מומלץ להעביר גם לאורך וגם לרוחב במקרים שונים).

לקבלת הנחיות, אפשר לעיין במפרטי תמונות.

URI להפעלה חובה

קישור העומק לאפליקציית הספק כדי להתחיל להפעיל את הסרטון.

הערה: אפשר להשתמש בקישורי עומק לצורך שיוך. אפשר לעיין בשאלות הנפוצות האלה

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

יש לציין כשהפריט נמצא באשכול ההמשך חייב להיות אחד מארבעת הסוגים הבאים:

המשך: המשתמש כבר צפה ביותר מדקה בפרק הזה תוכן.

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

הבא: המשתמש צפה בפרק שלם אחד או יותר מכמה פרקים פרקי תוכן, אבל נותר יותר מפרק אחד נשאר או בדיוק פרק אחד שנשאר כשהפרק האחרון לא נמצא "חדש" והוא שוחרר לפני שהמשתמש התחיל לצפות בפרק תוכן.

רשימת צפייה: המשתמש בחר באופן מפורש להוסיף סרט, אירוע או לרשימת צפייה כדי לאסוף באופן ידני את התכנים שהם רוצים לצפות בהם הבא.

מועד ההתעניינות האחרון נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך. בתקופה מסוימת אלפיות שנייה.
זמן המיקום האחרון של ההפעלה נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך WatchNextType הוא Continue. בפרק זמן של אלפיות שנייה.

VideoClipEntity

האובייקט VideoClipEntity מייצג ישות וידאו שמגיעה ממדיה חברתית, כמו TikTok או YouTube.

מאפיין דרישה הערות
שם חובה
תמונות של פוסטר חובה נדרשת תמונה אחת לפחות, ויש לספק אותה עם היבט יחס הגובה-רוחב. (עדיף להשתמש בפורמט אופקי, אבל מומלץ להעביר גם לאורך וגם לרוחב במקרים שונים).

לקבלת הנחיות, אפשר לעיין במפרטי תמונות.

URI להפעלה חובה

קישור העומק לאפליקציית הספק כדי להתחיל להפעיל את הסרטון.

הערה: אפשר להשתמש בקישורי עומק לצורך שיוך. אפשר לעיין בשאלות הנפוצות האלה

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

יש לציין כשהפריט נמצא באשכול ההמשך חייב להיות אחד מארבעת הסוגים הבאים:

המשך: המשתמש כבר צפה ביותר מדקה בפרק הזה תוכן.

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

הבא: המשתמש צפה בפרק שלם אחד או יותר מכמה פרקים פרקי תוכן, אבל נותר יותר מפרק אחד נשאר או בדיוק פרק אחד שנשאר כשהפרק האחרון לא נמצא "חדש" והוא שוחרר לפני שהמשתמש התחיל לצפות בפרק תוכן.

רשימת צפייה: המשתמש בחר באופן מפורש להוסיף סרט, אירוע או לרשימת צפייה כדי לאסוף באופן ידני את התכנים שהם רוצים לצפות בהם הבא.

מועד ההתעניינות האחרון נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך. בתקופה מסוימת אלפיות שנייה.
זמן המיקום האחרון של ההפעלה נדרש באופן מותנה יש לציין כשהפריט נמצא באשכול ההמשך WatchNextType הוא Continue. בפרק זמן של אלפיות שנייה.

מפרט לתמונות

בקטע הבא מפורטים המפרטים הנדרשים לנכסי תמונות:

פורמטים של קבצים

PNG, JPG, GIF סטטי, WebP

גודל קובץ מקסימלי

5,120KB

המלצות נוספות

  • האזור הבטוח של התמונות: צריך למקם את התוכן החשוב ב-80% המרכזיים של תמונה.

דוגמה

Kotlin

var movie = MovieEntity.Builder()
    .setName("Avengers")
    .addPosterImage(Image.Builder()
                          .setImageUri(Uri.parse("http://www.x.com/image.png"))
                          .setImageHeightInPixel(960)
                          .setImageWidthInPixel(408)
                          .build())
    .setPlayBackUri(Uri.parse("http://tv.com/playback/1"))
    .setReleaseDateEpochMillis(1633032895L)
    .setAvailability(ContentAvailability.AVAILABILITY_AVAILABLE)
    .setDurationMillis(12345678L)
    .addGenre("action")
    .addContentRating("R")
    .setWatchNextType(WatchNextType.TYPE_NEW)
    .setLastEngagementTimeMillis(1664568895L)
    .build()

Java

MovieEntity movie = new MovieEntity.Builder()
                  .setName("Avengers")
                  .addPosterImage(
                      new Image.Builder()
                          .setImageUri(Uri.parse("http://www.x.com/image.png"))
                          .setImageHeightInPixel(960)
                          .setImageWidthInPixel(408)
                          .build())
                  .setPlayBackUri(Uri.parse("http://tv.com/playback/1"))
                  .setReleaseDateEpochMillis(1633032895L)
                  .setAvailability(ContentAvailability.AVAILABILITY_AVAILABLE)
                  .setDurationMillis(12345678L)
                  .addGenre("action")
                  .addContentRating("R")
                  .setWatchNextType(WatchNextType.TYPE_NEW)
                  .setLastEngagementTimeMillis(1664568895L)
                  .build();

שלב 2: מספקים נתוני אשכול

מומלץ לבצע את משימת פרסום התוכן ברקע (לדוגמה, באמצעות WorkManager) והם מתוזמנים על בסיס קבוע או על בסיס אירוע (לדוגמה, בכל פעם שהמשתמש פותח את האפליקציה או רק כשהוא הוסיף משהו לעגלת הקניות).

AppEngagePublishClient אחראי לפרסום אשכולות. כבר במעקב ממשקי API זמינים ב-Client:

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishContinuationCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteContinuationCluster
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

ה-API הזה משמש כדי לבדוק אם השירות זמין לשילוב, אם ניתן להציג את התוכן במכשיר.

Kotlin


client.isServiceAvailable.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // Handle IPC call success
        if(task.result) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
}

Java


client.isServiceAvailable().addOnCompleteListener(task - > {
    if (task.isSuccessful()) {
        // Handle success
        if(task.getResult()) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
});

publishRecommendationClusters

ה-API הזה משמש לפרסום רשימה של RecommendationCluster אובייקטים.

Kotlin


client.publishRecommendationClusters(
      PublishRecommendationClustersRequest.Builder()
        .addRecommendationCluster(
          RecommendationCluster.Builder()
            .addEntity(entity1)
            .addEntity(entity2)
            .setTitle("Top Picks For You")
            .build()
        )
        .build()
    )

Java


client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Top Picks For You")
                        .build())
                .build());

כשהשירות מקבל את הבקשה, הפעולות הבאות מתרחשות בתוך עסקה אחת:

  • הנתונים הקיימים של RecommendationCluster מהשותף למפתחים יוסרו.
  • הנתונים מהבקשה מנותחים ונשמרים בהמלצה המעודכנת אשכול.

במקרה של שגיאה, הבקשה כולה נדחית והמצב הקיים מתוחזקת.

publishFeaturedCluster

ה-API הזה משמש לפרסום רשימה של FeaturedCluster אובייקטים.

Kotlin


client.publishFeaturedCluster(
    PublishFeaturedClusterRequest.Builder()
      .setFeaturedCluster(
        FeaturedCluster.Builder()
          .addEntity(entity1)
          .addEntity(entity2)
          .build())
      .build())

Java


client.publishFeaturedCluster(
            new PublishFeaturedClustersRequest.Builder()
                .addFeaturedCluster(
                    new FeaturedCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .build())
                .build());

כשהשירות מקבל את הבקשה, הפעולות הבאות מתרחשות בתוך עסקה אחת:

  • הנתונים הקיימים של FeaturedCluster מהשותף למפתחים יוסרו.
  • הנתונים מהבקשה מנותחים ונשמרים באשכול המעודכן.

במקרה של שגיאה, הבקשה כולה נדחית והמצב הקיים מתוחזקת.

publishContinuationCluster

ה-API הזה משמש לפרסום אובייקט ContinuationCluster.

Kotlin


client.publishContinuationCluster(
    PublishContinuationClusterRequest.Builder()
      .setContinuationCluster(
        ContinuationCluster.Builder()
          .addEntity(entity1)
          .addEntity(entity2)
          .build())
      .build())

Java


client.publishContinuationCluster(
            new PublishContinuationClusterRequest.Builder()
                .setContinuationCluster(
                    new ContinuationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .build())
                .build());

כשהשירות מקבל את הבקשה, הפעולות הבאות מתרחשות בתוך עסקה אחת:

  • הנתונים הקיימים של ContinuationCluster מהשותף למפתחים יוסרו.
  • נתונים מהבקשה מנותחים ונשמרים במצב המשך המעודכן אשכול.

במקרה של שגיאה, הבקשה כולה נדחית והמצב הקיים מתוחזקת.

publishUserAccountManagementRequest

ממשק ה-API הזה משמש לפרסום כרטיס כניסה . פעולת הכניסה מפנה משתמשים אל דף הכניסה של האפליקציה, כדי שהאפליקציה תוכל לפרסם תוכן (או לספק עוד תוכן בהתאמה אישית)

המטא-נתונים הבאים הם חלק מכרטיס הכניסה –

מאפיין דרישה תיאור
URI של פעולה חובה קישור עומק לפעולה (כלומר מעבר לדף הכניסה לאפליקציה)
תמונה אופציונלי – אם לא מציינים כותרת, יש להזין כותרת

תמונה שמוצגת בכרטיס

תמונות ביחס גובה-רוחב של 16x9 עם רזולוציה של 1264x712

כותרת אופציונלי – אם אין תמונה, חובה לספק תמונה כותרת על הכרטיס
טקסט פעולה אופציונלי טקסט שמוצג בקריאה לפעולה (כלומר, כניסה לחשבון)
כותרת משנה אופציונלי כתוביות אופציונליות בכרטיס

Kotlin


var SIGN_IN_CARD_ENTITY =
      SignInCardEntity.Builder()
          .addPosterImage(
              Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build()

client.publishUserAccountManagementRequest(
            PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Java


SignInCardEntity SIGN_IN_CARD_ENTITY =
      new SignInCardEntity.Builder()
          .addPosterImage(
              new Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build();

client.publishUserAccountManagementRequest(
            new PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

כשהשירות מקבל את הבקשה, הפעולות הבאות מתרחשות בתוך עסקה אחת:

  • הנתונים הקיימים של UserAccountManagementCluster מהשותף למפתחים הם הוסר.
  • הנתונים מהבקשה מנותחים ונשמרים אשכול אשכול UserAccountManagement.

במקרה של שגיאה, הבקשה כולה נדחית והמצב הקיים מתוחזקת.

updatePublishStatus

אם מסיבה עסקית פנימית כלשהי, אף אחד מהאשכולות לא מתפרסם, מומלץ מאוד לעדכן את סטטוס הפרסום באמצעות ממשק API של updatePublishStatus. זה חשוב מהסיבות הבאות :

  • הצגת הסטטוס בכל התרחישים, גם כשהתוכן פורסם (STATUS == PUBLISHED) הוא קריטי לאכלוס מרכזי בקרה שמשתמשים בכך סטטוס מפורש כדי להעביר את התקינות ומדדים אחרים של השילוב שלך.
  • אם לא מתפרסם תוכן, אבל סטטוס השילוב לא פגום (STATUS == NOT_PUBLISHED), Google יכולה להימנע מהפעלת התראות באפליקציה לוחות בקרה בנושאי בריאות. היא מאשרת שהתוכן לא פורסם עקב הצפוי מבחינת הספק.
  • הוא עוזר למפתחים לספק תובנות לגבי מועד הפרסום של הנתונים, לעומת לא.
  • Google עשויה להשתמש בקודי הסטטוס כדי לעודד את המשתמש לבצע פעולות מסוימות כדי שיוכלו לראות את התוכן של האפליקציה או להתגבר עליו.

רשימת קודי הסטטוסים שעומדים בדרישות לפרסום היא :

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,

// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,

// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,

// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,

// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,

// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,

// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,

// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER

אם התוכן לא פורסם כי משתמש לא מחובר, Google תמליץ לפרסם את כרטיס הכניסה. אם מסיבה כלשהי ספקים לא יכולים לפרסם את כרטיס הכניסה לאחר מכן מומלץ לקרוא ל-API updatePublishStatus עם קוד הסטטוס NOT_PUBLISHED_REQUIRES_SIGN_IN

Kotlin


client.updatePublishStatus(
   PublishStatusRequest.Builder()
     .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
     .build())

Java


client.updatePublishStatus(
    new PublishStatusRequest.Builder()
        .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
        .build());

deleteRecommendationClusters

ה-API הזה משמש למחיקת התוכן של אשכולות המלצות.

Kotlin


client.deleteRecommendationClusters()

Java


client.deleteRecommendationClusters();

כשהשירות מקבל את הבקשה, הוא מסיר את הנתונים הקיימים אשכולות של המלצות. במקרה של שגיאה, הבקשה כולה נדחית והמצב הקיים נשמר.

deleteFeaturedCluster

ה-API הזה משמש למחיקת התוכן של אשכול מומלץ.

Kotlin


client.deleteFeaturedCluster()

Java


client.deleteFeaturedCluster();

כשהשירות מקבל את הבקשה, הוא מסיר את הנתונים הקיימים אשכול מוצג. במקרה של שגיאה, הבקשה כולה נדחית והמצב הקיים נשמר.

deleteContinuationCluster

ה-API הזה משמש למחיקת התוכן של אשכול ההמשך.

Kotlin


client.deleteContinuationCluster()

Java


client.deleteContinuationCluster();

כשהשירות מקבל את הבקשה, הוא מסיר את הנתונים הקיימים אשכול המשך. במקרה של שגיאה, הבקשה כולה נדחית והמצב הקיים נשמר.

deleteUserManagementCluster

ה-API הזה משמש למחיקת התוכן של אשכול UserAccountManagement.

Kotlin


client.deleteUserManagementCluster()

Java


client.deleteUserManagementCluster();

כשהשירות מקבל את הבקשה, הוא מסיר את הנתונים הקיימים אשכול UserAccountManagement. במקרה של שגיאה, הבקשה כולה נדחה והמצב הקיים נשמר.

deleteClusters

ה-API הזה משמש למחיקת התוכן של סוג אשכול נתון.

Kotlin


client.deleteClusters(
    DeleteClustersRequest.Builder()
      .addClusterType(ClusterType.TYPE_CONTINUATION)
      .addClusterType(ClusterType.TYPE_FEATURED)
      .addClusterType(ClusterType.TYPE_RECOMMENDATION)
      .build())

Java


client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .addClusterType(ClusterType.TYPE_CONTINUATION)
                .addClusterType(ClusterType.TYPE_FEATURED)
                .addClusterType(ClusterType.TYPE_RECOMMENDATION)
                .build());

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

טיפול בשגיאות

מומלץ מאוד להאזין לתוצאת המשימה מממשקי ה-API לפרסום, שניתן לבצע פעולת המשך כדי לשחזר משימה מוצלחת ולשלוח אותה מחדש.

Kotlin


client.publishRecommendationClusters(
        PublishRecommendationClustersRequest.Builder()
          .addRecommendationCluster(..)
          .build())
      .addOnCompleteListener { task ->
        if (task.isSuccessful) {
          // do something
        } else {
          val exception = task.exception
          if (exception is AppEngageException) {
            @AppEngageErrorCode val errorCode = exception.errorCode
            if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
              // do something
            }
          }
        }
      }

Java


client.publishRecommendationClusters(
              new PublishRecommendationClustersRequest.Builder()
                  .addRecommendationCluster(...)
                  .build())
          .addOnCompleteListener(
              task -> {
                if (task.isSuccessful()) {
                  // do something
                } else {
                  Exception exception = task.getException();
                  if (exception instanceof AppEngageException) {
                    @AppEngageErrorCode
                    int errorCode = ((AppEngageException) exception).getErrorCode();
                    if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
                      // do something
                    }
                  }
                }
              });

השגיאה מוחזרת בתור AppEngageException עם הסיבה קוד שגיאה.

קוד שגיאה הערה
SERVICE_NOT_FOUND השירות לא זמין במכשיר הנתון.
SERVICE_NOT_AVAILABLE השירות זמין במכשיר הנתון, אבל הוא לא זמין בזמן השיחה (לדוגמה, האפשרות מושבתת באופן מפורש).
SERVICE_CALL_EXECUTION_FAILURE ביצוע המשימה נכשל עקב בעיות בשרשור. במקרה הזה, יכול להיות ניסיון חוזר.
SERVICE_CALL_PERMISSION_DENIED המתקשר לא מורשה לבצע את שיחת השירות.
SERVICE_CALL_INVALID_ARGUMENT הבקשה מכילה נתונים לא חוקיים (לדוגמה, יותר מהמותר מספר האשכולות).
SERVICE_CALL_INTERNAL יש שגיאה בצד השירות.
SERVICE_CALL_RESOURCE_EXHAUSTED הקריאה לשירות מתבצעת לעיתים קרובות מדי.

שלב 3: טיפול בכוונות שידור

בנוסף לביצוע קריאות לפרסום Content API באמצעות משימה, מדובר גם נדרשות כדי להגדיר BroadcastReceiver כדי לקבל את הבקשה לפרסום תוכן.

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

צריך להגדיר את BroadcastReceiver בשתי הדרכים הבאות:

  • רישום באופן דינמי של מופע של המחלקה BroadcastReceiver באמצעות Context.registerReceiver(). כך מתאפשרת תקשורת מאפליקציות שעדיין קיימים בזיכרון.

Kotlin

class AppEngageBroadcastReceiver : BroadcastReceiver(){
  // Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
  // is received
  // Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received
  // Trigger continuation cluster publish when PUBLISH_CONTINUATION broadcast is
  // received
}

fun registerBroadcastReceivers(context: Context){
  var  context = context
  context = context.applicationContext

// Register Recommendation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_RECOMMENDATION))

// Register Featured Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_FEATURED))

// Register Continuation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_CONTINUATION))
}

Java

class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received

// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received

// Trigger continuation cluster publish when PUBLISH_CONTINUATION broadcast is
// received
}

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION));

// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED));

// Register Continuation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_CONTINUATION));

}
  • הצהרה סטטית על יישום עם התג <receiver> ב- קובץ AndroidManifest.xml. ההרשאה הזו מאפשרת לאפליקציה לקבל שידור את ה-Intent כאשר הוא לא פועל, וגם מאפשרת לאפליקציה לפרסם את התוכן.
<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:exported="true"
      android:enabled="true">
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_CONTINUATION" />
      </intent-filter>
   </receiver>
</application>

הכוונות הבאות נשלחות על ידי service:

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION מומלץ להתחיל שיחת publishRecommendationClusters כאשר לקבל את הכוונה הזאת.
  • com.google.android.engage.action.PUBLISH_FEATURED מומלץ להתחיל שיחת publishFeaturedCluster עם קבלת ההודעה בכוונה טובה.
  • com.google.android.engage.action.PUBLISH_CONTINUATION מומלץ להתחיל שיחת publishContinuationCluster כשמתקבלת את הכוונה הזאת.

תהליך עבודה של שילוב

למדריך מפורט על אימות השילוב לאחר השלמתו, אפשר לעיין במאמר ליצור מעורבות בתהליך העבודה של השילוב למפתחים.

שאלות נפוצות

ניתן לעיין בשאלות נפוצות בנושא Engage SDK בנושא שאלות נפוצות.

יצירת קשר

פרטים ליצירת קשר engagement-developers@google.com, אם יש בזמן תהליך ההטמעה.

השלבים הבאים

לאחר השלמת השילוב, השלבים הבאים הם:

  • שליחת אימייל אל engagement-developers@google.com וצירוף המסמך את ה-APK המשולב שמוכן לבדיקה על ידי Google.
  • Google מבצעת אימות ובדיקות פנימיות כדי לוודא פועל כמצופה. אם יהיה צורך בשינויים, Google תיצור איתך קשר את כל הפרטים הנדרשים.
  • כשהבדיקה תסתיים ואין צורך בשינויים, Google תיצור איתך קשר כדי תודיע לך שאתה יכול להתחיל לפרסם את ה-APK המעודכן והמשולב חנות Play.
  • לאחר ש-Google אישרה שה-APK המעודכן פורסם חנות Play, המלצה, מוצגת והמשך ייתכן שאשכולות יפורסמו ויהיו גלויים למשתמשים.