กระตุ้นการมีส่วนร่วมในแอปด้วยการเข้าถึงผู้ใช้ในที่ที่ผู้ใช้อยู่ ผสานรวม Engage SDK เพื่อส่งเนื้อหา "ดูต่อ" และคำแนะนำที่ปรับเปลี่ยนตามการใช้งานของผู้ใช้โดยตรงไปยังแพลตฟอร์มต่างๆ ในอุปกรณ์ เช่น คอลเล็กชัน, Entertainment Space และ Google Play Store การผสานรวมจะเพิ่มขนาด APK โดยเฉลี่ยไม่ถึง 50 KB (บีบอัด) และใช้เวลา สำหรับแอปส่วนใหญ่ประมาณ 1 สัปดาห์ในการพัฒนา ดูข้อมูลเพิ่มเติมได้ที่เว็บไซต์สำหรับธุรกิจ
คู่มือนี้มีวิธีการสำหรับพาร์ทเนอร์นักพัฒนาแอปในการผสานรวมเนื้อหาวิดีโอ โดยใช้ Engage SDK เพื่อแสดงเนื้อหาในพื้นที่ใหม่นี้และแพลตฟอร์มของ Google ที่มีอยู่
รายละเอียดการผสานรวม
คำศัพท์
การผสานรวมนี้มีคลัสเตอร์ 3 ประเภท ได้แก่ คำแนะนำ ดูต่อ และแนะนำ
คลัสเตอร์การแนะนำจะแสดงคำแนะนำเนื้อหาที่ปรับเปลี่ยนในแบบของคุณให้รับชม จากพาร์ทเนอร์นักพัฒนาแอปแต่ละราย
คำแนะนำจะมีโครงสร้างดังนี้
คลัสเตอร์คำแนะนำ: มุมมอง UI ที่มีกลุ่มคำแนะนำจากพาร์ทเนอร์นักพัฒนาแอปรายเดียวกัน
รูปที่ 1 UI ของ Entertainment Space ที่แสดง กลุ่มคำแนะนำจากพาร์ทเนอร์รายเดียว เอนทิตี: ออบเจ็กต์ที่แสดงรายการเดียวในคลัสเตอร์ เอนทิตี อาจเป็นภาพยนตร์ รายการทีวี ซีรีส์ รายการวิดีโอสด และอื่นๆ ดูรายการประเภทเอนทิตีที่รองรับได้ในส่วนระบุข้อมูลเอนทิตี
รูปที่ 2 UI ของ Entertainment Space ที่แสดงเอนทิตีเดียวภายในคลัสเตอร์คำแนะนำของพาร์ทเนอร์รายเดียว 
คลัสเตอร์ความต่อเนื่องจะแสดงวิดีโอที่ดูค้างไว้และตอนที่เกี่ยวข้องซึ่งเพิ่งเผยแพร่จากพาร์ทเนอร์นักพัฒนาแอปหลายรายในการจัดกลุ่ม UI เดียว พาร์ทเนอร์นักพัฒนาแอปแต่ละรายจะได้รับอนุญาตให้เผยแพร่เอนทิตีได้สูงสุด 10 รายการในคลัสเตอร์การติดตาม การวิจัยแสดงให้เห็นว่าคำแนะนำที่ปรับเปลี่ยนในแบบของคุณ พร้อมกับเนื้อหาต่อเนื่องที่ปรับเปลี่ยนในแบบของคุณจะสร้างการมีส่วนร่วมของผู้ใช้ได้ดีที่สุด
รูปที่ 3 UI ของ Entertainment Space แสดง คลัสเตอร์ความต่อเนื่องที่มีคำแนะนำที่ดูค้างไว้จากพาร์ทเนอร์หลายราย (ปัจจุบันมองเห็นคำแนะนำเพียงรายการเดียว) คลัสเตอร์แนะนำจะแสดงตัวเลือกเอนทิตีจากพาร์ทเนอร์นักพัฒนาแอปหลายราย ในการจัดกลุ่ม UI เดียว โดยจะมีคลัสเตอร์ "แนะนำ" เพียงคลัสเตอร์เดียว ซึ่งจะแสดงที่ด้านบนของ UI พร้อมการจัดวางที่มีลำดับความสำคัญสูงกว่าคลัสเตอร์คำแนะนำทั้งหมด พาร์ทเนอร์นักพัฒนาแอปแต่ละรายจะได้รับอนุญาตให้ ออกอากาศเอนทิตีได้สูงสุด 10 รายการในคลัสเตอร์แนะนำ
รูปที่ 4 UI ของ Entertainment Space ที่แสดงคลัสเตอร์แนะนำ พร้อมคำแนะนำจากพาร์ทเนอร์หลายราย (ปัจจุบันแสดงคำแนะนำเพียงรายการเดียว) 
สิ่งที่ต้องเตรียมก่อนดำเนินการ
ระดับ 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
สรุป
การออกแบบนี้อิงตามการใช้งานบริการ ที่เชื่อมโยง
ข้อมูลที่ไคลเอ็นต์เผยแพร่ได้จะขึ้นอยู่กับขีดจำกัดต่อไปนี้สำหรับคลัสเตอร์ประเภทต่างๆ
| ประเภทคลัสเตอร์ | ขีดจำกัดของคลัสเตอร์ | ขีดจำกัดสูงสุดของเอนทิตีในคลัสเตอร์ | 
|---|---|---|
| คลัสเตอร์คำแนะนำ | ไม่เกิน 7 | สูงสุด 50 รายการ | 
| คลัสเตอร์ความต่อเนื่อง | มากที่สุด 1 | สูงสุด 20 | 
| คลัสเตอร์แนะนำ | มากที่สุด 1 | สูงสุด 20 | 
ขั้นตอนที่ 0: การย้ายข้อมูลจากการผสานรวม Media Home SDK ที่มีอยู่
แมปรูปแบบข้อมูลจากการผสานรวมที่มีอยู่
หากคุณกำลังย้ายข้อมูลจากการผสานรวมหน้าแรกของสื่อที่มีอยู่ ตารางต่อไปนี้ จะแสดงวิธีแมปโมเดลข้อมูลใน SDK ที่มีอยู่กับ Engage SDK ใหม่
| การผสานรวม MediaHomeVideoContract ที่เทียบเท่า | การผสานรวม Engage 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
     | 
    
      แบ่งออกเป็นบิลเดอร์ในคลาสแยกกัน: 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 เดียว ระบบจะเผยแพร่เอนทิตีทั้งหมดที่อยู่ในคลัสเตอร์พร้อมกับคลัสเตอร์นั้น
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 ได้กำหนดเอนทิตีต่างๆ เพื่อแสดงรายการแต่ละประเภท เรารองรับ เอนทิตีต่อไปนี้สำหรับหมวดหมู่ Watch
แผนภูมิต่อไปนี้แสดงแอตทริบิวต์และข้อกำหนดสำหรับแต่ละประเภท
MovieEntity
| แอตทริบิวต์ | ข้อกำหนด | หมายเหตุ | 
|---|---|---|
| ชื่อ | ต้องระบุ | |
| ภาพโปสเตอร์ | ต้องระบุ | ต้องมีรูปภาพอย่างน้อย 1 รูป และต้องระบุอัตราส่วน
    ภาพ (แนะนำให้ใช้แนวนอน แต่ควรส่งทั้งรูปภาพแนวตั้งและแนวนอน
    สำหรับสถานการณ์ต่างๆ)
     ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ  | 
  
| URI การเล่น | ต้องระบุ | 
       Deep Link ไปยังแอปของผู้ให้บริการเพื่อเริ่มเล่นภาพยนตร์ หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้  | 
  
| URI ของหน้าข้อมูล | ไม่บังคับ | 
       Deep Link ไปยังแอปของผู้ให้บริการเพื่อแสดงรายละเอียดเกี่ยวกับภาพยนตร์ หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้  | 
  
| วันที่วางจำหน่าย | ไม่บังคับ | ในหน่วยมิลลิวินาทีของ Epoch | 
| ความพร้อมใช้งาน | ต้องระบุ | พร้อมใช้งาน: ผู้ใช้สามารถเข้าถึงเนื้อหาได้โดยไม่ต้องดำเนินการใดๆ เพิ่มเติม FREE_WITH_SUBSCRIPTION: เนื้อหาจะพร้อมให้รับชมหลังจากที่ผู้ใช้ ซื้อการสมัครใช้บริการ PAID_CONTENT: เนื้อหาต้องให้ผู้ใช้ซื้อหรือเช่า ซื้อแล้ว: ผู้ใช้ได้ซื้อหรือเช่าเนื้อหา แล้ว  | 
  
| ราคาข้อเสนอ | ไม่บังคับ | ข้อความอิสระ | 
| ระยะเวลา | ต้องระบุ | เป็นมิลลิวินาที | 
| ประเภท | ต้องระบุ | ข้อความอิสระ | 
| การจัดประเภทเนื้อหา | ไม่บังคับ | ข้อความอิสระ ให้เป็นไปตามมาตรฐานอุตสาหกรรม (ตัวอย่าง) | 
| ประเภทของฟีดวิดีโอถัดไป | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและต้องเป็นประเภทใดประเภทหนึ่งต่อไปนี้ CONTINUE: ผู้ใช้ดูเนื้อหานี้ไปแล้วมากกว่า 1 นาที ใหม่: ผู้ใช้ดูเนื้อหาแบบเป็นตอนบางรายการจนครบทุกตอนที่พร้อมให้บริการแล้ว แต่มีตอนใหม่พร้อมให้บริการและมีตอนที่ยังไม่ได้ดูอยู่ 1 ตอน ฟีเจอร์นี้ใช้ได้กับรายการทีวี การแข่งขันฟุตบอลที่บันทึกไว้ใน ซีรีส์ และอื่นๆ ถัดไป: ผู้ใช้ดูเนื้อหาแบบเป็นตอนจบไปแล้วอย่างน้อย 1 ตอน แต่ยังเหลือเนื้อหาอีกมากกว่า 1 ตอน หรือเหลือเพียง 1 ตอน โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป  | 
  
| เวลาในการมีส่วนร่วมครั้งล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่อง ในรูปแบบช่วงเวลา เป็นมิลลิวินาที | 
| เวลาตำแหน่งการเล่นล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่องและ WatchNextType เป็น CONTINUE ในหน่วยมิลลิวินาทีของ Epoch | 
TvShowEntity
| แอตทริบิวต์ | ข้อกำหนด | หมายเหตุ | 
|---|---|---|
| ชื่อ | ต้องระบุ | |
| ภาพโปสเตอร์ | ต้องระบุ | ต้องมีรูปภาพอย่างน้อย 1 รูป และต้องระบุอัตราส่วน
    ภาพ (แนะนำให้ใช้แนวนอน แต่ควรส่งทั้งรูปภาพแนวตั้งและแนวนอน
    สำหรับสถานการณ์ต่างๆ)
      ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ  | 
  
| URI ของหน้าข้อมูล | ต้องระบุ | 
       Deep Link ไปยังแอปของผู้ให้บริการเพื่อแสดงรายละเอียดของรายการทีวี หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้  | 
  
| URI การเล่น | ไม่บังคับ | 
       Deep Link ไปยังแอปของผู้ให้บริการเพื่อเริ่มเล่นรายการทีวี หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้  | 
  
| วันที่ออกอากาศตอนแรก | ไม่บังคับ | ในหน่วยมิลลิวินาทีของ Epoch | 
| วันที่ออกอากาศของตอนล่าสุด | ไม่บังคับ | ในหน่วยมิลลิวินาทีของ Epoch | 
| ความพร้อมใช้งาน | ต้องระบุ | พร้อมใช้งาน: ผู้ใช้สามารถเข้าถึงเนื้อหาได้โดยไม่ต้องดำเนินการใดๆ เพิ่มเติม FREE_WITH_SUBSCRIPTION: เนื้อหาจะพร้อมให้รับชมหลังจากที่ผู้ใช้ ซื้อการสมัครใช้บริการ PAID_CONTENT: เนื้อหาต้องให้ผู้ใช้ซื้อหรือเช่า ซื้อแล้ว: ผู้ใช้ได้ซื้อหรือเช่าเนื้อหา แล้ว  | 
  
| ราคาข้อเสนอ | ไม่บังคับ | ข้อความอิสระ | 
| จำนวนซีซัน | ต้องระบุ | จำนวนเต็มบวก | 
| ประเภท | ต้องระบุ | ข้อความอิสระ | 
| การจัดประเภทเนื้อหา | ไม่บังคับ | ข้อความอิสระ ให้เป็นไปตามมาตรฐานอุตสาหกรรม (ตัวอย่าง) | 
| ประเภทของฟีดวิดีโอถัดไป | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและต้องเป็นประเภทใดประเภทหนึ่งต่อไปนี้ CONTINUE: ผู้ใช้ดูเนื้อหานี้ไปแล้วมากกว่า 1 นาที ใหม่: ผู้ใช้ดูเนื้อหาแบบเป็นตอนบางรายการจนครบทุกตอนที่พร้อมให้บริการแล้ว แต่มีตอนใหม่พร้อมให้บริการและมีตอนที่ยังไม่ได้ดูอยู่ 1 ตอน ฟีเจอร์นี้ใช้ได้กับรายการทีวี การแข่งขันฟุตบอลที่บันทึกไว้ใน ซีรีส์ และอื่นๆ ถัดไป: ผู้ใช้ดูเนื้อหาแบบเป็นตอนจบไปแล้วอย่างน้อย 1 ตอน แต่ยังเหลือเนื้อหาอีกมากกว่า 1 ตอน หรือเหลือเพียง 1 ตอน โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป  | 
  
| เวลาในการมีส่วนร่วมครั้งล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่อง ในรูปแบบช่วงเวลา เป็นมิลลิวินาที | 
| เวลาตำแหน่งการเล่นล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่องและ WatchNextType เป็น CONTINUE ในหน่วยมิลลิวินาทีของ Epoch | 
TvSeasonEntity
| แอตทริบิวต์ | ข้อกำหนด | หมายเหตุ | 
|---|---|---|
| ชื่อ | ต้องระบุ | |
| ภาพโปสเตอร์ | ต้องระบุ | ต้องมีรูปภาพอย่างน้อย 1 รูป และต้องระบุอัตราส่วน
    ภาพ (แนะนำให้ใช้แนวนอน แต่ควรส่งทั้งรูปภาพแนวตั้งและแนวนอน
    สำหรับสถานการณ์ต่างๆ)
      ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ  | 
  
| URI ของหน้าข้อมูล | ต้องระบุ | 
       Deep Link ไปยังแอปของผู้ให้บริการเพื่อแสดงรายละเอียดของรายการทีวี ซีซัน หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้  | 
  
| URI การเล่น | ไม่บังคับ | 
       Deep Link ไปยังแอปของผู้ให้บริการเพื่อเริ่มเล่นรายการทีวี ซีซัน หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้  | 
  
| แสดงหมายเลขซีซัน | 
        ไม่บังคับ พร้อมใช้งานในเวอร์ชัน 1.3.1  | 
    สตริง | 
| วันที่ออกอากาศตอนแรก | ไม่บังคับ | ในหน่วยมิลลิวินาทีของ Epoch | 
| วันที่ออกอากาศของตอนล่าสุด | ไม่บังคับ | ในหน่วยมิลลิวินาทีของ Epoch | 
| ความพร้อมใช้งาน | ต้องระบุ | พร้อมใช้งาน: ผู้ใช้สามารถเข้าถึงเนื้อหาได้โดยไม่ต้องดำเนินการใดๆ เพิ่มเติม FREE_WITH_SUBSCRIPTION: เนื้อหาจะพร้อมให้รับชมหลังจากที่ผู้ใช้ ซื้อการสมัครใช้บริการ PAID_CONTENT: เนื้อหาต้องให้ผู้ใช้ซื้อหรือเช่า ซื้อแล้ว: ผู้ใช้ได้ซื้อหรือเช่าเนื้อหา แล้ว  | 
  
| ราคาข้อเสนอ | ไม่บังคับ | ข้อความอิสระ | 
| จำนวนตอน | ต้องระบุ | จำนวนเต็มบวก | 
| ประเภท | ต้องระบุ | ข้อความอิสระ | 
| การจัดประเภทเนื้อหา | ไม่บังคับ | ข้อความอิสระ ให้เป็นไปตามมาตรฐานอุตสาหกรรม (ตัวอย่าง) | 
| ประเภทของฟีดวิดีโอถัดไป | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและต้องเป็นประเภทใดประเภทหนึ่งต่อไปนี้ CONTINUE: ผู้ใช้ดูเนื้อหานี้ไปแล้วมากกว่า 1 นาที ใหม่: ผู้ใช้ดูเนื้อหาแบบเป็นตอนบางรายการจนครบทุกตอนที่พร้อมให้บริการแล้ว แต่มีตอนใหม่พร้อมให้บริการและมีตอนที่ยังไม่ได้ดูอยู่ 1 ตอน ฟีเจอร์นี้ใช้ได้กับรายการทีวี การแข่งขันฟุตบอลที่บันทึกไว้ใน ซีรีส์ และอื่นๆ ถัดไป: ผู้ใช้ดูเนื้อหาแบบเป็นตอนจบไปแล้วอย่างน้อย 1 ตอน แต่ยังเหลือเนื้อหาอีกมากกว่า 1 ตอน หรือเหลือเพียง 1 ตอน โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป  | 
  
| เวลาในการมีส่วนร่วมครั้งล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่อง ในรูปแบบช่วงเวลา เป็นมิลลิวินาที | 
| เวลาตำแหน่งการเล่นล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่องและ WatchNextType เป็น CONTINUE ในหน่วยมิลลิวินาทีของ Epoch | 
TvEpisodeEntity
| แอตทริบิวต์ | ข้อกำหนด | หมายเหตุ | 
|---|---|---|
| ชื่อ | ต้องระบุ | |
| ภาพโปสเตอร์ | ต้องระบุ | ต้องมีรูปภาพอย่างน้อย 1 รูป และต้องระบุอัตราส่วน
    ภาพ (แนะนำให้ใช้แนวนอน แต่ควรส่งทั้งรูปภาพแนวตั้งและแนวนอน
    สำหรับสถานการณ์ต่างๆ)
      ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ  | 
  
| URI การเล่น | ต้องระบุ | 
       Deep Link ไปยังแอปของผู้ให้บริการเพื่อเริ่มเล่นตอน หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้  | 
  
| URI ของหน้าข้อมูล | ไม่บังคับ | 
       Deep Link ไปยังแอปของผู้ให้บริการเพื่อแสดงรายละเอียดเกี่ยวกับรายการทีวี ตอน หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้  | 
  
| แสดงหมายเลขตอน | 
       ไม่บังคับ พร้อมใช้งานในเวอร์ชัน 1.3.1  | 
    สตริง | 
| วันที่ออกอากาศ | ต้องระบุ | ในหน่วยมิลลิวินาทีของ Epoch | 
| ความพร้อมใช้งาน | ต้องระบุ | พร้อมใช้งาน: ผู้ใช้สามารถเข้าถึงเนื้อหาได้โดยไม่ต้องดำเนินการใดๆ เพิ่มเติม FREE_WITH_SUBSCRIPTION: เนื้อหาจะพร้อมให้รับชมหลังจากที่ผู้ใช้ ซื้อการสมัครใช้บริการ PAID_CONTENT: เนื้อหาต้องให้ผู้ใช้ซื้อหรือเช่า ซื้อแล้ว: ผู้ใช้ได้ซื้อหรือเช่าเนื้อหา แล้ว  | 
  
| ราคาข้อเสนอ | ไม่บังคับ | ข้อความอิสระ | 
| ระยะเวลา | ต้องระบุ | ต้องเป็นค่าบวกในหน่วยมิลลิวินาที | 
| ประเภท | ต้องระบุ | ข้อความอิสระ | 
| การจัดประเภทเนื้อหา | ไม่บังคับ | ข้อความอิสระ ให้เป็นไปตามมาตรฐานอุตสาหกรรม (ตัวอย่าง) | 
| ประเภทของฟีดวิดีโอถัดไป | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและต้องเป็นประเภทใดประเภทหนึ่งต่อไปนี้ CONTINUE: ผู้ใช้ดูเนื้อหานี้ไปแล้วมากกว่า 1 นาที ใหม่: ผู้ใช้ดูเนื้อหาแบบเป็นตอนบางรายการจนครบทุกตอนที่พร้อมให้บริการแล้ว แต่มีตอนใหม่พร้อมให้บริการและมีตอนที่ยังไม่ได้ดูอยู่ 1 ตอน ฟีเจอร์นี้ใช้ได้กับรายการทีวี การแข่งขันฟุตบอลที่บันทึกไว้ใน ซีรีส์ และอื่นๆ ถัดไป: ผู้ใช้ดูเนื้อหาแบบเป็นตอนจบไปแล้วอย่างน้อย 1 ตอน แต่ยังเหลือเนื้อหาอีกมากกว่า 1 ตอน หรือเหลือเพียง 1 ตอน โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป  | 
  
| เวลาในการมีส่วนร่วมครั้งล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่อง ในรูปแบบช่วงเวลา เป็นมิลลิวินาที | 
| เวลาตำแหน่งการเล่นล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่องและ WatchNextType เป็น CONTINUE ในหน่วยมิลลิวินาทีของ Epoch | 
LiveStreamingVideoEntity
| แอตทริบิวต์ | ข้อกำหนด | หมายเหตุ | 
|---|---|---|
| ชื่อ | ต้องระบุ | |
| ภาพโปสเตอร์ | ต้องระบุ | ต้องมีรูปภาพอย่างน้อย 1 รูป และต้องระบุอัตราส่วน
    ภาพ (แนะนำให้ใช้แนวนอน แต่ควรส่งทั้งรูปภาพแนวตั้งและแนวนอน
    สำหรับสถานการณ์ต่างๆ)
      ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ  | 
  
| URI การเล่น | ต้องระบุ | 
       Deep Link ไปยังแอปของผู้ให้บริการเพื่อเริ่มเล่นวิดีโอ หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้  | 
  
| ผู้เผยแพร่ | ต้องระบุ | ข้อความอิสระ | 
| เวลาเริ่มต้น | ไม่บังคับ | ในหน่วยมิลลิวินาทีของ Epoch | 
| เวลาสิ้นสุด | ไม่บังคับ | ในหน่วยมิลลิวินาทีของ Epoch | 
| ยอดดู | ไม่บังคับ | ข้อความอิสระ ต้องมีการแปล | 
| ประเภทของฟีดวิดีโอถัดไป | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและต้องเป็นประเภทใดประเภทหนึ่งต่อไปนี้ CONTINUE: ผู้ใช้ดูเนื้อหานี้ไปแล้วมากกว่า 1 นาที ใหม่: ผู้ใช้ดูเนื้อหาแบบเป็นตอนบางรายการจนครบทุกตอนที่พร้อมให้บริการแล้ว แต่มีตอนใหม่พร้อมให้บริการและมีตอนที่ยังไม่ได้ดูอยู่ 1 ตอน ฟีเจอร์นี้ใช้ได้กับรายการทีวี การแข่งขันฟุตบอลที่บันทึกไว้ใน ซีรีส์ และอื่นๆ ถัดไป: ผู้ใช้ดูเนื้อหาแบบเป็นตอนจบไปแล้วอย่างน้อย 1 ตอน แต่ยังเหลือเนื้อหาอีกมากกว่า 1 ตอน หรือเหลือเพียง 1 ตอน โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป  | 
  
| เวลาในการมีส่วนร่วมครั้งล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่อง ในรูปแบบช่วงเวลา เป็นมิลลิวินาที | 
| เวลาตำแหน่งการเล่นล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่องและ WatchNextType เป็น CONTINUE ในหน่วยมิลลิวินาทีของ Epoch | 
VideoClipEntity
ออบเจ็กต์ VideoClipEntity แสดงถึงเอนทิตีวิดีโอที่มาจากโซเชียลมีเดีย
เช่น TikTok หรือ YouTube
| แอตทริบิวต์ | ข้อกำหนด | หมายเหตุ | 
|---|---|---|
| ชื่อ | ต้องระบุ | |
| ภาพโปสเตอร์ | ต้องระบุ | ต้องมีรูปภาพอย่างน้อย 1 รูป และต้องระบุอัตราส่วน
    ภาพ (แนะนำให้ใช้แนวนอน แต่ควรส่งทั้งรูปภาพแนวตั้งและแนวนอน
    สำหรับสถานการณ์ต่างๆ)
     ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ  | 
  
| URI การเล่น | ต้องระบุ | 
       Deep Link ไปยังแอปของผู้ให้บริการเพื่อเริ่มเล่นวิดีโอ หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้  | 
  
| วันที่สร้าง | ต้องระบุ | ในหน่วยมิลลิวินาทีของ Epoch | 
| ระยะเวลา | ต้องระบุ | ต้องเป็นค่าบวกในหน่วยมิลลิวินาที | 
| ผู้สร้าง | ต้องระบุ | ข้อความอิสระ | 
| รูปภาพครีเอเตอร์ | ไม่บังคับ | รูปภาพอวาตาร์ของครีเอเตอร์ | 
| ยอดดู | ไม่บังคับ | ข้อความอิสระ ต้องมีการแปล | 
| ประเภทของฟีดวิดีโอถัดไป | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและต้องเป็นประเภทใดประเภทหนึ่งต่อไปนี้ CONTINUE: ผู้ใช้ดูเนื้อหานี้ไปแล้วมากกว่า 1 นาที ใหม่: ผู้ใช้ดูเนื้อหาแบบเป็นตอนบางรายการจนครบทุกตอนที่พร้อมให้บริการแล้ว แต่มีตอนใหม่พร้อมให้บริการและมีตอนที่ยังไม่ได้ดูอยู่ 1 ตอน ฟีเจอร์นี้ใช้ได้กับรายการทีวี การแข่งขันฟุตบอลที่บันทึกไว้ใน ซีรีส์ และอื่นๆ ถัดไป: ผู้ใช้ดูเนื้อหาแบบเป็นตอนจบไปแล้วอย่างน้อย 1 ตอน แต่ยังเหลือเนื้อหาอีกมากกว่า 1 ตอน หรือเหลือเพียง 1 ตอน โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป  | 
  
| เวลาในการมีส่วนร่วมครั้งล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่อง ในรูปแบบช่วงเวลา เป็นมิลลิวินาที | 
| เวลาตำแหน่งการเล่นล่าสุด | ต้องมีแบบมีเงื่อนไข | ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์ความต่อเนื่องและ WatchNextType เป็น CONTINUE ในหน่วยมิลลิวินาทีของ Epoch | 
ข้อกำหนดเกี่ยวกับรูปภาพ
ส่วนต่อไปนี้แสดงข้อกำหนดที่จำเป็นสำหรับชิ้นงานรูปภาพ
รูปแบบไฟล์
PNG, JPG, GIF แบบภาพนิ่ง, WebP
ขนาดไฟล์สูงสุด
5120 KB
คำแนะนำเพิ่มเติม
- พื้นที่ปลอดภัยของรูปภาพ: ใส่เนื้อหาที่สําคัญไว้ตรงกลาง 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 ต่อไปนี้พร้อมใช้งานในไคลเอ็นต์
isServiceAvailablepublishRecommendationClusterspublishFeaturedClusterpublishContinuationClusterpublishUserAccountManagementRequestupdatePublishStatusdeleteRecommendationsClustersdeleteFeaturedClusterdeleteContinuationClusterdeleteUserManagementClusterdeleteClusters
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ที่มีอยู่จากพาร์ทเนอร์นักพัฒนาออก - ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอใน Continuation Cluster ที่อัปเดต
 
ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะเดิมไว้
publishUserAccountManagementRequest
API นี้ใช้เพื่อเผยแพร่การ์ดลงชื่อเข้าใช้ การดำเนินการลงชื่อเข้าใช้นำผู้ใช้ไปยังหน้าลงชื่อเข้าใช้ของแอปเพื่อให้แอปเผยแพร่เนื้อหา (หรือแสดงเนื้อหาที่ปรับเปลี่ยนในแบบของคุณมากขึ้น) ได้
ข้อมูลเมตาต่อไปนี้เป็นส่วนหนึ่งของการ์ดลงชื่อเข้าใช้
| แอตทริบิวต์ | ข้อกำหนด | คำอธิบาย | 
|---|---|---|
| URI ของการดำเนินการ | ต้องระบุ | Deep Link ไปยังการดำเนินการ (เช่น ไปยังหน้าลงชื่อเข้าใช้แอป) | 
| รูปภาพ | ไม่บังคับ - หากไม่ได้ระบุ ต้องระบุชื่อ | 
       รูปภาพที่แสดงในการ์ด รูปภาพที่มีสัดส่วนภาพ 16x9 และความละเอียด 1264x712  | 
  
| ชื่อ | ไม่บังคับ - หากไม่ได้ระบุไว้ จะต้องระบุรูปภาพ | ชื่อบนบัตร | 
| ข้อความการดำเนินการ | ไม่บังคับ | ข้อความที่แสดงใน CTA (เช่น ลงชื่อเข้าใช้) | 
| ชื่อรอง | ไม่บังคับ | คำบรรยายแทนเสียงที่ไม่บังคับในการ์ด | 
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ที่มีอยู่จากพาร์ทเนอร์นักพัฒนาออก - ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอในคลัสเตอร์ UserAccountManagementCluster ที่อัปเดต
 
ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะเดิมไว้
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 พร้อมสาเหตุที่รวมเป็นรหัสข้อผิดพลาด
| รหัสข้อผิดพลาด | ชื่อข้อผิดพลาด | หมายเหตุ | 
|---|---|---|
1 | 
    SERVICE_NOT_FOUND | 
    บริการไม่พร้อมใช้งานในอุปกรณ์ที่ระบุ | 
2 | 
    SERVICE_NOT_AVAILABLE | 
    บริการพร้อมใช้งานในอุปกรณ์ที่ระบุ แต่ไม่พร้อมใช้งาน ในเวลาที่โทร (เช่น ปิดใช้บริการอย่างชัดเจน) | 
3 | 
    SERVICE_CALL_EXECUTION_FAILURE | 
    การดำเนินการงานล้มเหลวเนื่องจากปัญหาการแยกเธรด ในกรณีนี้ คุณสามารถ ลองอีกครั้งได้ | 
4 | 
    SERVICE_CALL_PERMISSION_DENIED | 
    ผู้โทรไม่ได้รับอนุญาตให้โทรหาบริการ | 
5 | 
    SERVICE_CALL_INVALID_ARGUMENT | 
    คำขอมีข้อมูลที่ไม่ถูกต้อง (เช่น มีคลัสเตอร์มากกว่าจำนวนที่อนุญาต) | 
6 | 
    SERVICE_CALL_INTERNAL | 
    เกิดข้อผิดพลาดที่ฝั่งบริการ | 
7 | 
    SERVICE_CALL_RESOURCE_EXHAUSTED | 
    มีการเรียกใช้บริการบ่อยเกินไป | 
ขั้นตอนที่ 3: จัดการ Intent การออกอากาศ
นอกเหนือจากการเรียกใช้ API การเผยแพร่เนื้อหาผ่านงานแล้ว คุณยังต้องตั้งค่า
BroadcastReceiver เพื่อรับ
คำขอเผยแพร่เนื้อหาด้วย
เป้าหมายของความตั้งใจในการออกอากาศคือการเปิดใช้งานแอปอีกครั้งและการบังคับซิงค์ข้อมูลเป็นหลัก Broadcast Intents ไม่ได้ออกแบบมาให้ส่งบ่อยมาก ระบบจะทริกเกอร์การอัปเดตก็ต่อเมื่อบริการ Engage ระบุว่าเนื้อหาอาจล้าสมัย (เช่น มีอายุ 1 สัปดาห์) ด้วยวิธีนี้ ผู้ใช้จึงมั่นใจได้มากขึ้นว่าจะได้รับประสบการณ์การใช้งานเนื้อหาใหม่ๆ แม้ว่าจะไม่ได้เรียกใช้แอปพลิเคชันเป็นเวลานานก็ตาม
ต้องตั้งค่า BroadcastReceiver ด้วย 2 วิธีต่อไปนี้
ลงทะเบียนอินสแตนซ์ของคลาส
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),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)
// Register Featured Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_FEATURED),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)
// Register Continuation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_CONTINUATION),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)
}
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),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);
// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);
// Register Continuation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_CONTINUATION),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);
}
ประกาศการติดตั้งใช้งานแบบคงที่ด้วยแท็ก
<receiver>ในไฟล์AndroidManifest.xmlซึ่งจะช่วยให้แอปพลิเคชันรับ Broadcast Intent ได้เมื่อไม่ได้ทำงานอยู่ และยังช่วยให้แอปพลิเคชันเผยแพร่ เนื้อหาได้ด้วย
<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:permission="com.google.android.engage.REQUEST_ENGAGE_DATA"
      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>
บริการจะส่ง Intent ต่อไปนี้
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
คำถามที่พบบ่อย
ดูคำถามที่พบบ่อยได้ที่คำถามที่พบบ่อยเกี่ยวกับ Engage SDK
รายชื่อติดต่อ
โปรดติดต่อ
engage-developers@google.com หากมีคำถาม
ในระหว่างกระบวนการผสานรวม
ขั้นตอนถัดไป
หลังจากผสานรวมเสร็จสมบูรณ์แล้ว ขั้นตอนถัดไปมีดังนี้
- ส่งอีเมลไปที่
engage-developers@google.comและแนบ APK ที่ผสานรวมแล้วซึ่งพร้อมให้ Google ทดสอบ - Google จะทำการยืนยันและตรวจสอบภายในเพื่อให้แน่ใจว่าการผสานรวมทำงานได้ตามที่คาดไว้ หากจำเป็นต้องเปลี่ยนแปลง Google จะติดต่อคุณพร้อมรายละเอียดที่จำเป็น
 - เมื่อการทดสอบเสร็จสมบูรณ์และไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ Google จะติดต่อคุณเพื่อ แจ้งให้ทราบว่าคุณเริ่มเผยแพร่ APK ที่อัปเดตและผสานรวมไปยัง Play Store ได้แล้ว
 - หลังจาก Google ยืนยันว่า APK ที่อัปเดตแล้วได้รับการเผยแพร่ใน Play Store แล้ว ระบบอาจเผยแพร่คลัสเตอร์แนะนำ แนะนำ และเล่นต่อ และผู้ใช้จะมองเห็นคลัสเตอร์ดังกล่าว