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

เพิ่มการมีส่วนร่วมในแอปโดยการเข้าถึงผู้ใช้ในทุกที่ที่ผู้ใช้อยู่ ผสานรวม Engage SDK เพื่อแสดงคำแนะนำที่ปรับเปลี่ยนในแบบของคุณและเนื้อหาที่ต่อเนื่องไปยังผู้ใช้โดยตรงในแพลตฟอร์มต่างๆ ในอุปกรณ์ เช่น คอลเล็กชัน, Entertainment Space และ Play Store การผสานรวมนี้จะเพิ่มขนาด APK โดยเฉลี่ยไม่เกิน 50 KB (บีบอัดแล้ว) และใช้เวลาของนักพัฒนาแอปประมาณ 1 สัปดาห์สำหรับแอปส่วนใหญ่ ดูข้อมูลเพิ่มเติมได้ที่เว็บไซต์ธุรกิจ

คู่มือนี้มีวิธีการสำหรับพาร์ทเนอร์นักพัฒนาแอปในการนำส่งเนื้อหาโซเชียลมีเดียไปยังแพลตฟอร์มเนื้อหา Engage

การรองรับหมวดหมู่และแพลตฟอร์ม

การมีสิทธิ์ใช้แพลตฟอร์ม Engage SDK ขึ้นอยู่กับหมวดหมู่เนื้อหาของแอป ใช้ตารางต่อไปนี้เพื่อพิจารณาสิทธิ์ของคุณสำหรับแพลตฟอร์มที่เฉพาะเจาะจง

สถานะ หมวดหมู่เนื้อหาหรือกรณีการใช้งาน แพลตฟอร์มที่รองรับ
รองรับ
(มีสิทธิ์แสดงในทุกแพลตฟอร์ม)
  • โซเชียลเน็ตเวิร์ก
  • รูปภาพ / มีม
  • วิดีโอคลิป / วิดีโอแบบสั้น
  • การพบปะในชีวิตจริง
  • พื้นที่เก็บข้อมูลรูปภาพในระบบคลาวด์
  • คอลเล็กชัน
  • แท็บแอปใน Play Store
  • แท็บ "คุณ" ใน Play Store
  • หน้าข้อมูลสินค้าใน Store ของ Play Store
สิ่งที่ทำไม่ได้
  • วิดีโอแชทสด
  • การรับส่งข้อความโต้ตอบแบบทันที การแชร์ตัวตนบนโลกออนไลน์ หรือข้อมูลแบบเรียลไทม์
  • การแชร์ไฟล์และเครื่องมือดาวน์โหลด
  • การเดท
  • เครื่องมือสร้างรูปโปรไฟล์

รายละเอียดการผสานรวม

ส่วนต่อไปนี้จะอธิบายรายละเอียดการผสานรวม

คำศัพท์

คลัสเตอร์คำแนะนำจะแสดงคำแนะนำที่ปรับเปลี่ยนในแบบของคุณจากพาร์ทเนอร์นักพัฒนาแอปแต่ละราย

คำแนะนำจะมีโครงสร้างดังต่อไปนี้

คลัสเตอร์วิดีโอแนะนำ: มุมมอง UI ที่มีกลุ่มวิดีโอแนะนำจากพาร์ทเนอร์นักพัฒนาแอปรายเดียวกัน

คลัสเตอร์วิดีโอแนะนำแต่ละรายการประกอบด้วยเอนทิตีประเภทใดประเภทหนึ่งต่อไปนี้

  • PortraitMediaEntity
  • SocialPostEntity

PortraitMediaEntity ต้องมีรูปภาพแนวตั้ง 1 รูปสำหรับโพสต์ ข้อมูลเมตาที่เกี่ยวข้องกับโปรไฟล์และการโต้ตอบเป็นข้อมูลที่ไม่บังคับ

  • โพสต์

    • รูปภาพในโหมดภาพบุคคลและการประทับเวลา หรือ
    • รูปภาพในโหมดภาพบุคคล + เนื้อหาข้อความและการประทับเวลา
  • โปรไฟล์

    • รูปโปรไฟล์ ชื่อหรือแฮนเดิล รูปภาพเพิ่มเติม
  • การโต้ตอบ

    • นับและติดป้ายกำกับเท่านั้น หรือ
    • จำนวนและภาพ (ไอคอน)

SocialPostEntity มีข้อมูลเมตาที่เกี่ยวข้องกับโปรไฟล์ โพสต์ และการโต้ตอบ

  • โปรไฟล์

    • รูปโปรไฟล์ ชื่อหรือแฮนเดิล ข้อความเพิ่มเติม รูปภาพเพิ่มเติม
  • โพสต์

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

    • นับและติดป้ายกำกับเท่านั้น หรือ
    • จำนวนและภาพ (ไอคอน)

สิ่งที่ต้องเตรียมก่อนดำเนินการ

ระดับ 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.6.0'
}

สรุป

การออกแบบนี้อิงตามการใช้งานบริการที่มีผลผูกพัน

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

ประเภทคลัสเตอร์ ขีดจำกัดของคลัสเตอร์ ขีดจำกัดขั้นต่ำของเอนทิตีในคลัสเตอร์ ขีดจำกัดเอนทิตีสูงสุดในคลัสเตอร์
คลัสเตอร์วิดีโอแนะนำ ไม่เกิน 7 รายการ อย่างน้อย 1 รายการ (PortraitMediaEntity หรือ SocialPostEntity) ไม่เกิน 50 (PortraitMediaEntity หรือ SocialPostEntity)

ขั้นตอนที่ 1: ระบุข้อมูลนิติบุคคล

SDK ได้กำหนดเอนทิตีต่างๆ เพื่อแสดงรายการแต่ละประเภท SDK รองรับเอนทิตีต่อไปนี้สำหรับหมวดหมู่โซเชียล

  1. PortraitMediaEntity
  2. SocialPostEntity

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

PortraitMediaEntity

แอตทริบิวต์ ข้อกำหนด คำอธิบาย รูปแบบ
URI การดำเนินการ ต้องระบุสำหรับแพลตฟอร์มทั้งหมดที่ไม่ใช่ Google TV

Deep Link ไปยังเอนทิตีในแอปของผู้ให้บริการ

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

URI
PlatformSpecificPlayback ต้องระบุสำหรับแพลตฟอร์ม Google TV

Deep Link ไปยังเอนทิตีในแอปของผู้ให้บริการสำหรับแพลตฟอร์มต่างๆ เช่น Google TV และอุปกรณ์เคลื่อนที่

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

รูปภาพควรมีสัดส่วนภาพเป็นแนวตั้ง

UI อาจแสดงรูปภาพเพียง 1 รูปเมื่อมีการระบุรูปภาพหลายรูป อย่างไรก็ตาม UI อาจแสดงภาพที่บ่งบอกว่ามีรูปภาพเพิ่มเติมในแอป

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

ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
ชิ้นงานข้อความ ไม่บังคับ ข้อความหลักของโพสต์ ข้อมูลอัปเดต ฯลฯ สตริง (แนะนำสูงสุด 140 อักขระ)
การประทับเวลา ไม่บังคับ เวลาที่เผยแพร่โพสต์ การประทับเวลา Epoch ในหน่วยมิลลิวินาที
เป็นเนื้อหาวิดีโอ ไม่บังคับ โพสต์เป็นวิดีโอใช่ไหม บูลีน
ระยะเวลาของวิดีโอ ไม่บังคับ ระยะเวลาของวิดีโอในหน่วยมิลลิวินาที ยาว
ข้อมูลเมตาที่เกี่ยวข้องกับโปรไฟล์ (ไม่บังคับ)
ชื่อ ต้องระบุ ชื่อโปรไฟล์ รหัส หรือแฮนเดิล เช่น "John Doe", "@TeamPixel" สตริง(แนะนำให้มีความยาวสูงสุด 25 อักขระ)
รูปโปรไฟล์ ต้องระบุ

รูปโปรไฟล์หรือรูปโปรไฟล์ของผู้ใช้

รูปภาพสี่เหลี่ยมจัตุรัสสัดส่วน 1:1

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

ป้ายโปรไฟล์ เช่น ป้าย "ยืนยันแล้ว"

รูปภาพสี่เหลี่ยมจัตุรัสสัดส่วน 1:1

ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
ข้อมูลเมตาที่เกี่ยวข้องกับการโต้ตอบ (ไม่บังคับ)
จำนวน ไม่บังคับ

ระบุจำนวนการโต้ตอบ เช่น "3.7 ล้าน"

หมายเหตุ: หากระบุทั้งจำนวนและค่าจำนวน ระบบจะใช้จำนวน

หมายเหตุ: พาร์ทเนอร์ควรใช้ Count หรือ CountWithOptionalLabel

สตริง

CountWithOptionalLabel ไม่บังคับ

ระบุจำนวนการโต้ตอบด้วยป้ายกำกับที่ไม่บังคับ เช่น "3.7 ล้านไลก์"

หมายเหตุ: หากระบุทั้ง CountWithOptionalLabel และ Count Value ระบบจะใช้ค่าใดค่าหนึ่ง

หมายเหตุ: พาร์ทเนอร์ควรใช้ Count หรือ CountWithOptionalLabel

สตริง

ค่าการนับ ไม่บังคับ

จำนวนการโต้ตอบเป็นค่า

หมายเหตุ: ระบุค่าจำนวนแทนจำนวนหากแอปของคุณไม่ได้จัดการตรรกะเกี่ยวกับวิธีเพิ่มประสิทธิภาพตัวเลขจำนวนมากสำหรับขนาดการแสดงผลที่แตกต่างกัน หากระบุทั้ง Count และ Count Value ระบบจะใช้ Count

ยาว
ป้ายกำกับ ไม่บังคับ ระบุวัตถุประสงค์ของป้ายกำกับการโต้ตอบ เช่น "การกดชอบ"

สตริง

ภาพ ไม่บังคับ

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

คุณระบุรูปภาพได้มากกว่า 1 รูป แต่ระบบอาจไม่แสดงรูปภาพทั้งหมดในอุปกรณ์ทุกรูปแบบ

หมายเหตุ: ต้องเป็นรูปภาพสี่เหลี่ยมจัตุรัส 1:1

ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
DisplayTimeWindow (ไม่บังคับ) - กำหนดกรอบเวลาสำหรับเนื้อหาที่จะแสดงบนแพลตฟอร์ม
การประทับเวลาเริ่มต้น ไม่บังคับ

การประทับเวลา Epoch ที่ควรแสดงเนื้อหาบนแพลตฟอร์ม

หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงบนแพลตฟอร์ม

การประทับเวลา Epoch ในหน่วยมิลลิวินาที
การประทับเวลาสิ้นสุด ไม่บังคับ

การประทับเวลา Epoch หลังจากที่เนื้อหาไม่แสดงบนแพลตฟอร์มอีกต่อไป

หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงบนแพลตฟอร์ม

การประทับเวลา Epoch ในหน่วยมิลลิวินาที

SocialPostEntity

แอตทริบิวต์ ข้อกำหนด คำอธิบาย รูปแบบ
URI การดำเนินการ ต้องระบุ

Deep Link ไปยังเอนทิตีในแอปของผู้ให้บริการ

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

URI
URI ของ PlatformSpecificPlayback ต้องระบุสำหรับแพลตฟอร์ม Google TV

Deep Link ไปยังเอนทิตีในแอปของผู้ให้บริการสำหรับแพลตฟอร์มต่างๆ เช่น Google TV และอุปกรณ์เคลื่อนที่

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

ข้อมูลเมตาที่เกี่ยวข้องกับโพสต์ (ต้องระบุ)

ต้องระบุ TextContent, Image หรือ WebContent อย่างน้อย 1 รายการ

รูปภาพ ไม่บังคับ

รูปภาพควรมีสัดส่วนภาพเป็นแนวตั้ง

UI อาจแสดงรูปภาพเพียง 1 รูปเมื่อมีการระบุรูปภาพหลายรูป อย่างไรก็ตาม UI อาจแสดงภาพที่บ่งบอกว่ามีรูปภาพเพิ่มเติมในแอป

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

ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
ชิ้นงานข้อความ ไม่บังคับ ข้อความหลักของโพสต์ ข้อมูลอัปเดต ฯลฯ สตริง (แนะนำสูงสุด 140 อักขระ)
เนื้อหาวิดีโอ (ไม่บังคับ)
ระยะเวลา ต้องระบุ ระยะเวลาของวิดีโอในหน่วยมิลลิวินาที ยาว
รูปภาพ ต้องระบุ แสดงตัวอย่างรูปภาพของเนื้อหาวิดีโอ ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
ตัวอย่างลิงก์ (ไม่บังคับ)
ตัวอย่างลิงก์ - ชื่อ ต้องระบุ ข้อความที่ระบุชื่อเนื้อหาของหน้าเว็บ สตริง
ตัวอย่างลิงก์ - ชื่อโฮสต์ ต้องระบุ ข้อความที่ระบุเจ้าของเว็บ เช่น "INSIDER" สตริง
ตัวอย่างลิงก์ - รูปภาพ ไม่บังคับ รูปภาพหลักสำหรับเนื้อหาเว็บ ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
การประทับเวลา ไม่บังคับ เวลาที่เผยแพร่โพสต์ การประทับเวลา Epoch ในหน่วยมิลลิวินาที
ข้อมูลเมตาที่เกี่ยวข้องกับโปรไฟล์ (ไม่บังคับ)
ชื่อ ต้องระบุ ชื่อโปรไฟล์ รหัส หรือแฮนเดิล เช่น "John Doe", "@TeamPixel" สตริง(แนะนำให้มีความยาวสูงสุด 25 อักขระ)
ข้อความเพิ่มเติม ไม่บังคับ

อาจใช้เป็นรหัสโปรไฟล์ แฮนเดิล หรือข้อมูลเมตาเพิ่มเติม

เช่น "@John-Doe", "ผู้ติดตาม 5 ล้านคน", "คุณอาจชอบ", "มาแรง", "โพสต์ใหม่ 5 รายการ"

สตริง(แนะนำให้มีความยาวไม่เกิน 40 อักขระ)
รูปโปรไฟล์ ต้องระบุ

รูปโปรไฟล์หรือรูปโปรไฟล์ของผู้ใช้

รูปภาพสี่เหลี่ยมจัตุรัสสัดส่วน 1:1

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

ป้ายโปรไฟล์ เช่น ป้ายยืนยันสถานะ

รูปภาพสี่เหลี่ยมจัตุรัสสัดส่วน 1:1

ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
ข้อมูลเมตาที่เกี่ยวข้องกับการโต้ตอบ (ไม่บังคับ)
จำนวน ต้องระบุ

ระบุจำนวนการโต้ตอบ เช่น "3.7 ล้าน"

หมายเหตุ: พาร์ทเนอร์ควรใช้ Count หรือ CountWithOptionalLabel

สตริง
CountWithOptionalLabel ต้องระบุ

ระบุจำนวนการโต้ตอบด้วยป้ายกำกับที่ไม่บังคับ เช่น "ยอดไลก์ 3.7 ล้านครั้ง"

หมายเหตุ: พาร์ทเนอร์ควรใช้ Count หรือ CountWithOptionalLabel

สตริง
ป้ายกำกับ

ไม่บังคับ

หากไม่ได้ระบุ Visual คุณต้องระบุข้อมูลนี้

ระบุวัตถุประสงค์ของการโต้ตอบ เช่น "การกดชอบ" สตริง (แนะนำให้ใช้จำนวนอักขระสูงสุด 20 ตัวสำหรับจำนวน + ป้ายกำกับรวมกัน)
ภาพ

ไม่บังคับ

หากไม่ได้ระบุ Label คุณต้องระบุLabel

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

คุณระบุรูปภาพได้มากกว่า 1 รูป แต่ระบบอาจแสดงรูปภาพบางรูปในอุปกรณ์บางรูปแบบเท่านั้น

รูปภาพสี่เหลี่ยมจัตุรัสสัดส่วน 1:1

ดูคำแนะนำได้ที่ข้อกำหนดเกี่ยวกับรูปภาพ
DisplayTimeWindow (ไม่บังคับ) - กำหนดกรอบเวลาสำหรับเนื้อหาที่จะแสดงบนแพลตฟอร์ม
การประทับเวลาเริ่มต้น ไม่บังคับ

การประทับเวลา Epoch ที่ควรแสดงเนื้อหาบนแพลตฟอร์ม

หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงบนแพลตฟอร์ม

การประทับเวลา Epoch ในหน่วยมิลลิวินาที
การประทับเวลาสิ้นสุด ไม่บังคับ

การประทับเวลา Epoch หลังจากที่เนื้อหาไม่แสดงบนแพลตฟอร์มอีกต่อไป

หากไม่ได้ตั้งค่าไว้ เนื้อหาจะมีสิทธิ์แสดงบนแพลตฟอร์ม

การประทับเวลา Epoch ในหน่วยมิลลิวินาที

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

รูปภาพต้องโฮสต์อยู่ใน CDN สาธารณะเพื่อให้ Google เข้าถึงได้

รูปแบบไฟล์

PNG, JPG, GIF แบบภาพนิ่ง, WebP

ขนาดไฟล์สูงสุด

5120 KB

คำแนะนำเพิ่มเติม

  • พื้นที่ปลอดภัยสำหรับรูปภาพ: ใส่เนื้อหาสำคัญไว้ตรงกลาง ซึ่งก็คือ 80% ของรูปภาพนั้น
  • ใช้พื้นหลังโปร่งใสเพื่อให้รูปภาพแสดงได้อย่างถูกต้องในการตั้งค่าธีมมืดและธีมสว่าง

ขั้นตอนที่ 2: ระบุข้อมูลคลัสเตอร์

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

AppEngageSocialClient มีหน้าที่เผยแพร่คลัสเตอร์โซเชียล

API ต่อไปนี้ใช้เพื่อเผยแพร่คลัสเตอร์ในไคลเอ็นต์

  • isServiceAvailable
  • publishRecommendationClusters
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

API นี้ใช้เพื่อตรวจสอบว่าบริการพร้อมสำหรับการผสานรวมหรือไม่ และเนื้อหาจะแสดงบนอุปกรณ์ได้หรือไม่

คุณสามารถตรวจสอบความพร้อมให้บริการสำหรับคลัสเตอร์ทุกประเภทที่ต้องการเผยแพร่ได้ isServiceAvailable API จะยอมรับออบเจ็กต์คำขอ ServiceAvailabilityRequest ซึ่งมีประเภทคลัสเตอร์ที่ต้องตรวจสอบความพร้อมให้บริการ คุณสามารถดูค่า enum ของ ClusterType ที่จำเป็นสำหรับ ServiceAvailabilityRequest ได้จากตารางต่อไปนี้

ประเภทคลัสเตอร์ ค่าคงที่ประเภทคลัสเตอร์ ค่าจำนวนเต็ม
ไม่ทราบ TYPE_UNKNOWN 0
คลัสเตอร์วิดีโอแนะนำ TYPE_RECOMMENDATION 1
คลัสเตอร์แนะนำ TYPE_FEATURED 2
คลัสเตอร์ความต่อเนื่อง TYPE_CONTINUATION 3
คลัสเตอร์การจัดการผู้ใช้ TYPE_ENGAGEMENT 8
คลัสเตอร์การสมัครใช้บริการ TYPE_SUBSCRIPTION 12

Kotlin

val request = ServiceAvailabilityRequest.Builder()
    .addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
    .addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
    .build()

client.isServiceAvailable(request).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val availabilityMap = task.result
        if (availabilityMap[ClusterType.TYPE_CONTINUATION] == true) {
            // Proceed with publishing continuation content
        }
        if (availabilityMap[ClusterType.TYPE_RECOMMENDATION] == true) {
            // Proceed with publishing recommendation content
        }
    } else {
        // The IPC call itself fails, proceed with error handling logic here,
        // such as retry.
    }
}

Java

ServiceAvailabilityRequest request =
    new ServiceAvailabilityRequest.Builder()
        .addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
        .addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
        .build();

client.isServiceAvailable(request).addOnCompleteListener(task -> {
    if (task.isSuccessful()) {
        Map<Integer, Boolean> availabilityMap = task.getResult();
        if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_CONTINUATION))) {
            // Proceed with publishing continuation content
        }
        if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_RECOMMENDATION))) {
            // Proceed with publishing recommendation content
        }
    } else {
        // The IPC call itself fails, proceed with error handling logic here,
        // such as retry.
    }
});
ฟีเจอร์ความพร้อมให้บริการแบบมีเงื่อนไข

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

ตั้งแต่เวอร์ชัน 1.6.0 เป็นต้นไป Engage SDK จะช่วยให้ตรวจสอบความพร้อมใช้งานของคลัสเตอร์บางประเภทได้ หากสนใจเลือกใช้ฟีเจอร์นี้สำหรับคลัสเตอร์ประเภทใดก็ตาม โปรดติดต่อ engage-developers@google.com

สำหรับ SDK เวอร์ชันก่อน v1.6.0 (เลิกใช้งานแล้ว)

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

ออบเจ็กต์ RecommendationCluster มีแอตทริบิวต์ต่อไปนี้ได้

แอตทริบิวต์ ข้อกำหนด คำอธิบาย
รายการ SocialPostEntity หรือ PortraitMediaEntity ต้องระบุ รายการเอนทิตีที่ประกอบขึ้นเป็นวิดีโอแนะนำสำหรับคลัสเตอร์วิดีโอแนะนำนี้ เอนทิตีในคลัสเตอร์เดียวต้องเป็นประเภทเดียวกัน
ชื่อ ต้องระบุ

ชื่อของคลัสเตอร์วิดีโอแนะนำ (เช่น ล่าสุดจากเพื่อนๆ)

ขนาดข้อความที่แนะนำ: ไม่เกิน 25 อักขระ (ข้อความที่ยาวเกินไปอาจแสดงจุดไข่ปลา)

ชื่อรอง ไม่บังคับ คำบรรยายสำหรับคลัสเตอร์วิดีโอแนะนำ
URI การดำเนินการ ไม่บังคับ

Deep Link ไปยังหน้าในแอปพาร์ทเนอร์ที่ผู้ใช้จะเห็นรายการวิดีโอแนะนำทั้งหมด

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

Kotlin

client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Latest from your friends")
                        .build())
                .build())

Java

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Latest from your friends")
                        .build())
                .build());

เมื่อบริการได้รับคำขอ ระบบจะดำเนินการต่อไปนี้ภายในธุรกรรมเดียว

  • ระบบจะนำข้อมูลคลัสเตอร์วิดีโอแนะนำที่มีอยู่ทั้งหมดออก
  • ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอในคลัสเตอร์คำแนะนำใหม่

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

publishUserAccountManagementRequest

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

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

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

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

รูปภาพสัดส่วนภาพ 16x9 ที่มีความละเอียด 1264x712

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

Kotlin

var SIGN_IN_CARD_ENTITY =
      SignInCardEntity.Builder()
          .addPosterImage(
              Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build()

client.publishUserAccountManagementRequest(
            PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

Java

SignInCardEntity SIGN_IN_CARD_ENTITY =
      new SignInCardEntity.Builder()
          .addPosterImage(
              new Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(500)
                  .setImageWidthInPixel(500)
                  .build())
          .setActionText("Sign In")
          .setActionUri(Uri.parse("http://xx.com/signin"))
          .build();

client.publishUserAccountManagementRequest(
            new PublishUserAccountManagementRequest.Builder()
                .setSignInCardEntity(SIGN_IN_CARD_ENTITY)
                .build());

เมื่อบริการได้รับคำขอ ระบบจะดำเนินการต่อไปนี้ภายในธุรกรรมเดียว

  • ระบบจะนำข้อมูล UserAccountManagementCluster ที่มีอยู่จากพาร์ทเนอร์นักพัฒนาออก
  • ระบบจะแยกวิเคราะห์และจัดเก็บข้อมูลจากคำขอในคลัสเตอร์ UserAccountManagementCluster ที่อัปเดต

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

updatePublishStatus

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

  • การระบุสถานะในทุกสถานการณ์ แม้ว่าเนื้อหาจะเผยแพร่แล้ว (STATUS == PUBLISHED) ก็มีความสำคัญต่อการสร้างแดชบอร์ดที่ใช้สถานะที่ชัดเจนนี้เพื่อแสดงประสิทธิภาพและเมตริกอื่นๆ ของการผสานรวม
  • หากไม่มีการเผยแพร่เนื้อหาแต่สถานะการผสานรวมไม่เสียหาย (STATUS == NOT_PUBLISHED) Google จะหลีกเลี่ยงการทริกเกอร์การแจ้งเตือนในแดชบอร์ดประสิทธิภาพของแอปได้ ซึ่งเป็นการยืนยันว่าเนื้อหาไม่ได้เผยแพร่เนื่องจากสถานการณ์ที่คาดไว้จากมุมมองของผู้ให้บริการ
  • ซึ่งจะช่วยให้นักพัฒนาแอปทราบข้อมูลเชิงลึกเกี่ยวกับช่วงเวลาที่เผยแพร่ข้อมูลเทียบกับช่วงเวลาที่ไม่ได้เผยแพร่
  • Google อาจใช้รหัสสถานะเพื่อกระตุ้นให้ผู้ใช้ดำเนินการบางอย่างในแอปเพื่อให้เห็นเนื้อหาแอปหรือเอาชนะอุปสรรคได้

รายการรหัสสถานะการเผยแพร่ที่มีสิทธิ์มีดังนี้

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

// Content is not published as user is not signed in
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN,

// Content is not published as user is not subscribed
AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SUBSCRIPTION,

// Content is not published as user location is ineligible
AppEngagePublishStatusCode.NOT_PUBLISHED_INELIGIBLE_LOCATION,

// Content is not published as there is no eligible content
AppEngagePublishStatusCode.NOT_PUBLISHED_NO_ELIGIBLE_CONTENT,

// Content is not published as the feature is disabled by the client
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_FEATURE_DISABLED_BY_CLIENT,

// Content is not published as the feature due to a client error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_CLIENT_ERROR,

// Content is not published as the feature due to a service error
// Available in v1.3.1
AppEngagePublishStatusCode.NOT_PUBLISHED_SERVICE_ERROR,

// Content is not published due to some other reason
// Reach out to engage-developers@ before using this enum.
AppEngagePublishStatusCode.NOT_PUBLISHED_OTHER

หากเนื้อหาไม่ได้รับการเผยแพร่เนื่องจากผู้ใช้ไม่ได้เข้าสู่ระบบ Google ขอแนะนำให้เผยแพร่การ์ดลงชื่อเข้าใช้ หากผู้ให้บริการไม่สามารถเผยแพร่การ์ดการลงชื่อเข้าใช้ไม่ว่าด้วยเหตุผลใดก็ตาม เราขอแนะนำให้เรียกใช้ API updatePublishStatus พร้อมรหัสสถานะ NOT_PUBLISHED_REQUIRES_SIGN_IN

Kotlin

client.updatePublishStatus(
   PublishStatusRequest.Builder()
     .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
     .build())

Java

client.updatePublishStatus(
    new PublishStatusRequest.Builder()
        .setStatusCode(AppEngagePublishStatusCode.NOT_PUBLISHED_REQUIRES_SIGN_IN)
        .build());

deleteRecommendationsClusters

API นี้ใช้เพื่อลบเนื้อหาของคลัสเตอร์วิดีโอแนะนำ

Kotlin

client.deleteRecommendationsClusters()

Java

client.deleteRecommendationsClusters();

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

deleteUserManagementCluster

API นี้ใช้เพื่อลบเนื้อหาของคลัสเตอร์ UserAccountManagement

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

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

deleteClusters

API นี้ใช้เพื่อลบเนื้อหาของประเภทคลัสเตอร์ที่ระบุ

Kotlin

client.deleteClusters(
    DeleteClustersRequest.Builder()
      .addClusterType(ClusterType.TYPE_RECOMMENDATION)
      ...
      .build())

Java

client.deleteClusters(
            new DeleteClustersRequest.Builder()
                .addClusterType(ClusterType.TYPE_RECOMMENDATION)
                ...
                .build());

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

การจัดการข้อผิดพลาด

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

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
}

fun registerBroadcastReceivers(context: Context){
  var  context = context
  context = context.applicationContext

// Register Recommendation Cluster Publish Intent
  context.registerReceiver(AppEngageBroadcastReceiver(),
                           IntentFilter(Intents.ACTION_PUBLISH_RECOMMENDATION),
                           com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                           /*scheduler=*/null)
}

Java

class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received
}

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
                         new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION),
                         com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
                         /*scheduler=*/null);
}
  • ประกาศการติดตั้งใช้งานแบบคงที่ด้วยแท็ก <receiver> ในไฟล์ AndroidManifest.xml ซึ่งจะช่วยให้แอปพลิเคชันได้รับ Intent การออกอากาศเมื่อไม่ได้ทำงาน และยังช่วยให้แอปพลิเคชันเผยแพร่เนื้อหาได้ด้วย

<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:permission="com.google.android.engage.REQUEST_ENGAGE_DATA"
      android:exported="true"
      android:enabled="true">
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
      </intent-filter>
   </receiver>
</application>

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

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

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

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

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

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

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

โปรดติดต่อ engage-developers@google.com หากมีคำถามระหว่างกระบวนการผสานรวม ทีมของเราจะตอบกลับโดยเร็วที่สุด

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

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

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