การดู SDK ของ Engage: คำแนะนำการผสานรวมทางเทคนิคของบุคคลที่สาม

กระตุ้นการมีส่วนร่วมในแอปด้วยการเข้าถึงผู้ใช้ในที่ที่ผู้ใช้อยู่ ผสานรวม 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 ของแท็บความบันเทิงแสดง คลัสเตอร์การดูต่อพร้อมคำแนะนำที่ยังไม่เสร็จจากพาร์ทเนอร์หลายราย (ปัจจุบันมองเห็นคำแนะนำเพียงรายการเดียว)
  • คลัสเตอร์แนะนำจะแสดงเอนทิตีที่เลือกจากพาร์ทเนอร์นักพัฒนาแอปหลายราย ในกลุ่ม 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 ได้กำหนดเอนทิตีต่างๆ เพื่อแสดงรายการแต่ละประเภท เรารองรับ เอนทิตีต่อไปนี้สำหรับหมวดหมู่ "ดู"

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

แผนภูมิต่อไปนี้แสดงแอตทริบิวต์และข้อกำหนดสำหรับแต่ละประเภท

MovieEntity

แอตทริบิวต์ ข้อกำหนด หมายเหตุ
ชื่อ ต้องระบุ
ภาพโปสเตอร์ ต้องระบุ ต้องมีรูปภาพอย่างน้อย 1 รูป และต้องระบุอัตราส่วนภาพ (แนะนำให้ใช้แนวนอน แต่ควรส่งทั้งรูปภาพแนวตั้งและแนวนอน สำหรับสถานการณ์ต่างๆ)

ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ

URI การเล่น ต้องระบุ

Deep Link ไปยังแอปของผู้ให้บริการเพื่อเริ่มเล่นภาพยนตร์

หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้

URI ของหน้าข้อมูล ไม่บังคับ

Deep Link ไปยังแอปของผู้ให้บริการเพื่อแสดงรายละเอียดเกี่ยวกับภาพยนตร์

หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้

วันที่วางจำหน่าย ไม่บังคับ ในหน่วยมิลลิวินาทีของ Epoch
ความพร้อมใช้งาน ต้องระบุ

พร้อมใช้งาน: ผู้ใช้สามารถเข้าถึงเนื้อหาได้โดยไม่ต้องดำเนินการใดๆ เพิ่มเติม

FREE_WITH_SUBSCRIPTION: เนื้อหาจะพร้อมให้รับชมหลังจากที่ผู้ใช้ ซื้อการสมัครใช้บริการ

PAID_CONTENT: เนื้อหาต้องให้ผู้ใช้ซื้อหรือเช่า

ซื้อแล้ว: ผู้ใช้ได้ซื้อหรือเช่าเนื้อหา แล้ว

ราคาข้อเสนอ ไม่บังคับ ข้อความอิสระ
ระยะเวลา ต้องระบุ เป็นมิลลิวินาที
ประเภท ต้องระบุ ข้อความอิสระ
การจัดประเภทเนื้อหา ไม่บังคับ ข้อความอิสระ ให้เป็นไปตามมาตรฐานอุตสาหกรรม (ตัวอย่าง)
ประเภทของฟีดวิดีโอถัดไป ต้องมีแบบมีเงื่อนไข

ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและต้องเป็นประเภทใดประเภทหนึ่งต่อไปนี้

CONTINUE: ผู้ใช้ดูเนื้อหานี้ไปแล้วมากกว่า 1 นาที

ใหม่: ผู้ใช้ดูเนื้อหาแบบเป็นตอนบางรายการจนครบทุกตอนที่พร้อมให้บริการแล้ว แต่มีตอนใหม่พร้อมให้บริการและมีตอนที่ยังไม่ได้ดูอยู่ 1 ตอน ซึ่งใช้ได้กับรายการทีวี การแข่งขันฟุตบอลที่บันทึกไว้ใน ซีรีส์ และอื่นๆ

ถัดไป: ผู้ใช้ดูตอนที่สมบูรณ์อย่างน้อย 1 ตอนจากเนื้อหาแบบเป็นตอน แต่ยังเหลือตอนอีกมากกว่า 1 ตอน หรือเหลือตอนอีก 1 ตอนพอดี โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน

รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป

เวลาที่มีส่วนร่วมครั้งล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตาม ในรูปแบบ Epoch มิลลิวินาที
เวลาตำแหน่งการเล่นล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและ 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 ตอนพอดี โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน

รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป

เวลาที่มีส่วนร่วมครั้งล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตาม ในรูปแบบ Epoch มิลลิวินาที
เวลาตำแหน่งการเล่นล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและ 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 ตอนพอดี โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน

รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป

เวลาที่มีส่วนร่วมครั้งล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตาม ในรูปแบบ Epoch มิลลิวินาที
เวลาตำแหน่งการเล่นล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและ 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 ตอนพอดี โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน

รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป

เวลาที่มีส่วนร่วมครั้งล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตาม ในรูปแบบ Epoch มิลลิวินาที
เวลาตำแหน่งการเล่นล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและ WatchNextType เป็น CONTINUE ในหน่วยมิลลิวินาทีของ Epoch

LiveStreamingVideoEntity

แอตทริบิวต์ ข้อกำหนด หมายเหตุ
ชื่อ ต้องระบุ
ภาพโปสเตอร์ ต้องระบุ ต้องมีรูปภาพอย่างน้อย 1 รูป และต้องระบุอัตราส่วน ภาพ (แนะนำให้ใช้แนวนอน แต่ควรส่งทั้งรูปภาพแนวตั้งและแนวนอน สำหรับสถานการณ์ต่างๆ)

ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ

URI การเล่น ต้องระบุ

Deep Link ไปยังแอปของผู้ให้บริการเพื่อเริ่มเล่นวิดีโอ

หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้

ผู้เผยแพร่ ต้องระบุ ข้อความอิสระ
เวลาเริ่มต้น ไม่บังคับ ในหน่วยมิลลิวินาทีของ Epoch
เวลาสิ้นสุด ไม่บังคับ ในหน่วยมิลลิวินาทีของ Epoch
ยอดดู ไม่บังคับ ข้อความอิสระ ต้องมีการแปล
ประเภทของฟีดวิดีโอถัดไป ต้องมีแบบมีเงื่อนไข

ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและต้องเป็นประเภทใดประเภทหนึ่งต่อไปนี้

CONTINUE: ผู้ใช้ดูเนื้อหานี้ไปแล้วมากกว่า 1 นาที

ใหม่: ผู้ใช้ดูเนื้อหาแบบเป็นตอนบางรายการจนครบทุกตอนที่พร้อมให้บริการแล้ว แต่มีตอนใหม่พร้อมให้บริการและมีตอนที่ยังไม่ได้ดูอยู่ 1 ตอน ซึ่งใช้ได้กับรายการทีวี การแข่งขันฟุตบอลที่บันทึกไว้ใน ซีรีส์ และอื่นๆ

ถัดไป: ผู้ใช้ดูตอนที่สมบูรณ์อย่างน้อย 1 ตอนจากเนื้อหาแบบเป็นตอน แต่ยังเหลือตอนอีกมากกว่า 1 ตอน หรือเหลือตอนอีก 1 ตอนพอดี โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน

รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป

เวลาที่มีส่วนร่วมครั้งล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตาม ในรูปแบบ Epoch มิลลิวินาที
เวลาตำแหน่งการเล่นล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและ WatchNextType เป็น CONTINUE ในหน่วยมิลลิวินาทีของ Epoch

VideoClipEntity

ออบเจ็กต์ VideoClipEntity แสดงถึงเอนทิตีวิดีโอที่มาจากโซเชียลมีเดีย เช่น TikTok หรือ YouTube

แอตทริบิวต์ ข้อกำหนด หมายเหตุ
ชื่อ ต้องระบุ
ภาพโปสเตอร์ ต้องระบุ ต้องมีรูปภาพอย่างน้อย 1 รูป และต้องระบุอัตราส่วนภาพ (แนะนำให้ใช้แนวนอน แต่ควรส่งทั้งรูปภาพแนวตั้งและแนวนอน สำหรับสถานการณ์ต่างๆ)

ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ

URI การเล่น ต้องระบุ

Deep Link ไปยังแอปของผู้ให้บริการเพื่อเริ่มเล่นวิดีโอ

หมายเหตุ: คุณใช้ Deep Link สำหรับการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้

วันที่สร้าง ต้องระบุ ในหน่วยมิลลิวินาทีของ Epoch
ระยะเวลา ต้องระบุ ต้องเป็นค่าบวกในหน่วยมิลลิวินาที
ผู้สร้าง ต้องระบุ ข้อความอิสระ
รูปภาพครีเอเตอร์ ไม่บังคับ รูปภาพอวาตาร์ของครีเอเตอร์
ยอดดู ไม่บังคับ ข้อความอิสระ ต้องมีการแปล
ประเภทของฟีดวิดีโอถัดไป ต้องมีแบบมีเงื่อนไข

ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและต้องเป็นประเภทใดประเภทหนึ่งต่อไปนี้

CONTINUE: ผู้ใช้ดูเนื้อหานี้ไปแล้วมากกว่า 1 นาที

ใหม่: ผู้ใช้ดูเนื้อหาแบบเป็นตอนบางรายการจนครบทุกตอนที่พร้อมให้บริการแล้ว แต่มีตอนใหม่พร้อมให้บริการและมีตอนที่ยังไม่ได้ดูอยู่ 1 ตอน ซึ่งใช้ได้กับรายการทีวี การแข่งขันฟุตบอลที่บันทึกไว้ใน ซีรีส์ และอื่นๆ

ถัดไป: ผู้ใช้ดูตอนที่สมบูรณ์อย่างน้อย 1 ตอนจากเนื้อหาแบบเป็นตอน แต่ยังเหลือตอนอีกมากกว่า 1 ตอน หรือเหลือตอนอีก 1 ตอนพอดี โดยตอนสุดท้ายไม่ใช่ตอน "ใหม่" และเผยแพร่ก่อนที่ผู้ใช้จะเริ่มดูเนื้อหาแบบเป็นตอน

รายการที่อยากดู: ผู้ใช้เลือกที่จะเพิ่มภาพยนตร์ กิจกรรม หรือ ซีรีส์ลงในรายการที่อยากดูอย่างชัดเจนเพื่อดูแลจัดการด้วยตนเองว่าต้องการดูอะไร ต่อไป

เวลาที่มีส่วนร่วมครั้งล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตาม ในรูปแบบ Epoch มิลลิวินาที
เวลาตำแหน่งการเล่นล่าสุด ต้องมีแบบมีเงื่อนไข ต้องระบุเมื่อรายการอยู่ในคลัสเตอร์การติดตามและ 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 ต่อไปนี้พร้อมใช้งานในไคลเอ็นต์

  • 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 ที่มีอยู่จากพาร์ทเนอร์นักพัฒนาแอปออก
  • ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอใน 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();

เมื่อบริการได้รับคำขอ ระบบจะนำข้อมูลที่มีอยู่ออกจาก คลัสเตอร์การจัดการบัญชีผู้ใช้ ในกรณีที่เกิดข้อผิดพลาด ระบบจะปฏิเสธคำขอทั้งหมดและคงสถานะเดิมไว้

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 Intent คือการเปิดใช้งานแอปอีกครั้งและการบังคับซิงค์ข้อมูลเป็นหลัก 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 แล้ว ระบบอาจเผยแพร่คลัสเตอร์แนะนำ แนะนำ และเล่นต่อ และผู้ใช้จะมองเห็นคลัสเตอร์ดังกล่าว