ساعة حزمة تطوير البرامج (SDK) الخاصة بالتفاعل: تعليمات الدمج الفني التابعة لجهات خارجية

تنشئ Google مساحة عرض على الجهاز ينظّم تطبيقات المستخدمين حسب المجالات وتتيح تجربة غامرة جديدة لاستهلاك محتوى التطبيق المخصّص واكتشافه. وتتيح هذه التجربة للشركاء من المطوّرين فرصة عرض أفضل محتوى وافٍ لديهم في قناة مخصَّصة خارج نطاق تطبيقاتهم.

يتضمّن هذا الدليل تعليمات للشركاء من المطوّرين لدمج محتوى الفيديو الخاص بهم باستخدام حزمة Engage SDK لتعبئة كل من هذه المساحة الجديدة ومنصات Google الحالية.

تفاصيل عملية الدمج

المصطلحات

تشمل عملية الدمج هذه أنواع المجموعات الثلاثة التالية: اقتراح ومتابعة ومميزة.

  • تعرض مجموعات الاقتراحات اقتراحات مخصَّصة بشأن محتوى يمكن مشاهدته من شركاء مطوِّرين فرديين.

    تأخذ توصياتك البنية التالية:

    • مجموعة الاقتراحات: طريقة عرض لواجهة مستخدم تتضمّن مجموعة من الاقتراحات من الشريك المطوّر نفسه.

      الشكل 1. واجهة مستخدم "مساحة الترفيه" تعرض مجموعة اقتراحات من شريك واحد.
    • الكيان: هو كائن يمثّل عنصرًا واحدًا في مجموعة. يمكن أن يكون الكيان فيلمًا أو برنامجًا تلفزيونيًا أو مسلسلاً تلفزيونيًا أو فيديو مباشر أو غير ذلك. راجِع قسم تقديم بيانات الكيان للحصول على قائمة بأنواع الكيانات المتوافقة.

      الشكل 2. واجهة مستخدم "مساحة الترفيه" يظهر بها كيان واحد ضمن مجموعة اقتراحات لشريك واحد.
  • تعرض مجموعة المتابعة الفيديوهات غير المكتملة والحلقات ذات الصلة التي تم إصدارها حديثًا من عدة شركاء مطوّرين في مجموعة واجهة مستخدم واحدة. سيُسمح لكل شريك من المطوّرين ببث ما لا يزيد عن 10 كيانات في مجموعة المتابعة. أظهرت الأبحاث أن الاقتراحات المخصصة إلى جانب محتوى المتابعة المخصص تحقق أفضل تفاعل للمستخدمين.

    الشكل 3. واجهة مستخدم "مساحة الترفيه" تعرض مجموعة متابعة مع اقتراحات غير مكتملة من شركاء متعددين (يظهر اقتراح واحد فقط حاليًا)
  • تعرض المجموعة المميزة مجموعة من الكيانات من عدة شركاء مطوّرين في مجموعة واحدة من واجهات المستخدم. سيكون هناك مجموعة واحدة "مميزة" واحدة تظهر بالقرب من أعلى واجهة المستخدم مع موضع ذي أولوية فوق كل مجموعات الاقتراحات. سيتم السماح لكل شريك من المطوّرين ببث ما يصل إلى 10 كيانات في المجموعة المميّزة.

    الشكل 4. واجهة مستخدم "مساحة الترفيه" تعرض مجموعة "محتوى مميّز" مع اقتراحات من شركاء متعددين (يظهر اقتراح واحد فقط في الوقت الحالي)

المرحلة التمهيدية

الحد الأدنى لمستوى واجه�� برمجة التطبيقات: 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.

الملخّص

ويستند التصميم إلى تنفيذ خدمة مرتبطة.

تخضع البيانات التي يمكن للعميل نشرها للحدود التالية لأنواع المجموعات المختلفة:

نوع المجموعة حدود المجموعات الحدود القصوى لعدد العناصر في مجموعة
مجموعات الاقتراحات 5 على الأكثر 50 على الأكثر
مجموعة المتابعة 1 على الأكثر 10 على الأكثر
المجموعة المميزة 1 على الأكثر 10 على الأكثر

الخطوة 0: نقل البيانات من عملية دمج حزمة تطوير البرامج (SDK) الحالية لـ Media Home

ربط نماذج البيانات من عملية الدمج الحالية

إذا كنت بصدد نقل البيانات من عملية دمج حالية لـ Media Home، يوضّح الجدول التالي كيفية ربط نماذج البيانات في حِزم SDK الحالية بحزمة Engage الجديدة:

ما يعادله من دمج MediaHomeVideoControl التفاعل المكافئ لعملية دمج حزمة تطوير البرامج (SDK)
com.google.android.mediahome.video.PreviewChannel com.google.android.engage.common.datamodel.RecommendationCluster
com.google.android.mediahome.video.PreviewChannel.Builder com.google.android.engage.common.datamodel.RecommendationCluster.Builder
com.google.android.mediahome.video.PreviewChannelHelper com.google.android.engage.video.service.AppEngageVideoClient
com.google.android.mediahome.video.PreviewProgram تم التقسيم إلى صفوف منفصلة: EventVideo وLiveStreamingVideo وMovie وTvEpisode وTvSeason وTvShow وVideoClipEntity.
com.google.android.mediahome.video.PreviewProgram.Builder تم التقسيم إلى أدوات إنشاء في صفوف منفصلة: EventVideo وLiveStreamingVideo وMovie وTvEpisode وTvSeason وTvShow وVideoClipEntity.
com.google.android.mediahome.video.VideoContract لم تعد هناك حاجة إليه.
com.google.android.mediahome.video.WatchNextProgram مقسّم إلى سمات في فئات منفصلة: EventVideoEntity وLiveStreamingVideoEntity وMovieEntity وTvEpisodeEntity وTvSeasonEntity وTvShowEntity وVideoClipEntity
com.google.android.mediahome.video.WatchNextProgram.Builder مقسّم إلى سمات في فئات منفصلة: EventVideoEntity وLiveStreamingVideoEntity وMovieEntity وTvEpisodeEntity وTvSeasonEntity وTvShowEntity وVideoClipEntity

نشر المجموعات في حزمة تطوير برامج Media Home مقارنةً بحزمة Engage SDK

باستخدام حزمة تطوير البرامج لـ Media Home، تم نشر المجموعات والكيانات من خلال واجهات برمجة تطبيقات منفصلة، وهي:

// 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، يتم دمج نشر المجموعات والكيانات في طلب بيانات واحد من واجهة برمجة التطبيقات. يتم نشر جميع الكيانات التي تنتمي إلى إحدى المجموعات مع تلك المجموعة:

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

السمة المتطلب Notes
الاسم مطلوب
صور الملصق مطلوب يجب توفّر صورة واحدة على الأقل، ويجب تقديمها بنسبة عرض إلى ارتفاع. (يُفضَّل استخدام الوضع الأفقي، ولكن ننصح باستخدام صور أفقية وعمودية لسيناريوهات مختلفة.)

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) للتشغيل مطلوب

الرابط المؤدي لصفحة معيّنة في تطبيق مقدّم الخدمة لبدء تشغيل الفيلم.

ملاحظة: يمكنك استخدام الروابط لصفحات معيّنة في عملية تحديد المصدر. يُرجى الاطّلاع على هذه الأسئلة الشائعة.

معرّف الموارد المنتظم (URI) لصفحة المعلومات اختياري

الرابط المؤدي لصفحة معيّنة في تطبيق مقدّم الخدمة لعرض تفاصيل حول الفيلم.

ملاحظة: يمكنك استخدام الروابط لصفحات معيّنة في عملية تحديد المصدر. يُرجى الاطّلاع على هذه الأسئلة الشائعة.

تاريخ الإصدار مطلوب بالمللي ثانية من الحقبة
أماكن التوفّر مطلوب

متاح: المحتوى متاح للمستخدم بدون اتخاذ أي إجراء آخر.

FREE_WITH_SUBSCRIPTION: يتوفّر المحتوى بعد أن يشتري المستخدم اشتراكًا.

PAID_CONTENT: يتطلب المحتوى شراء أو استئجار المستخدِم.

تم شراؤه: تم شراء المحتوى أو استئجاره من قِبل المستخدم.

سعر العرض اختياري حقل التعبئة النصّية الحرّة
المدة مطلوب بالمللي ثانية
النوع مطلوب حقل التعبئة النصّية الحرّة
تقييمات المحتوى مطلوب استخدِم نصًا مجانيًا واحرص على اتّباع المعيار المتّبع في المجال. (مثال)
النوع "المشاهدة تاليًا" مطلوب بشكل مشروط

يجب توفيره عندما يكون العنصر في مجموعة المتابعة، ويجب أن يكون أحد الأنواع الأربعة التالية:

متابعة: سبق أن شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

جديد: شاهد المستخدم جميع الحلقات المتاحة من بعض المحتوى المؤلّف من حلقات، ولكن أصبحت حلقة جديدة متوفّرة وهناك حلقة واحدة لم تتم مشاهدتها. ينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة في المسلسلات وما إلى ذلك.

التالي: شاهد المستخدم حلقة واحدة أو أكثر من الحلقات الكاملة من محتوى متسلسل، ولكن تبقّى منه أكثر من حلقة أو حلقة واحدة بالضبط لم تكُن الحلقة ال��خيرة "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة هذا المحتوى المتسلسل.

قائمة المشاهدة: اختار المستخدم صراحةً إضافة فيلم أو حدث أو مسلسل إلى قائمة المشاهدة من أجل تنظيم المحتوى الذي يريد مشاهدته تاليًا بشكل يدوي.

مدّة التفاعل الأخيرة مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة المتابعة. خلال الحقبة بالمللي ثانية
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة Continuation، وفي حال استمرار WatchNextType (متابعة). بالمللي ثانية من الحقبة

TvShowEntity

السمة المتطلب Notes
الاسم مطلوب
صور الملصق مطلوب يجب توفّر صورة واحدة على الأقل، ويجب تقديمها بنسبة عرض إلى ارتفاع. (يُفضَّل استخدام الوضع الأفقي، ولكن ننصح باستخدام صور أفقية وعمودية لسيناريوهات مختلفة.)

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) لصفحة المعلومات مطلوب

تمثّل هذه السمة الرابط لموضع معيّن في تطبيق مقدّم الخدمة لعرض تفاصيل البرنامج التلفزيوني.

ملاحظة: يمكنك استخدام الروابط لصفحات معيّنة في عملية تحديد المصدر. يُرجى الاطّلاع على هذه الأسئلة الشائعة.

معرّف الموارد المنتظم (URI) للتشغيل اختياري

الرابط المؤدي لصفحة معيّنة في تطبيق مقدّم الخدمة لبدء تشغيل البرنامج التلفزيوني

ملاحظة: يمكنك استخدام الروابط لصفحات معيّنة في عملية تحديد المصدر. يُرجى الاطّلاع على هذه الأسئلة الشائعة.

تاريخ بث الحلقة الأولى مطلوب بالمللي ثانية من الحقبة
تاريخ البث الأخير للحلقة اختياري بالمللي ثانية من الحقبة
أماكن التوفّر مطلوب

متاح: المحتوى متاح للمستخدم بدون اتخاذ أي إجراء آخر.

FREE_WITH_SUBSCRIPTION: يتوفّر المحتوى بعد أن يشتري المستخدم اشتراكًا.

PAID_CONTENT: يتطلب المحتوى شراء أو استئجار المستخدِم.

تم شراؤه: تم شراء المحتوى أو استئجاره من قِبل المستخدم.

سعر العرض اختياري حقل التعبئة النصّية الحرّة
عدد المواسم مطلوب عدد صحيح موجب
النوع مطلوب حقل التعبئة النصّية الحرّة
تقييمات المحتوى مطلوب استخدِم نصًا مجانيًا واحرص على اتّباع المعيار المتّبع في المجال. (مثال)
النوع "المشاهدة تاليًا" مطلوب بشكل مشروط

يجب توفيره عندما يكون العنصر في مجموعة المتابعة، ويجب أن يكون أحد الأنواع الأربعة التالية:

متابعة: سبق أن شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

جديد: شاهد المستخدم جميع الحلقات المتاحة من بعض المحتوى المؤلّف من حلقات، ولكن أصبحت حلقة جديدة متوفّرة وهناك حلقة واحدة لم تتم مشاهدتها. ينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة في المسلسلات وما إلى ذلك.

التالي: شاهد المستخدم حلقة واحدة أو أكثر من الحلقات الكاملة من محتوى متسلسل، ولكن تبقّى منه أكثر من حلقة أو حلقة واحدة بالضبط لم تكُن الحلقة الأخيرة "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة هذا المحتوى المتسلسل.

قائمة المشاهدة: اختار المستخدم صراحةً إضافة فيلم أو حدث أو مسلسل إلى قائمة المشاهدة من أجل تنظيم المحتوى الذي يريد مشاهدته تاليًا بشكل يدوي.

مدّة التفاعل الأخيرة مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة المتابعة. خلال الحقبة بالمللي ثانية
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة Continuation، وفي حال استمرار WatchNextType (متابعة). بالمللي ثانية من الحقبة

TvSeasonEntity

السمة المتطلب Notes
الاسم مطلوب
صور الملصق مطلوب يجب توفّر صورة واحدة على الأقل، ويجب تقديمها بنسبة عرض إلى ارتفاع. (يُفضَّل استخدام الوضع الأفقي، ولكن ننصح باستخدام صور أفقية وعمودية لسيناريوهات مختلفة.)

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) لصفحة المعلومات مطلوب

تمثّل هذه السمة الرابط لموضع معيّن في تطبيق مقدّم الخدمة لعرض تفاصيل موسم البرنامج التلفزيوني.

ملاحظة: يمكنك استخدام الروابط لصفحات معيّنة في عملية تحديد المصدر. يُرجى الاطّلاع على هذه الأسئلة الشائعة.

معرّف الموارد المنتظم (URI) للتشغيل اختياري

تمثّل هذه السمة الرابط لموضع معيّن في تطبيق مقدّم الخدمة لبدء تشغيل موسم البرنامج التلفزيوني.

ملاحظة: يمكنك استخدام الروابط لصفحات معيّنة في عملية تحديد المصدر. يُرجى الاطّلاع على هذه الأسئلة الشائعة.

عرض رقم الموسم

اختيارية

متوفّرة في الإصدار 1.3.1

سلسلة
تاريخ بث الحلقة الأولى مطلوب بالمللي ثانية من الحقبة
تاريخ البث الأخير للحلقة اختياري بالمللي ثانية من الحقبة
أماكن التوفّر مطلوب

متاح: المحتوى متاح للمستخدم بدون اتخاذ أي إجراء آخر.

FREE_WITH_SUBSCRIPTION: يتوفّر المحتوى بعد أن يشتري المستخدم اشتراكًا.

PAID_CONTENT: يتطلب المحتوى شراء أو استئجار المستخدِم.

تم شراؤه: تم شراء المحتوى أو استئجاره من قِبل المستخدم.

سعر العرض اختياري حقل التعبئة النصّية الحرّة
عدد الحلقات مطلوب عدد صحيح موجب
النوع مطلوب حقل التعبئة النصّية الحرّة
تقييمات المحتوى مطلوب استخدِم نصًا مجانيًا واحرص على اتّباع المعيار المتّبع في المجال. (مثال)
النوع "المشاهدة تاليًا" مطلوب بشكل مشروط

يجب توفيره عندما يكون العنصر في مجموعة المتابعة، ويجب أن يكون أحد الأنواع الأربعة التالية:

متابعة: سبق أن شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

جديد: شاهد المستخدم جميع الحلقات المتاحة من بعض المحتوى المؤلّف من حلقات، ولكن أصبحت حلقة جديدة متوفّرة وهناك حلقة واحدة لم تتم مشاهدتها. ينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة في المسلسلات وما إلى ذلك.

التالي: شاهد المستخدم حلقة واحدة أو أكثر من الحلقات الكاملة من محتوى متسلسل، ولكن تبقّى منه أكثر من حلقة أو حلقة واحدة بالضبط لم تكُن الحلقة الأخيرة "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة هذا المحتوى المتسلسل.

قائمة المشاهدة: اختار المستخدم صراحةً إضافة فيلم أو حدث أو مسلسل إلى قائمة المشاهدة من أجل تنظيم المحتوى الذي يريد مشاهدته تاليًا بشكل يدوي.

مدّة التفاعل الأخيرة مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة المتابعة. خلال الحقبة بالمللي ثانية
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة Continuation، وفي حال استمرار WatchNextType (متابعة). بالمللي ثانية من الحقبة

TvEpisodeEntity

السمة المتطلب Notes
الاسم مطلوب
صور الملصق مطلوب يجب توفّر صورة واحدة على الأقل، ويجب تقديمها بنسبة عرض إلى ارتفاع. (يُفضَّل استخدام الوضع الأفقي، ولكن ننصح باستخدام صور أفقية وعمودية لسيناريوهات مختلفة.)

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) للتشغيل مطلوب

الرابط المؤدي لصفحة معيّنة في تطبيق مقدّم الخدمة لبدء تشغيل الحلقة

ملاحظة: يمكنك استخدام الروابط لصفحات معيّنة في عملية تحديد المصدر. يُرجى الاطّلاع على هذه الأسئلة الشائعة.

معرّف الموارد المنتظم (URI) لصفحة المعلومات اختياري

تمثّل هذه السمة الرابط لموضع معيّن في تطبيق مقدّم الخدمة لعرض تفاصيل حول حلقة البرنامج التلفزيوني.

ملاحظة: يمكنك استخدام الروابط لصفحات معيّنة في عملية تحديد المصدر. يُرجى الاطّلاع على هذه الأسئلة الشائعة.

عرض رقم الحلقة

اختيارية

متوفّرة في الإصدار 1.3.1

سلسلة
تاريخ البث المباشر مطلوب بالمللي ثانية من الحقبة
أماكن التوفّر مطلوب

متاح: المحتوى متاح للمستخدم بدون اتخاذ أي إجراء آخر.

FREE_WITH_SUBSCRIPTION: يتوفّر المحتوى بعد أن يشتري المستخدم اشتراكًا.

PAID_CONTENT: يتطلب المحتوى شراء أو استئجار المستخدِم.

تم شراؤه: تم شراء المحتوى أو استئجاره من قِبل المستخدم.

سعر العرض اختياري حقل التعبئة النصّية الحرّة
المدة مطلوب يجب أن تكون القيمة موجبة بالمللي ثانية.
النوع مطلوب حقل التعبئة النصّية الحرّة
تقييمات المحتوى مطلوب استخدِم نصًا مجانيًا واحرص على اتّباع المعيار المتّبع في المجال. (مثال)
النوع "المشاهدة تاليًا" مطلوب بشكل مشروط

يجب توفيره عندما يكون العنصر في مجموعة المتابعة، ويجب أن يكون أحد الأنواع الأربعة التالية:

متابعة: سبق أن شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

جديد: شاهد المستخدم جميع الحلقات المتاحة من بعض المحتوى المؤلّف من حلقات، ولكن أصبحت حلقة جديدة متوفّرة وهناك حلقة واحدة لم تتم مشاهدتها. ينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة في المسلسلات وما إلى ذلك.

التالي: شاهد المستخدم حلقة واحدة أو أكثر من الحلقات الكاملة من محتوى متسلسل، ولكن تبقّى منه أكثر من حلقة أو حلقة واحدة بالضبط لم تكُن الحلقة الأخيرة "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة هذا المحتوى المتسلسل.

قائمة المشاهدة: اختار المستخدم صراحةً إضافة فيلم أو حدث أو مسلسل إلى قائمة المشاهدة من أجل تنظيم المحتوى الذي يريد مشاهدته تاليًا بشكل يدوي.

مدّة التفاعل الأخيرة مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة المتابعة. خلال الحقبة بالمللي ثانية
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة Continuation، وفي حال استمرار WatchNextType (متابعة). بالمللي ثانية من الحقبة

LiveStreamingVideoEntity

السمة المتطلب Notes
الاسم مطلوب
صور الملصق مطلوب يجب توفّر صورة واحدة على الأقل، ويجب تقديمها بنسبة عرض إلى ارتفاع. (يُفضَّل استخدام الوضع الأفقي، ولكن ننصح باستخدام صور أفقية وعمودية لسيناريوهات مختلفة.)

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) للتشغيل مطلوب

تمثّل هذه السمة الرابط لصفحة في تطبيق مقدّم الخدمة لبدء تشغيل الفيديو.

ملاحظة: يمكنك استخدام الروابط لصفحات معيّنة في عملية تحديد المصدر. يُرجى الاطّلاع على هذه الأسئلة الشائعة.

محطة البث مطلوب حقل التعبئة النصّية الحرّة
وقت البدء اختياري بالمللي ثانية من الحقبة
وقت الانتهاء اختياري بالمللي ثانية من الحقبة
عدد المشاهدات اختياري يجب ترجمة النص المجاني.
النوع "المشاهدة تاليًا" مطلوب بشكل مشروط

يجب توفيره عندما يكون العنصر في مجموعة المتابعة، ويجب أن يكون أحد الأنواع الأربعة التالية:

متابعة: سبق أن شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

جديد: شاهد المستخدم جميع الحلقات المتاحة من بعض المحتوى المؤلّف من حلقات، ولكن أصبحت حلقة جديدة متوفّرة وهناك حلقة واحدة لم تتم مشاهدتها. ينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة في المسلسلات وما إلى ذلك.

التالي: شاهد المستخدم حلقة واحدة أو أكثر من الحلقات الكاملة من محتوى متسلسل، ولكن تبقّى منه أكثر من حلقة أو حلقة واحدة بالضبط لم تكُن الحلقة الأخيرة "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة هذا المحتوى المتسلسل.

قائمة المشاهدة: اختار المستخدم صراحةً إضافة فيلم أو حدث أو مسلسل إلى قائمة المشاهدة من أجل تنظيم المحتوى الذي يريد مشاهدته تاليًا بشكل يدوي.

مدّة التفاعل الأخيرة مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة المتابعة. خلال الحقبة بالمللي ثانية
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة Continuation، وفي حال استمرار WatchNextType (متابعة). بالمللي ثانية من الحقبة

VideoClipEntity

يمثّل العنصر VideoClipEntity كيان فيديو صادرًا من وسائل التواصل الاجتماعي، ��ثل TikTok أو YouTube.

السمة المتطلب Notes
الاسم مطلوب
صور الملصق مطلوب يجب توفّر صورة واحدة على الأقل، ويجب تقديمها بنسبة عرض إلى ارتفاع. (يُفضَّل استخدام الوضع الأفقي، ولكن ننصح باستخدام صور أفقية وعمودية لسيناريوهات مختلفة.)

راجِع مواصفات الصور للحصول على إرشادات.

معرّف الموارد المنتظم (URI) للتشغيل مطلوب

تمثّل هذه السمة الرابط لصفحة في تطبيق مقدّم الخدمة لبدء تشغيل الفيديو.

ملاحظة: يمكنك استخدام الروابط لصفحات معيّنة في عملية تحديد المصدر. يُرجى الاطّلاع على هذه الأسئلة الشائعة.

تاريخ الإنشاء مطلوب بالمللي ثانية من الحقبة
المدة مطلوب يجب أن تكون القيمة موجبة بالمللي ثانية.
صانع المحتوى مطلوب حقل التعبئة النصّية الحرّة
صورة صانع المحتوى اختياري صورة الصورة الرمزية لصانع المحتوى
عدد المشاهدات اختياري يجب ترجمة النص المجاني.
النوع "المشاهدة تاليًا" مطلوب بشكل مشروط

يجب توفيره عندما يكون العنصر في مجموعة المتابعة، ويجب أن يكون أحد الأنواع الأربعة التالية:

متابعة: سبق أن شاهد المستخدم أكثر من دقيقة واحدة من هذا المحتوى.

جديد: شاهد المستخدم جميع الحلقات المتاحة من بعض المحتوى المؤلّف من حلقات، ولكن أصبحت حلقة جديدة متوفّرة وهناك حلقة واحدة لم تتم مشاهدتها. ينطبق ذلك على البرامج التلفزيونية ومباريات كرة القدم المسجّلة في المسلسلات وما إلى ذلك.

التالي: شاهد المستخدم حلقة واحدة أو أكثر من الحلقات الكاملة من محتوى متسلسل، ولكن تبقّى منه أكثر من حلقة أو حلقة واحدة بالضبط لم تكُن الحلقة الأخيرة "جديدة" وتم إصدارها قبل أن يبدأ المستخدم بمشاهدة هذا المحتوى المتسلسل.

قائمة المشاهدة: اختار المستخدم صراحةً إضافة فيلم أو حدث أو مسلسل إلى قائمة المشاهدة من أجل تنظيم المحتوى الذي يريد مشاهدته تاليًا بشكل يدوي.

مدّة التفاعل الأخيرة مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة المتابعة. خلال الحقبة بالمللي ثانية
وقت آخر موضع تشغيل مطلوب بشكل مشروط يجب توفيره عندما يكون العنصر في مجموعة Continuation، وفي حال استمرار WatchNextType (متابعة). بالمللي ثانية من الحقبة

مواصفات الصور

يسرد القسم التالي المواصفات المطلوبة لمواد عرض الصور:

تنسيقات الملفات

PNG أو JPG أو GIF ثابت أو WebP

الحد الأقصى لحجم الملف

5120 كيلوبايت

اقتراحات إضافية

  • المنطقة الآمنة للصور: ضَع المحتوى المهم في الوسط بحيث يشغل 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 مسؤولية نشر المجموعات. تتوفر واجهات برمجة التطبيقات التالية في البرنامج:

  • isServiceAvailable
  • publishRecommendationClusters
  • publishFeaturedCluster
  • publishContinuationCluster
  • publishUserAccountManagementRequest
  • updatePublishStatus
  • deleteRecommendationsClusters
  • deleteFeaturedCluster
  • deleteContinuationCluster
  • deleteUserManagementCluster
  • deleteClusters

isServiceAvailable

يتم استخدام واجهة برمجة التطبيقات هذه للتحقق مما إذا كانت الخدمة متاحة للدمج وما إذا كان من الممكن عرض المحتوى على الجهاز.

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

تُستخدَم واجهة برمجة التطبيقات هذه لنشر قائمة تتضمّن عناصر 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

تُستخدَم واجهة برمجة التطبيقات هذه لنشر قائمة تتضمّن عناصر 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

تُستخدَم واجهة برمجة التطبيقات ه��ه لنشر عنصر ContinuationCluster.

Kotlin

client.publishContinuationCluster(
    PublishContinuationClusterRequest.Builder()
      .setContinuationCluster(
        ContinuationCluster.Builder()
          .addEntity(entity1)
          .addEntity(entity2)
          .build())
      .build())

Java

client.publishContinuationCluster(
            new PublishContinuationClusterRequest.Builder()
                .setContinuationCluster(
                    new ContinuationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .build())
                .build());

عندما تتلقّى الخدمة الطلب، يتم تنفيذ الإجراءات التالية في معاملة واحدة:

  • وستتم إزالة بيانات ContinuationCluster الحالية من الشريك المطوّر.
  • يتم تحليل البيانات من الطلب وتخزينها في مجموعة المتابعة المحدثة.

وفي حال حدوث خطأ، يتم رفض الطلب بأكمله والحفاظ على الحالة الحالية.

publishUserAccountManagementRequest

تُستخدم واجهة برمجة التطبيقات هذه لنشر بطاقة تسجيل الدخول . يوجّه إجراء تسجيل الدخول المستخدمين إلى صفحة تسجيل الدخول إلى التطبيق حتى يتمكن التطبيق من نشر المحتوى (أو تقديم محتوى أكثر تخصيصًا)

البيانات الوصفية التالية هي جزء من بطاقة تسجيل الدخول:

السمة المتطلب الوصف
معرّف الموارد المنتظم (URI) الحركة مطلوب رابط لصفحة في التطبيق (أي الانتقال إلى صفحة تسجيل الدخول إلى التطبيق)
صورة اختياري - يجب توفير العنوان في حال عدم تقديمه

الصورة المعروضة على البطاقة

صور بنسبة عرض إلى ارتفاع تبلغ 16×9 بدقة 1264×712

العنوان اختياري - يجب تقديم الصورة إذا لم يتم توفيرها العنوان على البطاقة
نص الإجراء اختياري النص المعروض في عبارة الحث على اتخاذ إجراء (أي تسجيل الدخول)
العنوان الفرعي اختياري عنوان فرعي اختياري على البطاقة

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). وهذا أمر مهم للأسباب التالية :

  • من المهم توفير الحالة في جميع السيناريوهات، حتى عند نشر المحتوى (الحالة == منشور)، لتعبئة لوحات البيانات التي تستخدم هذه الحالة الفاضحة لنقل البيانات الصحية وغيرها من المقاييس المتعلقة بعملية الدمج.
  • إذا لم يتم نشر أي محتوى ولكن لم يتم تعطُّل حالة الدمج (STATUS == NOT_HOSTED)، يمكن أن تتجنّب 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 باستخدام رمز الحالة NOT_HOSTED_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

تُستخدَم واجهة برمجة التطبيقات هذه لحذف محتوى مجموعات الاقتراحات.

Kotlin

client.deleteRecommendationClusters()

Java

client.deleteRecommendationClusters();

عندما تتلقّى الخدمة الطلب، تزيل البيانات الحالية من مجموعات الاقتراحات. وفي حالة حدوث خطأ، يتم رفض الطلب بأكمله ويتم الاحتفاظ بحالته الحالية.

deleteFeaturedCluster

يتم استخدام واجهة برمجة التطبيقات هذه لحذف محتوى "المجموعة المميزة".

Kotlin

client.deleteFeaturedCluster()

Java

client.deleteFeaturedCluster();

عندما تتلقى الخدمة الطلب، تزيل البيانات الحالية من "المجموعة المميزة". وفي حالة حدوث خطأ، يتم رفض الطلب بأكمله ويتم الاحتفاظ بحالته الحالية.

deleteContinuationCluster

يتم استخدام واجهة برمجة التطبيقات هذه لحذف محتوى مجموعة Continuation Cluster.

Kotlin

client.deleteContinuationCluster()

Java

client.deleteContinuationCluster();

عندما تتلقى الخدمة الطلب، تزيل البيانات الحالية من مجموعة المتابعة. وفي حالة حدوث خطأ، يتم رفض الطلب بأكمله ويتم الاحتفاظ بحالته الحالية.

deleteUserManagementCluster

يتم استخدام واجهة برمجة التطبيقات هذه لحذف محتوى مجموعة UserAccountManagement.

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

عندما تتلقى الخدمة الطلب، تزيل البيانات الحالية من مجموعة UserAccountManagement. وفي حالة حدوث خطأ، يتم رفض الطلب بأكمله مع الحفاظ على الحالة الحالية.

deleteClusters

تُستخدَم واجهة برمجة التطبيقات هذه لحذف محتوى نوع مجموعة معيّن.

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());

وعندما تتلقّى الخدمة الطلب، تزيل البيانات الحالية من جميع المجموعات المطابقة لأنواع المجموعات المحدّدة. يمكن للعملاء اختيار تمرير واحد أو أكثر من أنواع المجموعات. وفي حال حدوث خطأ، يتم رفض الطلب بأكمله مع الحفاظ على الحالة الحالية.

خطأ أثناء المعالجة

ننصحك بشدّة بالاستماع إلى نتيجة المهمة من واجهات برمجة التطبيقات الخاصة بالنشر، بحيث يمكن اتّخاذ إجراء متابعة لاسترداد مهمة ناجحة وإعادة إرسالها.

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 مع تضمين السبب كرمز خطأ.

رمز الخطأ ملاحظة
SERVICE_NOT_FOUND الخدمة غير متوفّرة على الجهاز المحدّد.
SERVICE_NOT_AVAILABLE تتوفّر الخدمة على الجهاز المحدّد، ولكنّها غير متاحة في وقت المكالمة (على سبيل المثال، تم إيقافها صراحةً).
SERVICE_CALL_EXECUTION_FAILURE تعذّر تنفيذ المهمة بسبب حدوث مشاكل في سلاسل المحادثات. وفي هذه الحالة، يمكن إعادة المحاولة.
SERVICE_CALL_PERMISSION_DENIED غير مسموح للمتصل بإجراء اتصال الخدمة.
SERVICE_CALL_INVALID_ARGUMENT يحتوي الطلب على بيانات غير صالحة (مثلاً، أكبر من العدد المسموح به من المجموعات).
SERVICE_CALL_INTERNAL حدث خطأ من جانب الخدمة.
SERVICE_CALL_RESOURCE_EXHAUSTED يتم إجراء استدعاء الخدمة بشكل متكرر جدًا.

الخطوة 3: التعامل مع أهداف البث

بالإضافة إلى إرسال طلبات البيانات من واجهة برمجة التطبيقات Publishing API من خلال المهام، يجب أيضًا إعداد BroadcastReceiver لتلقّي طلب نشر المحتوى.

الهدف من أهداف البث هو إعادة تفعيل التطبيقات وفرض مزامنة البيانات. إنّ الأهداف المتعلقة بالبث ليست مصمّمة ليتم إرسالها بشكل متكرّر. ولا يتم تشغيله إلا عندما تحدّد "خدمة Engage" أنّ المحتوى قد يكون قديمًا (على سبيل المثال، قبل أسبوع). وبهذه الطريقة، تزيد الثقة في أنّ المستخدم يمكنه الحصول على تجربة محتوى جديدة، حتى إذا لم يتم تنفيذ التطبيق لفترة زمنية طويلة.

يجب إعداد جهاز BroadcastReceiver بالطريقتَين التاليتَين:

  • تسجيل مثيل من الفئة 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. ويتيح ذلك للتطبيق تلقّي أهداف البث عندما لا يكون قيد التشغيل، كما يسمح للتطبيق بنشر المحتوى.
<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>

ترسل الخدمة الإشارات التالية:

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION يُنصح ببدء مكالمة publishRecommendationClusters عند تلقّي هذا الغرض من المكالمة.
  • com.google.android.engage.action.PUBLISH_FEATURED يُنصح ببدء مكالمة publishFeaturedCluster عند تلقّي هذا النية.
  • com.google.android.engage.action.PUBLISH_CONTINUATION يُنصح ببدء مكالمة publishContinuationCluster عند تلقّي هذا الغرض.

سير عمل عملية الدمج

للحصول على دليل مفصّل حول التحقّق من عملية الدمج بعد اكتمالها، يُرجى الاطّلاع على التفاعل مع سير عمل دمج المطوّرين.

الأسئلة الشائعة

يُرجى الاطّلاع على الأسئلة الشائعة حول Engage SDK للتعرّف على الأسئلة الشائعة.

Contact

يمكنك التواصل مع Engage-developers@google.com إذا كانت لديك أي أسئلة خلال عملية الدمج.

الخطوات التالية

بعد إكمال عملية الدمج هذه، ستكون خطواتك التالية هي التالية:

  • أرسِل رسالة إلكترونية إلى Engage-developers@google.com وأرفق ملف APK المتكامل والجاهز للاختبار من Google.
  • تُجري Google عملية تحقق ومراجع��ت داخليًا للتأكّد من أنّ عملية الدمج تعمل على النحو المتوقّع. إذا لزم الأمر، ستتصل بك Google بأي تفاصيل ضرورية.
  • عند اكتمال الاختبار وعدم الحاجة إلى أي تغييرات، تتواصل معك Google لإعلامك بأنّه يمكنك بدء نشر حِزمة APK المُحدَّثة والمدمجة على "متجر Play".
  • بعد أن تتأكد Google من نشر حِزمة APK المُعدَّلة على "متجر Play"، قد يتم نشر مجموعات الاقتراحات والمميزة ومتابعة وإتاحتها للمستخدمين.