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

Google กำลังสร้างแพลตฟอร์มในอุปกรณ์ที่จัดระเบียบแอปของผู้ใช้ตามประเภทธุรกิจ และมอบประสบการณ์การใช้งานเนื้อหาแอปที่ปรับเปลี่ยนในแบบของคุณและค้นพบเนื้อหาใหม่ๆ ประสบการณ์แบบเต็มหน้าจอนี้เปิดโอกาสให้พาร์ทเนอร์นักพัฒนาแอปได้แสดงเนื้อหาริชมีเดียที่ดีที่สุดในช่องทางเฉพาะนอกแอป

คู่มือนี้มีวิธีการสำหรับพาร์ทเนอร์นักพัฒนาแอปในการผสานรวมเนื้อหาวิดีโอโดยใช้ 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

สรุป

การออกแบบนี้อิงตามการใช้งาน bound service

ข้อมูลที่จะเผยแพร่ได้จะขึ้นอยู่กับขีดจํากัดต่อไปนี้สําหรับคลัสเตอร์ประเภทต่างๆ

ประเภทคลัสเตอร์ ขีดจํากัดของคลัสเตอร์ ขีดจํากัดสูงสุดของเอนทิตีในคลัสเตอร์
กลุ่มคําแนะนํา ไม่เกิน 7 ไม่เกิน 50
คลัสเตอร์การต่อเรื่อง ไม่เกิน 1 ไม่เกิน 20
คลัสเตอร์แนะนำ ไม่เกิน 1 ไม่เกิน 20

ขั้นตอนที่ 0: การย้ายข้อมูลจากการผสานรวม Media Home SDK ที่มีอยู่

แมปโมเดลข้อมูลจากการผสานรวมที่มีอยู่

หากคุณจะย้ายข้อมูลจากการผสานรวม Media Home ที่มีอยู่ ตารางต่อไปนี้จะแสดงวิธีจับคู่โมเดลข้อมูลใน SDK ที่มีอยู่กับ Engage SDK ใหม่

การผสานรวม MediaHomeVideoContract ที่เทียบเท่า การผสานรวม SDK ของ Engage ที่เทียบเท่า
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 เพื่อการระบุแหล่งที่มาได้ โปรดดูคำถามที่พบบ่อยนี้

วันที่เผยแพร่ ต้องระบุ เป็นมิลลิวินาทีตามยุค
ความพร้อมใช้งาน ต้องระบุ

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

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

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

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

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

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

ดำเนินการต่อ: ผู้ใช้ดูเนื้อหานี้นานกว่า 1 นาทีแล้ว

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

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

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

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

TvShowEntity

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

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

URI ของหน้าข้อมูล ต้องระบุ

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

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

URI การเล่น ไม่บังคับ

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

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

วันที่ออกอากาศตอนแรก ต้องระบุ เป็นมิลลิวินาทีตามยุค
วันที่ออกอากาศตอนล่าสุด ไม่บังคับ เป็นมิลลิวินาทีตามยุค
ความพร้อมใช้งาน ต้องระบุ

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

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

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

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

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

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

ดำเนินการต่อ: ผู้ใช้ดูเนื้อหานี้นานกว่า 1 นาทีแล้ว

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

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

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

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

TvSeasonEntity

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

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

URI ของหน้าข้อมูล ต้องระบุ

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

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

URI การเล่น ไม่บังคับ

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

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

แสดงหมายเลขซีซัน

ไม่บังคับ

มีให้บริการใน v1.3.1

สตริง
วันที่ออกอากาศตอนแรก ต้องระบุ เป็นมิลลิวินาทีตามยุค
วันที่ออกอากาศตอนล่าสุด ไม่บังคับ เป็นมิลลิวินาทีตามยุค
ความพร้อมใช้งาน ต้องระบุ

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

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

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

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

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

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

ดำเนินการต่อ: ผู้ใช้ดูเนื้อหานี้นานกว่า 1 นาทีแล้ว

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

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

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

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

TvEpisodeEntity

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

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

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

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

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

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

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

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

แสดงหมายเลขตอน

ไม่บังคับ

มีให้บริการใน v1.3.1

สตริง
วันที่ออกอากาศ ต้องระบุ เป็นมิลลิวินาทีตามยุค
ความพร้อมใช้งาน ต้องระบุ

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

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

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

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

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

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

ดำเนินการต่อ: ผู้ใช้ดูเนื้อหานี้นานกว่า 1 นาทีแล้ว

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

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

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

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

LiveStreamingVideoEntity

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

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

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

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

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

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

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

ดำเนินการต่อ: ผู้ใช้ดูเนื้อหานี้นานกว่า 1 นาทีแล้ว

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

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

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

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

VideoClipEntity

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

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

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

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

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

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

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

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

ดำเนินการต่อ: ผู้ใช้ดูเนื้อหานี้นานกว่า 1 นาทีแล้ว

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

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

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

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

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

ส่วนต่อไปนี้แสดงข้อกำหนดที่จำเป็นสำหรับชิ้นงานรูปภาพ

รูปแบบไฟล์

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

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

publishUserAccountManagementRequest

API นี้ใช้เพื่อเผยแพร่การ์ดลงชื่อเข้าใช้ การดำเนินการลงชื่อเข้าใช้จะนำผู้ใช้ไปยังหน้าลงชื่อเข้าใช้ของแอปเพื่อให้แอปเผยแพร่เนื้อหาได้ (หรือแสดงเนื้อหาที่ปรับเปลี่ยนในแบบของคุณมากขึ้น)

ข้อมูลเมตาต่อไปนี้เป็นส่วนหนึ่งของการ์ดลงชื่อเข้าใช้

แอตทริบิวต์ ข้อกำหนด คำอธิบาย
URI การดำเนินการ ต้องมี Deep Link ไปยังการดำเนินการ (เช่น ไปยังหน้าลงชื่อเข้าใช้แอป)
รูปภาพ ไม่บังคับ - หากไม่ระบุ จะต้องระบุชื่อ

รูปภาพที่แสดงในการ์ด

รูปภาพสัดส่วนภาพ 16:9 ที่มีความละเอียด 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

หากไม่มีคลัสเตอร์ใดเผยแพร่เนื่องจากเหตุผลทางธุรกิจภายใน เราขอแนะนำอย่างยิ่งให้อัปเดตสถานะการเผยแพร่โดยใช้ updatePublishStatus API ซึ่งเป็นสิ่งสำคัญเนื่องจากเหตุผลต่อไปนี้

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

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

// 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>

Intent ต่อไปนี้จะส่งโดยบริการ

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION เราขอแนะนำให้เริ่มการเรียก publishRecommendationClusters เมื่อได้รับ Intent นี้
  • com.google.android.engage.action.PUBLISH_FEATURED เราขอแนะนำให้เริ่มpublishFeaturedClusterการโทรเมื่อได้รับIntent นี้
  • com.google.android.engage.action.PUBLISH_CONTINUATION เราขอแนะนำให้เริ่มการโทร publishContinuationCluster เมื่อได้รับ Intent นี้

เวิร์กโฟลว์การผสานรวม

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

คำถามที่พบบ่อย

ดูคำถามที่พบบ่อยเกี่ยวกับ Engage SDK

รายชื่อติดต่อ

โปรดติดต่อ engage-developers@google.com หากมีคำถามระหว่างกระบวนการผสานรวม

ขั้นตอนถัดไป

หลังจากการผสานรวมนี้เสร็จสมบูรณ์แล้ว ขั้นตอนถัดไปมีดังนี้

  • ส่งอีเมลไปที่ engage-developers@google.com และแนบ APK ที่ผสานรวมแล้วซึ่งพร้อมให้ Google ทดสอบ
  • Google จะดำเนินการยืนยันและตรวจสอบภายในเพื่อให้แน่ใจว่าการผสานรวมทำงานได้ตามที่คาดไว้ หากจำเป็นต้องทำการเปลี่ยนแปลง Google จะติดต่อคุณพร้อมรายละเอียดที่จำเป็น
  • เมื่อการทดสอบเสร็จสมบูรณ์และไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ Google จะติดต่อคุณเพื่อแจ้งให้ทราบว่าคุณสามารถเริ่มเผยแพร่ APK ที่อัปเดตและผสานรวมแล้วไปยัง Play Store
  • หลังจาก Google ยืนยันว่าได้เผยแพร่ APK ที่อัปเดตแล้วไปยัง Play Store แล้ว ระบบอาจเผยแพร่คลัสเตอร์คำแนะนำ แนะนํา และการต่อเรื่องให้ผู้ใช้เห็น