دليل دمج حزمة Engage SDK للتلفزيون

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

العمل التحضيري

قبل البدء، أكمل الخطوات التالية:

  1. تحديث إلى المستوى 19 أو مستوى أحدث لواجهة برمجة التطبيقات المستهدَف

  2. أضِف مكتبة com.google.android.engage إلى تطبيقك باتّباع الخطوات التالية:

    تتوفّر حِزم SDK منفصلة لاستخدامها في عملية الدمج، إحداها للتطبيقات المتوافقة مع الأجهزة الجوّالة والأخرى للتطبيقات المتوافقة مع أجهزة التلفزيون.

    الأجهزة الجوّالة

    
      dependencies {
        implementation 'com.google.android.engage:engage-core:1.5.5
      }
    

    تلفزيون

    
      dependencies {
        implementation 'com.google.android.engage:engage-tv:1.0.2
      }
    
  3. اضبط بيئة خدمة Engage على الإنتاج في ملف AndroidManifest.xml.

    الأجهزة الجوّالة

    
    <meta-data
        android:name="com.google.android.engage.service.ENV"
        android:value="PRODUCTION" />
    

    تلفزيون

    
    <meta-data
        android:name="com.google.android.engage.service.ENV"
        android:value="PRODUCTION" />
    
  4. إضافة إذن لـ WRITE_EPG_DATA لملف APK الخاص بالتلفزيون

    <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
    
  5. يمكنك التحقّق من نشر المحتوى بشكل موثوق من خلال استخدام خدمة تعمل في الخلفية، مثل androidx.work، لتحديد المواعيد.

  6. لتقديم تجربة مشاهدة سلسة، يجب نشر بيانات &quot;مواصلة المشاهدة&quot; عند حدوث الأحداث التالية:

    1. تسجيل الدخول لأول مرة: عند تسجيل دخول المستخدم لأول مرة، يجب نشر البيانات لضمان توفّر سجل المشاهدة على الفور.
    2. إنشاء الملف الشخصي أو التبديل بين الملفات (التطبيقات التي تتضمّن ملفات شخصية متعددة): إذا كان تطبيقك يتيح إنشاء ملفات شخصية متعددة، يجب نشر البيانات عندما ينشئ المستخدم ملفًا شخصيًا أو يبدّل بين الملفات.
    3. انقطاع تشغيل الفيديو: لمساعدة المستخدمين في استئناف المشاهدة من حيث توقّفوا، يجب نشر البيانات عندما يوقفون الفيديو مؤقتًا أو يوقفونه، أو عندما يخرجون من التطبيق أثناء تشغيل الفيديو.
    4. تعديلات على شريط &quot;مواصلة المشاهدة&quot; (في حال توفّره): عندما يزيل المستخدم محتوًى من شريط &quot;مواصلة المشاهدة&quot;، يجب عرض هذا التغيير من خلال نشر بيانات معدَّلة.
    5. إكمال الفيديو:
      1. بالنسبة إلى الأفلام، أزِل الفيلم المكتمل من شريط "مواصلة المشاهدة". إذا كان الفيلم جزءًا من سلسلة، أضِف الفيلم التالي للحفاظ على تفاعل المستخدم.
      2. بالنسبة إلى الحلقات، أزِل الحلقة المكتملة وأضِف الحلقة التالية في السلسلة، إذا كانت متاحة، لتشجيع المشاهدة المتواصلة.

نموذج التعليمات البرمجية

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

التكامل

AccountProfile

للسماح بتجربة مخصّصة لميزة "مواصلة المشاهدة" على Google TV، يجب تقديم معلومات الحساب والملف الشخصي. استخدِم AccountProfile لتقديم ما يلي:

  1. معرّف الحساب: هو معرّف فريد يمثّل حساب المستخدِم داخل تطبيقك. يمكن أن يكون هذا هو رقم تعريف الحساب الفعلي أو نسخة معدَّلة بشكل مناسب.

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

// If your app only supports account
val accountProfile = AccountProfile.Builder()
    .setAccountId("your_users_account_id")
    .build()

// If your app supports both account and profile
val accountProfile = AccountProfile.Builder()
    .setAccountId("your_users_account_id")
    .setProfileId("your_users_profile_id")
    .build()

إنشاء كيانات

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

  1. MovieEntity
  2. TvEpisodeEntity
  3. LiveStreamingVideoEntity
  4. VideoClipEntity

حدِّد معرّفات الموارد الموحّدة الخاصة بالمنصة وصور الملصقات لهذه الكيانات.

عليك أيضًا إنشاء معرّفات URI للتشغيل لكل نظام أساسي، مثل Android TV أو Android أو iOS، إذا لم يسبق لك ذلك. وبالتالي، عندما يواصل المستخدم مشاهدة المحتوى على كل منصة، يستخدم التطبيق معرّف موارد منتظم (URI) مستهدفًا لتشغيل محتوى الفيديو.

// Required. Set this when you want continue watching entities to show up on
// Google TV
val playbackUriTv = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_ANDROID_TV)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_tv"))
    .build()

// Required. Set this when you want continue watching entities to show up on
// Google TV Android app, Entertainment Space, Playstore Widget
val playbackUriAndroid = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_ANDROID_MOBILE)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_android"))
    .build()

// Optional. Set this when you want continue watching entities to show up on
// Google TV iOS app
val playbackUriIos = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_IOS)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_ios"))
    .build()

val platformSpecificPlaybackUris =
    Arrays.asList(playbackUriTv, playbackUriAndroid, playbackUriIos)

تتطلّب صور الملصقات معرّف موارد موحّد وأبعادًا بالبكسل (الارتفاع والعرض). استهدِف عوامل شكل مختلفة من خلال تقديم عدة صور ملصقات، ولكن تأكَّد من أنّ جميع الصور تحافظ على نسبة عرض إلى ارتفاع تبلغ 16:9 وارتفاع يبلغ 200 بكسل على الأقل لعرض كيان "مواصلة المشاهدة" بشكل صحيح، خاصةً في Entertainment Space من Google. قد لا يتم عرض الصور التي يقل ارتفاعها عن 200 بكسل.

val images = Arrays.asList(
    Image.Builder()
        .setImageUri(Uri.parse("http://www.example.com/entity_image1.png"))
        .setImageHeightInPixel(300)
        .setImageWidthInPixel(169)
        .build(),
    Image.Builder()
        .setImageUri(Uri.parse("http://www.example.com/entity_image2.png"))
        .setImageHeightInPixel(640)
        .setImageWidthInPixel(360)
        .build()
    // Consider adding other images for different form factors
)
MovieEntity

يوضّح هذا المثال كيفية إنشاء MovieEntity مع جميع الحقول المطلوبة:

val movieEntity = MovieEntity.Builder()
   .setWatchNextType(WatchNextType.TYPE_CONTINUE)
   .setName("Movie name")
   .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
   .addPosterImages(images)
   // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
   .setLastEngagementTimeMillis(1701388800000)
   // Suppose the duration is 2 hours, it is 72000000 in milliseconds
   .setDurationMills(72000000)
   // Suppose last playback offset is 1 hour, 36000000 in milliseconds
   .setLastPlayBackPositionTimeMillis(36000000)
   .build()

من خلال تقديم تفاصيل مثل الأنواع وتقييمات المحتوى، يصبح بإمكان Google TV عرض المحتوى الخاص بك بطرق أكثر ديناميكية وربطه بالمشاهدين المناسبين.

val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val movieEntity = MovieEntity.Builder()
    ...
    .addGenres(genres)
    .addContentRatings(contentRatings)
    .build()

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

// Set the expiration time to be now plus 30 days in milliseconds
val expirationTime = DisplayTimeWindow.Builder()
    .setEndTimestampMillis(now().toMillis()+2592000000).build()
val movieEntity = MovieEntity.Builder()
    ...
    .addAvailabilityTimeWindow(expirationTime)
    .build()
TvEpisodeEntity

يوضّح هذا المثال كيفية إنشاء TvEpisodeEntity مع جميع الحقول المطلوبة:

val tvEpisodeEntity = TvEpisodeEntity.Builder()
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Episode name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(72000000) // 2 hours in milliseconds
    // 45 minutes and 15 seconds in milliseconds is 2715000
    .setLastPlayBackPositionTimeMillis(2715000)
    .setEpisodeNumber("2")
    .setSeasonNumber("1")
    .setShowTitle("Title of the show")
    .build()

سيتم توسيع سلسلة رقم الحلقة (مثل "2") وسلسلة رقم الموسم (مثل "1") إلى الشكل المناسب قبل عرضها على بطاقة "متابعة المشاهدة". يجب أن تكون سلسلة رقمية، ولا تضع "e2" أو "الحلقة 2" أو "s1" أو "الموسم 1".

إذا كان برنامج تلفزيوني معيّن يتضمّن موسمًا واحدًا، اضبط رقم الموسم على 1.

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

val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val tvEpisodeEntity = TvEpisodeEntity.Builder()
    ...
    .addGenres(genres)
    .addContentRatings(contentRatings)
    .setSeasonTitle("Season Title")
    .setShowTitle("Show Title")
    .build()
VideoClipEntity

في ما يلي مثال على إنشاء VideoClipEntity مع جميع الحقول المطلوبة.

يمثّل VideoClipEntity مقطعًا من إنشاء المستخدمين، مثل فيديو على YouTube.

val videoClipEntity = VideoClipEntity.Builder()
    .setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform")
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Video clip name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(600000) //10 minutes in milliseconds
    .setLastPlayBackPositionTimeMillis(300000) //5 minutes in milliseconds
    .addContentRating(contentRating)
    .build()

يمكنك اختياريًا ضبط معلومات المنشئ أو صورة المنشئ أو وقت الإنشاء بالملّي ثانية أو فترة التوفّر .

LiveStreamingVideoEntity

في ما يلي مثال على إنشاء LiveStreamingVideoEntity مع جميع الحقول المطلوبة.

val liveStreamingVideoEntity = LiveStreamingVideoEntity.Builder()
    .setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform")
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Live streaming name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(72000000) //2 hours in milliseconds
    .setLastPlayBackPositionTimeMillis(36000000) //1 hour in milliseconds
    .addContentRating(contentRating)
    .build()

يمكنك اختياريًا ضبط وقت البدء أو المذيع أو رمز المذيع أو فترة التوفّر لكيان البث المباشر.

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

توفير بيانات مجموعة استمرار

تتحمّل AppEngagePublishClient مسؤولية نشر مجموعة "المتابعة". يمكنك استخدام الطريقة publishContinuationCluster() لنشر الكائن ContinuationCluster.

عليك أولاً استخدام isServiceAvailable() للتحقّق مما إذا كانت الخدمة متاحة للتكامل.

client.publishContinuationCluster(
    PublishContinuationClusterRequest
        .Builder()
        .setContinuationCluster(
            ContinuationCluster.Builder()
                .setAccountProfile(accountProfile)
                .addEntity(movieEntity1)
                .addEntity(movieEntity2)
                .addEntity(tvEpisodeEntity1)
                .addEntity(tvEpisodeEntity2)
                .setSyncAcrossDevices(true)
                .build()
        )
        .build()
)

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

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

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

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

يجب توفير بيانات ContinuationCluster لحسابات البالغين فقط. يتم النشر فقط عندما يكون AccountProfile تابعًا لشخص بالغ.

المزامنة على جميع الأجهزة

يتحكّم العلامة SyncAcrossDevices في ما إذا كانت بيانات ContinuationCluster الخاصة بالمستخدم تتم مزامنتها على جميع الأجهزة، مثل التلفزيون والهاتف والأجهزة اللوحية وما إلى ذلك. تكون المزامنة على جميع الأجهزة غير مفعّلة تلقائيًا.

القيم:

  • true: تتم مشاركة بيانات ContinuationCluster على جميع أجهزة المستخدم لتوفير تجربة مشاهدة سلسة. ننصحك بشدة باستخدام هذا الخيار للحصول على أفضل تجربة على جميع الأجهزة.
  • false: تقتصر بيانات ContinuationCluster على الجهاز الحالي.

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

// Example to allow cross device syncing.
client.publishContinuationCluster(
    PublishContinuationClusterRequest
        .Builder()
        .setContinuationCluster(
            ContinuationCluster.Builder()
                .setAccountProfile(accountProfile)
                .setSyncAcrossDevices(true)
                .build()
        )
        .build()
)

للاستفادة إلى أقصى حدّ من ميزة "استخدام أكثر من جهاز واحد"، تأكَّد من أنّ التطبيق يحصل على موافقة المستخدم وفعِّل SyncAcrossDevices إلى true. يتيح ذلك مزامنة المحتوى بسلاسة على جميع الأجهزة، ما يؤدي إلى تحسين تجربة المستخدم وزيادة التفاعل. على سبيل المثال، لاحظ أحد الشركاء الذين نفّذوا هذه الميزة زيادة بنسبة ‏40% في عدد النقرات على "متابعة المشاهدة" لأنّ المحتوى الخاص به ظهر على أجهزة متعددة.

حذف بيانات "الفيديوهات المقترَحة"

لحذف بيانات المستخدم يدويًا من خادم Google TV قبل انتهاء فترة الاحتفاظ بالبيانات العادية البالغة 60 يومًا، استخدِم طريقة client.deleteClusters(). عند تلقّي الطلب، ستحذف الخدمة جميع بيانات العثور على الفيديوهات الحالية الخاصة بملف الحساب أو الحساب بأكمله.

يحدّد التعداد DeleteReason سبب حذف البيانات. يزيل الرمز التالي بيانات "مواصلة المشاهدة" عند تسجيل الخروج.


// If the user logs out from your media app, you must make the following call
// to remove continue watching data from the current google TV device,
// otherwise, the continue watching data will persist on the current
// google TV device until 60 days later.
client.deleteClusters(
    DeleteClustersRequest.Builder()
        .setAccountProfile(AccountProfile())
        .setReason(DeleteReason.DELETE_REASON_USER_LOG_OUT)
        .setSyncAcrossDevices(true)
        .build()
)

الاختبار

استخدِم تطبيق التحقّق للتأكّد من أنّ عملية دمج حزمة تطوير البرامج Engage SDK تعمل بشكلٍ صحيح. يوفّر تطبيق التحقّق أدوات تساعدك في التحقّق من بياناتك والتأكّد من أنّه يتم التعامل مع أغراض البث بشكل صحيح.

بعد استدعاء واجهة برمجة التطبيقات Publish API، تأكَّد من نشر بياناتك بشكل صحيح من خلال التحقّق من تطبيق التحقّق. من المفترض أن تظهر مجموعة استمراريتك كصف منفصل ضمن واجهة التطبيق.

  • اضبط علامة خدمة التفاعل على الإصدارات غير الإنتاجية فقط في ملف بيان Android الخاص بتطبيقك.
  • تثبيت تطبيق Engage Verify وفتحه
  • إذا كانت قيمة isServiceAvailable هي false، انقر على الزرّ "تبديل" للتفعيل.
  • أدخِل اسم حزمة تطبيقك لعرض البيانات المنشورة تلقائيًا بعد بدء النشر.
  • اختبِر الإجراءات التالية في تطبيقك:
    • سجِّل الدخول.
    • التبديل بين الملفات الشخصية(إذا كان ذلك منطبقًا)
    • بدء فيديو ثم إيقافه مؤقتًا أو الرجوع إلى الصفحة الرئيسية
    • أغلِق التطبيق أثناء تشغيل الفيديو.
    • إزالة فيلم أو برنامج تلفزيوني من صف "مواصلة المشاهدة" (في حال توفُّر هذه الميزة)
  • بعد كل إجراء، تأكَّد من أنّ تطبيقك قد استدعى واجهة برمجة التطبيقات publishContinuationClusters ومن عرض البيانات بشكل صحيح في تطبيق التحقّق.
  • سيعرض تطبيق التحقّق علامة صح خضراء "كل شيء على ما يرام" للكيانات التي تم تنفيذها بشكل صحيح.

    لقطة شاشة تبيّن نجاح عملية إثبات الملكية باستخدام التطبيق
    الشكل 1. نجاح عملية التحقّق من التطبيق
  • سيشير تطبيق التحقّق إلى أي كيانات تتضمّن مشاكل.

    لقطة شاشة لخطأ في تطبيق التحقّق
    الشكل 2. خطأ في تطبيق التحقّق
  • لتحديد المشاكل في الكيانات التي تتضمّن أخطاء وحلّها، استخدِم جهاز التحكّم عن بُعد الخاص بالتلفزيون لاختيار الكيان والنقر عليه في تطبيق إثبات الملكية. سيتم عرض المشاكل المحدّدة وتمييزها باللون الأحمر لتتمكّن من مراجعتها (راجِع المثال أدناه).

    تفاصيل خطأ تطبيق التحقّق
    الشكل 3. تفاصيل خطأ تطبيق التحقّق

REST API

توفّر حزمة تطوير البرامج (SDK) الخاصة بمنصة Engage واجهة برمجة تطبيقات REST لتوفير تجربة متسقة لميزة "متابعة المشاهدة" على منصات غير Android، مثل iOS وRoku TV. تتيح واجهة برمجة التطبيقات للمطوّرين تعديل حالة "مواصلة المشاهدة" للمستخدمين الذين وافقوا على هذه الميزة من منصات غير Android.

المتطلّبات الأساسية

  • عليك أولاً إكمال عملية الدمج المستندة إلى حزمة Engage SDK على الجهاز. تُنشئ هذه الخطوة المهمة الربط اللازم بين رقم تعريف المستخدم على Google وAccountProfile في تطبيقك.
  • الوصول إلى واجهة برمجة التطبيقات والمصادقة: لعرض واجهة برمجة التطبيقات وتفعيلها في مشروعك على Google Cloud، عليك اجتياز عملية الإضافة إلى القائمة المسموح بها. يجب المصادقة على جميع طلبات واجهة برمجة التطبيقات.

الحصول على الإذن بالوصول

للحصول على إذن بعرض واجهة برمجة التطبيقات وتفعيلها في Google Cloud Console، يجب تسجيل حسابك.

  1. يجب أن يتوفّر رقم تعريف عميل Google Workspace. إذا لم تكن هذه الميزة متاحة، قد تحتاج إلى إعداد حساب على Google Workspace بالإضافة إلى أي حسابات على Google تريد استخدامها للاتصال بواجهة برمجة التطبيقات.
  2. يمكنك إعداد حساب على Google Cloud Console باستخدام عنوان بريد إلكتروني مرتبط بحساب Google Workspace.
  3. إنشاء مشروع جديد
  4. أنشئ حساب خدمة للمصادقة على واجهة برمجة التطبيقات. بعد إنشاء حساب الخدمة، سيتوفّر لك عنصران:
    • معرّف حساب الخدمة
    • ملف JSON يحتوي على مفتاح حساب الخدمة احرص على الحفاظ على أمان هذا الملف، لأنّك ستحتاج إليه لمصادقة عميلك على واجهة برمجة التطبيقات لاحقًا.
  5. يمكن الآن لحسابات Workspace وحسابات Google المرتبطة بها استخدام واجهات برمجة التطبيقات REST. بعد أن يتم نشر التغيير، سيصلك إشعار بشأن ما إذا كانت واجهة برمجة التطبيقات جاهزة ليتم استدعاؤها من خلال حسابات الخدمة.
  6. اتّبِع هذه الخطوات للاستعداد لإجراء طلب بيانات من واجهة برمجة التطبيقات نيابةً عن مستخدم آخر.

نشر مجموعة مواصلة

لنشر بيانات "اكتشاف الفيديوهات"، أرسِل طلب POST إلى واجهة برمجة التطبيقات publishContinuationCluster باستخدام البنية التالية.

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/profiles/{profile_id}/publishContinuationCluster

المكان:

  • package_name: اسم حزمة موفّر الوسائط
  • accountId: المعرّف الفريد لحساب المستخدم في نظامك. ويجب أن يتطابق مع accountId المستخدَم في المسار على الجهاز.
  • profileId: المعرّف الفريد للملف الشخصي للمستخدم ضمن الحساب في نظامك. يجب أن يتطابق مع profileId المستخدَم في المسار على الجهاز.

عنوان URL للحساب بدون ملف شخصي هو:

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/publishContinuationCluster

يتم تمثيل الحمولة في الطلب في الحقل entities. يمثّل entities قائمة بكيانات المحتوى التي يمكن أن تكون MovieEntity أو TVEpisodeEntity. هذا الحقل إلزامي.

نص الطلب

الحقل

النوع

مطلوبة

الوصف

الكيانات

قائمة بكائنات MediaEntity

نعم

قائمة بكيانات المحتوى (5 كحد أقصى)، سيتم الاحتفاظ بأول خمسة فقط وسيتم تجاهل الباقي.يُسمح بالقائمة الفارغة للإشارة إلى أنّ المستخدم انتهى من مشاهدة جميع الكيانات.

يحتوي الحقل entities على movieEntity وtvEpisodeEntity فرديين.

الحقل

النوع

مطلوبة

الوصف

movieEntity

MovieEntity

نعم

كائن يمثّل فيلمًا ضمن ContinuationCluster.

tvEpisodeEntity

TvEpisodeEntity

نعم

كائن يمثّل حلقة تلفزيونية ضمن ContinuationCluster

يجب أن يكون كل كائن في مصفوفة الكيانات أحد أنواع MediaEntity المتاحة، أي MovieEntity وTvEpisodeEntity، بالإضافة إلى الحقول الشائعة والحقول الخاصة بالنوع.

يعرض مقتطف الرمز التالي حمولة نص الطلب لواجهة برمجة التطبيقات publishContinuationCluster.

{
  "entities": [
    {
      "movieEntity": {
        "watch_next_type": "WATCH_NEXT_TYPE_CONTINUE",
        "name": "Movie1",
        "platform_specific_playback_uris": [
          "https://www.example.com/entity_uri_for_android",
          "https://www.example.com/entity_uri_for_iOS"
        ],
        "poster_images": [
          "http://www.example.com/movie1_img1.png",
          "http://www.example.com/movie1_imag2.png"
        ],
        "last_engagement_time_millis": 864600000,
        "duration_millis": 5400000,
        "last_play_back_position_time_millis": 3241111
      }
    },
    {
      "tvEpisodeEntity": {
        "watch_next_type": "WATCH_NEXT_TYPE_CONTINUE",
        "name": "TV SERIES EPISODE 1",
        "platform_specific_playback_uris": [
          "https://www.example.com/entity_uri_for_android",
          "https://www.example.com/entity_uri_for_iOS"
        ],
        "poster_images": [
          "http://www.example.com/episode1_img1.png",
          "http://www.example.com/episode1_imag2.png"
        ],
        "last_engagement_time_millis": 864600000,
        "duration_millis": 1800000,
        "last_play_back_position_time_millis": 2141231,
        "episode_display_number": "1",
        "season_number": "1",
        "show_title": "title"
      }
    }
  ]
}

حذف بيانات "الفيديوهات المقترَحة"

استخدِم واجهة برمجة التطبيقات clearClusters لإزالة بيانات "الفيديوهات أثناء التصفّح".

استخدِم عنوان URL الخاص بطلبات POST لإزالة الكيانات من بيانات العثور على الفيديوهات. لحذف بيانات مجموعة استمرار المحادثة، أرسِل طلب POST إلى واجهة برمجة التطبيقات clearClusters باستخدام البنية التالية.

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/profiles/{profile_id}/clearClusters

المكان:

  • package_name: اسم حزمة موفّر الوسائط
  • accountId: المعرّف الفريد لحساب المستخدم في نظامك. ويجب أن يتطابق مع accountId المستخدَم في المسار على الجهاز.
  • profileId: المعرّف الفريد للملف الشخصي للمستخدم ضمن الحساب في نظامك. يجب أن يتطابق مع profileId المستخدَم في المسار على الجهاز.

لا تحتوي حمولة واجهة برمجة التطبيقات clearClusters إلا على حقل واحد، وهو reason، الذي يتضمّن DeleteReason يحدّد سبب إزالة البيانات.

{
  "reason": "DELETE_REASON_LOSS_OF_CONSENT"
}

الاختبار

بعد نشر البيانات بنجاح، استخدِم حسابًا تجريبيًا للمستخدمين للتأكّد من أنّ المحتوى المتوقّع يظهر في صف "متابعة المشاهدة" على مساحات عرض Google المستهدَفة، مثل Google TV وتطبيقات Google TV للأجهزة الجوّالة على Android وiOS.

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

تنزيل

قبل تنزيل التطبيق، عليك الموافقة على الأحكام والشروط التالية.

الأحكام والشروط

هذه هي اتفاقية ترخيص "حزمة تطوير برامج Android".

1. المقدّمة

1.1 يتم ترخيص "حزمة تطوير برامج Android" (المشار إليها في اتفاقية الترخيص باسم "SDK" وعلى وجه التحديد ملفات نظام Android وواجهات برمجة التطبيقات المجمّعة وإضافات Google APIs) بموجب بنود اتفاقية الترخيص. تشكِّل "اتفاقية الترخيص" عقدًا ملزمًا قانونًا بينك وبين Google في ما يتعلّق باستخدامك لحزمة تطوير البرامج (SDK). 1.2 يشير "Android" إلى حزمة برامج Android للأجهزة، وفقًا لما هو متاح ضمن مشروع Android Open Source Project، المتاح على عنوان URL التالي: https://source.android.com/، وفقًا لما يتم تحديثه من حين لآخر. 1.3 يعني "التنفيذ المتوافق" أي جهاز Android (1) يتوافق مع مستند "تعريف التوافق مع Android"، الذي يمكن العثور عليه على موقع التوافق مع Android (https://source.android.com/compatibility) والذي يمكن تحديثه من حين لآخر، و (2) يجتاز بنجاح مجموعة اختبار التوافق مع Android (CTS). 1.4 تشير "Google" إلى شركة Google LLC، المنظّمة بموجب قوانين ولاية ديلاوير في الولايات المتحدة الأمريكية، وتعمل بموجب قوانين الولايات المتحدة الأمريكية ويقع مقرّها الرئيسي في 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA.

2. قبول اتفاقية الترخيص هذه

2.1 لاستخدام حزمة SDK، يجب عليك أولاً الموافقة على اتفاقية الترخيص. ولا يجوز لك استخدام حزمة تطوير البرامج (SDK) في حال عدم قبول اتفاقية الترخيص. 2.2 يعني النقر لقبول و/أو استخدام حزمة تطوير البرامج (SDK) هذه أنك توافق بموجب هذه الاتفاقية على بنود اتفاقية الترخيص. 2.3 لا يجوز لك استخدام حزمة تطوير البرامج (SDK) ولا يجوز لك قبول اتفاقية الترخيص إذا كنت شخصًا محظورًا من استلام حزمة تطوير البرامج (SDK) بموجب قوانين الولايات المتحدة أو البلدان الأخرى، بما في ذلك البلد الذي تقيم فيه أو الذي تستخدم الحزمة منه. 2.4 إذا كنت توافق على الالتزام باتفاقية الترخيص بالنيابة عن صاحب العمل الذي تعمل لديه أو كيان آخر، فإنك تقر وتضمن أن لديك كامل السلطة القانونية لإلزام صاحب العمل أو الكيان باتفاقية الترخيص. وإذا لم يكن لديك التفويض اللازم، لا يجوز لك قبول "اتفاقية الترخيص" أو استخدام حزمة تطوير البرامج (SDK) نيابةً عن صاحب العمل أو الكيان الآخر.

3. ترخيص حزمة تطوير البرامج (SDK) من Google

3.1 بموجب بنود اتفاقية الترخيص، تمنحك Google ترخيصًا محدودًا وعالميًا وغير خاضع لحقوق الملكية وغير قابل للتنازل عنه وغير حصري وغير قابل للترخيص من الباطن لاستخدام حزمة SDK فقط لتطوير تطبيقات متوافقة مع تطبيقات Android. 3.2 لا يجوز لك استخدام حزمة تطوير البرامج (SDK) هذه لتطوير تطبيقات لأنظمة أساسية أخرى (بما في ذلك عمليات التنفيذ غير المتوافقة لنظام التشغيل Android) أو لتطوير حزمة تطوير برامج (SDK) أخرى. يمكنك بالطبع تطوير تطبيقات لأنظمة أساسية أخرى، بما في ذلك عمليات التنفيذ غير المتوافقة لنظام التشغيل Android، بشرط عدم استخدام حزمة تطوير البرامج (SDK) هذه لهذا الغرض. 3.3 أنت توافق على أنّ Google أو الجهات الخارجية تمتلك كل الحقوق القانونية والملكية والمصلحة في حزمة تطوير البرامج (SDK)، بما في ذلك أي حقوق ملكية فكرية تتضمّنها حزمة تطوير البرامج (SDK). وتعني "حقوق الملكية الفكرية" أي حقوق بموجب قانون براءات الاختراع وقانون حقوق الطبع والنشر وقانون سر المهنة وقانون العلامة التجارية وأي حقوق ملكية أخرى. تحتفظ Google بجميع الحقوق غير الممنوحة لك صراحةً. 3.4 لا يجوز لك استخدام حزمة تطوير البرامج (SDK) لأي غرض غير مسموح به صراحةً في اتفاقية الترخيص. باستثناء الحدّ الذي تقتضيه التراخيص السارية التابعة لجهات خارجية، لا يجوز لك نسخ حزمة تطوير البرامج (SDK) أو أي جزء منها أو تكييفها أو إعادة توزيعها أو تفكيكها أو هندسة عكسية أو تفكيكها أو إنشاء أعمال اشتقاقية منها (إلا لأغراض الاحتفاظ بنسخة احتياطية). 3.5 يخضع استخدام وإعادة إنتاج وتوزيع مكونات حزمة تطوير البرامج (SDK) المرخَّصة بموجب ترخيص البرامج المفتوحة المصدر فقط لبنود ترخيص البرنامج مفتوح المصدر هذا وليس لاتفاقية الترخيص. 3.6 أنت توافق على أنه قد يتغير شكل وطبيعة حزمة SDK التي تقدمها Google بدون إشعار مسبق لك، وأن الإصدارات المستقبلية من حزمة SDK قد لا تتوافق مع التطبيقات التي تم تطويرها في الإصدارات السابقة من SDK. وأنت توافق على أنه يجوز لشركة Google التوقف (بشكل دائم أو مؤقت) عن توفير حزمة SDK (أو أي ميزات ضمن حزمة SDK) لك أو للمستخدمين عمومًا وفقًا لتقدير Google وحدها، وبدون إشعار مسبق. 3.7 لا يرد في اتفاقية الترخيص ما يمنحك الحق في استخدام أي من أسماء Google التجارية أو علاماتها التجارية أو علامات الخدمة أو الشعارات أو أسماء النطاقات أو غيرها من ميزات العلامات التجارية الفريدة. 3.8 أنت توافق على أنك لن تزيل أي إشعارات حقوق ملكية أو تحجبها أو تغيِّرها (بما في ذلك إشعارات حقوق الطبع والنشر والعلامات التجارية) التي قد تكون ملحقة بحزمة SDK أو مضمّنة فيها.

4. استخدامك لحزمة SDK

4.1 توافق Google على أنها لا تملك أي حق أو حق ملكية أو مصلحة منك (أو من الجهات المرخِّصة) بموجب اتفاقية الترخيص في أي من تطبيقات البرامج التي تطوِّرها باستخدام SDK، بما في ذلك أي حقوق ملكية فكرية تتعلق بهذه التطبيقات. 4.2 أنت توافق على استخدام حزمة تطوير البرامج (SDK) وكتابة التطبيقات فقط لأغراض تسمح بها (أ) اتفاقية الترخيص و(ب) أي قانون سارٍ أو لائحة تنظيمية أو ممارسات أو إرشادات مقبولة بوجه عام في نطاقات السلطة ذات الصلة (بما في ذلك أي قوانين تتعلق بتصدير البيانات أو البرامج إلى ومن الولايات المتحدة أو غيرها من البلدان ذات الصلة). 4.3 أنت توافق على أنه في حالة استخدام SDK لتطوير تطبيقات لعامة المستخدمين، فإنك تلتزم بحماية الخصوصية والحقوق القانونية لهؤلاء المستخدمين. فإذا قام المستخدمون بتقديم أسماء المستخدمين أو كلمات المرور أو معلومات تسجيل الدخول الأخرى أو معلومات شخصية، فيجب توعية هؤلاء المستخدمين بأن المعلومات ستكون متاحة للتطبيق الخاص بك، كما يجب إمدادهم بإشعار خصوصية ملائم من الناحية القانونية وكذلك توفير الحماية لأولئك المستخدمين. إذا خزن تطبيقك معلومات شخصية أو حساسة قدمها المستخدمون، فيجب أن يتم ذلك بشكل آمن. وفي حال تقديم المستخدم لتطبيقك معلومات حساب Google، لا يجوز لتطبيقك استخدام تلك المعلومات للوصول إلى حساب المستخدم على Google إلا عندما يمنحك المستخدم إذنًا لإجراء ذلك وللأغراض المحدودة التي يمنحك المستخدم إذنًا بذلك. 4.4 أنت توافق على عدم المشاركة في أي نشاط لحزمة تطوير البرامج (SDK)، بما في ذلك تطوير أو توزيع تطبيق، يؤدي إلى التداخل مع أي من الأطراف أو الشبكات أو الخدمات التابعة لمشغّل شبكة الجوّال أو تعطلها أو تلفها أو الوصول إليها بطريقة غير مصرَّح بها أو تابعة لمشغّل شبكة الجوّال، وذلك لأي غرض آخر غير مصرّح به. 4.5 أنت توافق على أنك المسؤول الوحيد (وأن Google لا تتحمل أي مسؤولية تجاهك أو تجاه أي طرف ثالث) عن أي بيانات أو محتوى أو موارد تنشئها أو تنقلها أو تعرضها من خلال Android و/أو تطبيقات Android، وعن العواقب الناجمة عن أفعالك (بما في ذلك أي خسائر أو أضرار قد تلحق بشركة Google) عند القيام بذلك. 4.6 توافق على أنك المسؤول الوحيد عن أي خسارة أو أي طرف ثالث بموجب هذا الترخيص (وأن Google لا تتحمل أي مسؤولية تجاه أي طرف ثالث أو بموجب هذا الترخيص) أو تجاه

5. بيانات اعتماد مُطوّر البرامج

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

‫6. الخصوصية والمعلومات

6.1 في إطار سعينا المستمر للابتكار وتحسين حزمة SDK، يجوز لشركة Google جمع إحصاءات استخدام معيّنة من البرنامج، على سبيل المثال لا الحصر، المعرّف الفريد وعنوان IP المرتبط ورقم إصدار البرنامج ومعلومات عن الأدوات و/أو الخدمات التي يجري استخدامها في حزمة تطوير البرامج (SDK) وكيفية استخدامها. وقبل أن يتم جمع أيٍّ من هذه المعلومات، سترسل إليك حزمة تطوير البرامج (SDK) إشعارًا بذلك وتطلب موافقتك. في حال تعليق موافقتك، لن يتم جمع المعلومات. 6.2 يتم فحص البيانات التي يتم جمعها بشكل مجمل لتحسين حزمة تطوير البرامج (SDK) ويتم الاحتفاظ بها وفقًا لسياسة خصوصية Google المتوفّرة على عنوان URL التالي: https://policies.google.com/privacy 6.3 قد تتم مشاركة مجموعات البيانات المجمَّعة ومجهولة الهوية مع شركاء Google لتحسين حزمة تطوير البرامج (SDK).

7. التطبيقات التابعة لجهات خارجية

7.1 إذا استخدمت حزمة SDK لتشغيل تطبيقات طورتها جهة خارجية أو تطبيقات يمكنها الوصول إلى بيانات أو محتوى أو موارد توفرها جهة خارجية، فأنت توافق على أن Google لا تتحمل مسؤولية هذه التطبيقات أو البيانات أو المحتوى أو الموارد. أنت تدرك أن جميع البيانات أو المحتوى أو الموارد التي يمكنك الوصول إليها من خلال هذه التطبيقات التابعة لجهات خارجية تكون مسؤولية الشخص الذي أنشأ منها هذه التطبيقات فقط، وأن Google غير مسؤولة عن أي خسارة أو ضرر قد يحدث نتيجة استخدام أو دخول أي من هذه التطبيقات أو البيانات أو المحتوى أو الموارد التابعة لجهات خارجية. 7.2 ينبغي أن تعرف أنّ البيانات والمحتوى والموارد المقدَّمة إليك من خلال تطبيق تابع لجهة خارجية قد تكون محمية بموجب حقوق الملكية الفكرية التي يملكها مقدّمو الخدمات (أو يملكها أشخاص آخرون أو شركات أخرى نيابةً عنهم). ولا يجوز لك تعديل أو استئجار أو تأجير أو إقراض أو بيع أو توزيع أو إنشاء أعمال اشتقاقية استنادًا إلى هذه البيانات أو المحتوى أو الموارد (سواء بشكل كلي أو جزئي) ما لم يمنحك المالكون المعنيون الإذن تحديدًا لإجراء ذلك. 7.3 أنت تقر بأن استخدامك للتطبيقات أو البيانات أو المحتوى أو الموارد التابعة لطرف ثالث قد يخضع لبنود منفصلة بينك وبين الطرف الثالث ذي الصلة. وفي هذه الحالة، لا تؤثر اتفاقية الترخيص في علاقتك القانونية بهذه الأطراف الثالثة.

8. استخدام واجهات برمجة تطبيقات Android

8.1 واجهات برمجة التطبيقات لبيانات Google 8.1.1 إذا كنت تستخدم أي واجهة برمجة تطبيقات لاسترداد البيانات من Google، أنت تقرّ بأنّ البيانات قد تكون محمية بموجب حقوق الملكية الفكرية التي تملكها Google أو تلك الأطراف التي توفّر البيانات (أو يملكها أشخاص آخرون أو شركات أخرى نيابةً عنها). وقد يخضع استخدامك لأي من واجهات برمجة التطبيقات هذه لبنود خدمة إضافية. ولا يجوز لك تعديل أو استئجار أو تأجير أو إقراض أو بيع أو توزيع أو إنشاء أعمال اشتقاقية استنادًا إلى هذه البيانات (سواء بشكل كلي أو جزئي) ما لم تسمح بنود الخدمة ذات الصلة بذلك. 8.1.2 إذا كنت تستخدم أي واجهة برمجة تطبيقات لاسترداد بيانات المستخدم من Google، تقرّ وتوافق على أنّك لن تسترد البيانات إلا بموافقة صريحة من المستخدم، وذلك فقط عندما يمنحك المستخدم إذنًا لإجراء ذلك وللأغراض المحدودة. وفي حال استخدام واجهة برمجة تطبيقات Android Recognition Service API، والموثَّقة على عنوان URL التالي: https://developer.android.com/reference/android/speech/learningService من Google في الوقت التالي الذي يتم فيه تعديل بيانات "معالجة البيانات" من "وقت المعالجة" إلى "مدة المعالجة"، يشير النقر على زر القبول إلى موافقتك على أحكام "ملحق معالجة البيانات" للمنتجات التي تكون "Google" فيها جهة معالجة بيانات.

9. إنهاء اتفاقية الترخيص هذه

9.1 تظل اتفاقية الترخيص سارية إلى أن تنهي أنت أو Google العمل بها كما هو موضح أدناه. 9.2 إذا أردت إنهاء اتفاقية الترخيص، يمكنك إجراء ذلك من خلال إيقاف استخدام حزمة تطوير البرامج (SDK) وأي بيانات اعتماد ذات صلة بالمطوّرين. 9.3 يجوز لشركة Google في أي وقت إنهاء اتفاقية الترخيص معك في أي وقت: (أ) خرقت أي بند من بنود اتفاقية الترخيص أو (ب) مطالبة Google بإجراء ذلك بموجب القانون أو (ج) إنهاء الشريك الذي وفرت لك Google أجزاءً معينةً من حزمة SDK (مثل واجهات برمجة التطبيقات) من خلالها علاقته مع Google أو توقفك عن تقديم أجزاء معينة من حزمة SDK لك، أو (د) إذا قررت Google أن تستخدم، أو لم تعد Google، في الخدمة المحددة لحزمة SDK، أو لم تعد Google توفّر لك في أي من هذه الخدمات، أو في أحد هذه الخدمات، 9.4 عند انتهاء اتفاقية الترخيص، فإن جميع الحقوق القانونية والالتزامات والمسؤوليات التي استفدت منها أنت وGoogle أو التي استفدت منها أو (أو التي استُحقت بمرور الوقت أثناء تنفيذ اتفاقية الترخيص) أو التي تم التعبير عن استمرارها إلى أجل غير مسمى، لا يتأثر بها هذا التوقف، ولا تزال الأحكام الواردة في الفقرة 14.7 سارية على هذه الحقوق والالتزامات والمسؤوليات إلى أجل غير مسمى.

‫10. إخلاء المسؤولية عن الضمانات

10.1 أنت تدرك وتوافق صراحةً على أنّ استخدامك لحزمة SDK يقع على عاتقك وحدك وأنّه يتم توفير حزمة SDK "كما هي" و "حسبما هو متاح" بدون أي ضمانات من أي نوع من Google. 10.2 يقع استخدامك لحزمة SDK وأي مواد يتم تنزيلها أو الحصول عليها بطريقة أخرى من خلال استخدام حزمة SDK على مسؤوليتك الشخصية وتتحمّل مسؤوليتها وحدك عن أي ضرر يحدث لجهاز أو جهاز آخر. 10.3 تُخلي Google أخرى مسؤوليتها صراحةً عن جميع الضمانات والشروط من أي نوع، سواء كانت صريحة أو ضمنية، بما في ذلك على سبيل المثال لا الحصر، الضمانات والشروط الضمنية الخاصة بمطابقة الأوصاف والصلاحية لغرض معيّن وغير ذلك.

11. تحديد المسؤولية

11.1 أنت تدرك وتوافق صراحةً على أنّ

12. التعويض

12.1 إلى أقصى حد يسمح به القانون، توافق على الدفاع عن Google والشركاء التابعين لها ومديريها ومسؤوليها وموظفيها ووكلائها وتعويضهم والمحافظة على ذلك من أي ضرر أو جميع

13. التغييرات التي يتم إجراؤها على اتفاقية الترخيص

13.1 يجوز لشركة Google إجراء تغييرات على اتفاقية الترخيص أثناء توزيعها للإصدارات الجديدة من حزمة تطوير البرامج (SDK). عند إجراء هذه التغييرات، ستوفّر Google نسخة جديدة من اتفاقية الترخيص على الموقع الإلكتروني الذي تتوفّر فيه حزمة تطوير البرامج (SDK). 14.1 تشكّل اتفاقية الترخيص مجمل الاتفاقية القانونية المبرمة بينك وبين Google، كما أنها تحكم استخدامك لحزمة SDK (باستثناء أي خدمات قد توفرها لك Google بموجب اتفاقية كتابية مستقلة)، وتحل تمامًا محل أي اتفاقيات سابقة مبرمة بينك وبين Google في ما يتعلق بحزمة SDK. 14.2 أنت توافق على أنه في حالة عدم ممارسة Google أو تنفيذها لأي حقوق أو تعويضات قانونية واردة في اتفاقية الترخيص (أو تلك التي تستفيد منها Google بموجب أي قانون سارٍ)، لن يُعد ذلك تنازلاً رسميًا عن حقوق Google، بل ستظل هذه الحقوق أو التعويضات متاحة لها. 14.3 إذا قضت أي محكمة قضائية، مختصة بالبت في هذه المسألة، حكمًا يقضي بعدم صلاحية أي بند في اتفاقية الترخيص، فيتم حذف هذا الحكم من اتفاقية الترخيص بدون أن يؤثر ذلك في بقية اتفاقية الترخيص. وتظل بقية بنود اتفاقية الترخيص صالحة وواجبة النفاذ. 14.4 تقر أنت وتوافق على أن كل عضو ضمن مجموعة الشركات التي تعد Google الشركة الأم لها سيكون ضمن الأطراف الخارجية المستفيدة من اتفاقية الترخيص وأن هذه الشركات الأخرى تكون مخولة لفرض أي أحكام في اتفاقية الترخيص والاعتماد عليها بشكل مباشر، والتي تعود بالفائدة عليها (أو تمنحها حقوقًا لصالحها). وبخلاف ذلك، لا يتم اعتبار أي شخص آخر أو شركة أخرى أطرافًا خارجية في اتفاقية الترخيص. 14.5 قيود التصدير: تخضع حزمة تطوير البرامج (SDK) لقوانين ولوائح التصدير في الولايات المتحدة. عليك الالتزام بجميع قوانين ولوائح التصدير المحلية والدولية التي تسري على حزمة تطوير البرامج (SDK). تشمل هذه القوانين قيودًا على الوجهات والمستخدمين النهائيين والاستخدام النهائي. 14.6 لا يجوز لك أو لشركة Google التنازل عن الحقوق الممنوحة في اتفاقية الترخيص أو نقلها بدون موافقة كتابية مسبقة من الطرف الآخر. لا يجوز لك أو لشركة Google تفويض المسؤوليات أو الالتزامات بموجب اتفاقية الترخيص بدون موافقة كتابية مسبقة من الطرف الآخر. 14.7 تخضع اتفاقية الترخيص، وعلاقتك مع Google بموجب اتفاقية الترخيص، إلى قوانين ولاية كاليفورنيا بغض النظر عن تعارض نصوص القوانين. توافق أنت وشركة Google على الالتجاء إلى المحاكم ذات نطاق السلطة القضائي الحصري والواقعة في مقاطعة سانتا كلارا بولاية كاليفورنيا لفض أي نزاع قانوني قد ينشأ عن اتفاقية الترخيص. وبالرغم من ذلك، فإنك توافق على أنه لا يزال مسموحًا لشركة Google بالمطالبة بتعويضات زجرية (أو ما يقابلها من تعويض قانوني عاجل) في أي نطاق سلطة. 27 تموز (يوليو) 2021
.
تنزيل

verify_app_multiplatform_public_20250602.apk