Google יוצרת פלטפורמה במכשיר שמארגנת את המשתמשים אפליקציות לפי ענף ומאפשר חוויה סוחפת חדשה לצריכת תוכן מותאם אישית באפליקציות ועל הגילוי. החוויה הזו במסך מלא מספקת למפתחים לשותפים הזדמנות להציג את התוכן העשיר הטוב ביותר שלהם בערוץ ייעודי באפליקציה שלהם.
המדריך הזה כולל הוראות למפתחים שותפים לשילוב הסרטון שלהם להשתמש ב-Engage SDK כדי לאכלס גם את אזור השטח החדש וגם בפלטפורמות השונות של Google.
פרטי השילוב
טרמינולוגיה
השילוב הזה כולל את שלושת סוגי האשכולות הבאים: המלצה, המשך ומוצגים.
באשכולות של המלצות מוצגות הצעות מותאמות אישית לתוכן לצפייה משותף מפתחים יחיד.
ההמלצות שלכם בנויות באופן הבא:
אשכול המלצות: תצוגה של ממשק משתמש שמכילה קבוצה של מאותו מפתח שותף.
ישות: אובייקט שמייצג פריט יחיד באשכול. ישות לדוגמה: סרט, תוכנית טלוויזיה, סדרת טלוויזיה, סרטון בשידור חי ועוד. לצפייה הקטע ציון נתוני ישות לרשימה של סוגי הישויות הנתמכות.
באשכול המשך מוצגים סרטונים שלא סיימתם לצפות בהם וסרטונים חדשים רלוונטיים פרקים שפורסמו מכמה שותפים למפתחים בקיבוץ אחד של ממשק המשתמש. כל אחד המפתח השותף יוכל לשדר עד 10 ישויות אשכול המשך. מחקרים הראו שהמלצות מותאמות אישית יחד עם תכני המשך מותאמים אישית, יוצרים את התעניינות המשתמשים הכי טובה.
באשכול מוצגים מוצגים מבחר ישויות מכמה ישויות שותפים למפתחים בקיבוץ אחד של ממשק המשתמש. יהיה סרטון מוצגים אחד שמופיע סמוך לחלק העליון של ממשק המשתמש, עם מיקום בעדיפות גבוהה מעל כל אשכולות ההמלצות. כל שותף מפתחים יוכל: לשדר עד 10 ישויות באשכול המומלץ.
הכנה לעבודה
רמת 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 הוגדרו ישויות שונות שמייצגות כל סוג פריט. אנחנו תומכים הישויות הבאות של קטגוריית השעון:
בתרשים הבא מפורטים המאפיינים והדרישות לכל סוג.
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, המלצה, מוצגת והמשך ייתכן שאשכולות יפורסמו ויהיו גלויים למשתמשים.