การดู 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

TvShowEntity

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

TvEpisodeEntity

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

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

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

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

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

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

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

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

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

ไม่บังคับ

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

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

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

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

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

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

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

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

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

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

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

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

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

LiveStreamingVideoEntity

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

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

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

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

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

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

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

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

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

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

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

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

VideoClipEntity

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

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

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

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

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

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

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

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

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

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

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

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 == 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 นี้ใช้เพื่อลบเนื้อหาของคลัสเตอร์ Continuation

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 ของข้อความประกาศ

นอกจากการเรียกใช้ Content API ผ่านงานแล้ว คุณยังต้องตั้งค่า BroadcastReceiver เพื่อรับคำขอการเผยแพร่เนื้อหาด้วย

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