Google กำลังสร้างแพลตฟอร์มในอุปกรณ์ที่จัดระเบียบแอปของผู้ใช้ตามประเภทธุรกิจ และสร้างประสบการณ์ที่สมจริงแบบใหม่สำหรับการบริโภคและการค้นพบเนื้อหาของแอปที่ปรับเปลี่ยนในแบบของคุณ ประสบการณ์แบบเต็มหน้าจอนี้เปิดโอกาสให้พาร์ทเนอร์นักพัฒนาแอปได้แสดงเนื้อหาริชมีเดียที่ดีที่สุดในช่องทางเฉพาะนอกแอป
คู่มือนี้มีวิธีการสำหรับพาร์ทเนอร์นักพัฒนาแอปในการผสานรวมเนื้อหาวิดีโอโดยใช้ Engage SDK เพื่อแสดงเนื้อหาทั้งในแพลตฟอร์มใหม่นี้และแพลตฟอร์มที่มีอยู่ของ Google
รายละเอียดการผสานรวม
คำศัพท์
การผสานรวมนี้ประกอบด้วยคลัสเตอร์ 3 ประเภท ได้แก่ คําแนะนํา การต่อเรื่อง และแนะนํา
คลัสเตอร์วิดีโอแนะนำแสดงคำแนะนำที่ปรับเปลี่ยนในแบบของคุณสำหรับเนื้อหาที่น่าดูจากพาร์ทเนอร์นักพัฒนาแอปแต่ละราย
คำแนะนำของคุณควรมีโครงสร้างดังต่อไปนี้
คลัสเตอร์คำแนะนำ: มุมมอง UI ที่มีกลุ่มคำแนะนำจากพาร์ทเนอร์นักพัฒนาซอฟต์แวร์รายเดียวกัน
เอนทิตี: ออบเจ็กต์ที่แสดงรายการเดียวในคลัสเตอร์ เอนทิตีอาจเป็นภาพยนตร์ รายการทีวี ซีรีส์ทีวี วิดีโอสด และอื่นๆ ดูรายการประเภทเอนทิตีที่รองรับได้ในส่วนระบุข้อมูลเอนทิตี
กลุ่มภาคต่อจะแสดงวิดีโอที่ยังไม่จบและตอนที่เกี่ยวข้องซึ่งเพิ่งเผยแพร่จากพาร์ทเนอร์นักพัฒนาแอปหลายรายในการรวม UI เดียว พาร์ทเนอร์นักพัฒนาแอปแต่ละรายจะได้รับอนุญาตให้ออกอากาศเอนทิตีสูงสุด 10 รายการในคลัสเตอร์ต่อ การศึกษาแสดงให้เห็นว่าการแนะนำที่ปรับเปลี่ยนในแบบของคุณควบคู่ไปกับเนื้อหาการต่อเรื่องแบบปรับเปลี่ยนในแบบของคุณจะทำให้เกิดการมีส่วนร่วมของผู้ใช้ที่ดีที่สุด
กลุ่มแนะนําจะแสดงรายการต่างๆ จากพาร์ทเนอร์นักพัฒนาแอปหลายรายในการรวมกลุ่ม UI เดียว โดยจะมีคลัสเตอร์แนะนำกลุ่มเดียวที่แสดงอยู่ใกล้กับด้านบนของ UI ด้วยตำแหน่งที่มีลำดับความสำคัญเหนือคลัสเตอร์คำแนะนำทั้งหมด พาร์ทเนอร์นักพัฒนาซอฟต์แวร์แต่ละรายจะได้รับอนุญาตให้เผยแพร่เอนทิตีได้สูงสุด 10 รายการในคลัสเตอร์ "แนะนำ"
งานก่อนเริ่มเวิร์กช็อป
ระดับ API ขั้นต่ำ: 19
วิธีเพิ่มคลัง com.google.android.engage:engage-core
ลงในแอป
dependencies {
// Make sure you also include that repository in your project's build.gradle file.
implementation 'com.google.android.engage:engage-core:1.5.2'
}
ดูข้อมูลเพิ่มเติมได้ที่ระดับการมองเห็นแพ็กเกจใน Android 11
สรุป
การออกแบบนี้อิงตามการใช้งาน 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 ได้กำหนดเอนทิตีที่แตกต่างกันเพื่อแสดงรายการแต่ละประเภท เรารองรับเอนทิตีต่อไปนี้สำหรับหมวดหมู่การดู
แผนภูมิต่อไปนี้แสดงแอตทริบิวต์และข้อกําหนดสําหรับแต่ละประเภท
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 แล้ว ระบบอาจเผยแพร่คลัสเตอร์คำแนะนำ แนะนํา และการต่อเรื่องให้ผู้ใช้เห็น