使用 Engage SDK 与 Google TV 分享应用使用权

本指南包含相关说明,介绍了开发者如何使用 Engage SDK 与 Google TV 分享应用订阅和授权数据。用户可以找到自己有权访问的内容,并让 Google TV 直接在电视、移动设备和平板电脑上的 Google TV 体验中,向用户提供高度相关的内容推荐。

前提条件

您必须先完成媒体操作 Feed 的初始配置,然后才能使用设备授权 API。如果您尚未完成媒体操作 Feed 新手入门流程,请完成该流程。

准备工作

在开始之前,请完成以下步骤 验证您的应用是否以 API 级别 19 或更高级别为目标平台,以便进行此集成

  1. 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
      }
    
  2. AndroidManifest.xml 文件中将 Engage 服务环境设置为生产环境。

    适用于移动版 APK

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

    适用于电视的 APK

    
    <meta-data
        android:name="com.google.android.engage.service.ENV"
        android:value="PRODUCTION">
    </meta-data>
    
  3. 在将 APK 发送给 Google 之前,请在 AndroidManifest.xml 文件中将互动服务环境设置为生产环境。 为获得最佳性能和未来兼容性,请仅在应用位于前台且用户正积极与其互动时(例如应用启动、登录后或使用期间)发布数据。不建议从后台进程发布。

  4. 在以下事件发生时发布订阅信息:

    1. 用户登录您的应用。
    2. 用户在个人资料之间切换(如果支持个人资料)。
    3. 用户购买新订阅。
    4. 用户升级现有订阅。
    5. 用户订阅到期。

集成

本部分提供了必要的代码示例和说明,以帮助您实现 AccountProfileSubscriptionEntity 来管理各种订阅类型。

用户账号和个人资料

如需在 Google TV 上启用个性化功能,请提供账号信息。使用 AccountProfile 提供:

  1. 账号 ID:表示用户账号的唯一标识符。 可以是实际的账号 ID,也可以是经过适当混淆的版本。
// Set the account ID to which the subscription applies.
// Don't set the profile ID because subscription applies to account level.
val accountProfile = AccountProfile.Builder()
  .setAccountId("user_account_id")
  .setProfileId("user_profile id")
  .build();

普通层级订阅

对于媒体提供商服务的订阅级别较低的用户(例如,仅提供一个订阅层级且可访问所有付费内容的服务),请提供以下基本详细信息:

  1. 订阅类型:明确指明用户所用的具体订阅方案。

    1. SUBSCRIPTION_TYPE_ACTIVE:用户拥有有效的付费订阅。
    2. SUBSCRIPTION_TYPE_ACTIVE_TRIAL:用户拥有试用订阅。
    3. SUBSCRIPTION_TYPE_INACTIVE:用户有账号,但没有有效的订阅或试用。
  2. 过期时间:可选时间,以毫秒为单位。指定订阅的过期时间。

  3. 提供方软件包名称:指定处理订阅的应用的软件包名称。

示例:示例媒体提供商 Feed。

"actionAccessibilityRequirement": [
  {
    "@type": "ActionAccessSpecification",
    "category": "subscription",
    "availabilityStarts": "2022-06-01T07:00:00Z",
    "availabilityEnds": "2026-05-31T07:00:00Z",
    "requiresSubscription": {
    "@type": "MediaSubscription",
    // Don't match this string,
    // ID is only used to for reconciliation purpose
    "@id": "https://www.example.com/971bfc78-d13a-4419",
    // Don't match this, as name is only used for displaying purpose
    "name": "Basic common name",
    "commonTier": true
  }

以下示例为用户创建了一个 SubscriptionEntity

val subscription = SubscriptionEntity
  .Builder()
  setSubscriptionType(
    SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE
  )
  .setProviderPackageName("com.google.android.example")
  // Optional
  // December 30, 2025 12:00:00AM in milliseconds since epoch
  .setExpirationTimeMillis(1767052800000)
  .build();

Premium 订阅

如果应用提供多层级的付费订阅套餐(包含超出普通层级的扩展内容或功能),请通过向 Subscription 添加一项或多项授权来表示这一点。

相应授权包含以下字段:

  1. 标识符:相应授权所需的标识符字符串。此值必须与发布到 Google TV 的媒体提供商 Feed 中提供的某个使用权标识符(请注意,这不是 ID 字段)相匹配。
  2. 名称:此为辅助信息,用于进行授权匹配。 虽然是可选的,但提供能让人看懂的授权名称有助于开发者和支持团队更好地了解用户授权。 例如:Sling Orange。
  3. ExpirationTimeMillis:可以选择性地指定相应使用权的过期时间(以毫秒为单位),如果该时间与订阅过期时间不同,则必须指定。 默认情况下,订阅到期后,相应授权也会失效。

对于以下示例媒体提供商 Feed 代码段:

"actionAccessibilityRequirement": [
  {
    "@type": "ActionAccessSpecification",
    "category": "subscription",
    "availabilityStarts": "2022-06-01T07:00:00Z",
    "availabilityEnds": "2026-05-31T07:00:00Z",
    "requiresSubscription": {
    "@type": "MediaSubscription",
    // Don't match this string,
    // ID is only used to for reconciliation purpose
    "@id": "https://www.example.com/971bfc78-d13a-4419",

    // Don't match this, as name is only used for displaying purpose
    "name": "Example entitlement name",
    "commonTier": false,
    // match this identifier in your API. This is the crucial
    // entitlement identifier used for recommendation purpose.
    "identifier": "example.com:entitlementString1"
  }

以下示例为订阅用户创建了 SubscriptionEntity

// Subscription with entitlements.
// The entitlement expires at the same time as its subscription.
val subscription = SubscriptionEntity
  .Builder()
  .setSubscriptionType(
    SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE
  )
  .setProviderPackageName("com.google.android.example")
  // Optional
  // December 30, 2025 12:00:00AM in milliseconds
  .setExpirationTimeMillis(1767052800000)
  .addEntitlement(
    SubscriptionEntitlement.Builder()
    // matches with the identifier in media provider feed
    .setEntitlementId("example.com:entitlementString1")
    .setDisplayName("entitlement name1")
    .build()
  )
  .build();
// Subscription with entitlements
// The entitement has different expiration time from its subscription
val subscription = SubscriptionEntity
  .Builder()
  .setSubscriptionType(
    SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE
  )
  .setProviderPackageName("com.google.android.example")
  // Optional
  // December 30, 2025 12:00:00AM in milliseconds
  .setExpirationTimeMillis(1767052800000)
  .addEntitlement(
    SubscriptionEntitlement.Builder()
    .setEntitlementId("example.com:entitlementString1")
    .setDisplayName("entitlement name1")
    // You may set the expiration time for entitlement
    // December 15, 2025 10:00:00 AM in milliseconds
    .setExpirationTimeMillis(1765792800000)
    .build())
  .build();

关联服务套餐的订阅

虽然订阅通常属于原始应用的媒体提供方,但您可以在订阅中指定关联的服务软件包名称,从而将订阅归因于关联的服务软件包。

以下代码示例演示了如何创建用户订阅。

// Subscription for linked service package
val subscription = SubscriptionEntity
  .Builder()
  .setSubscriptionType(
    SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE
  )
  .setProviderPackageName("com.google.android.example")
  // Optional
  // December 30, 2025 12:00:00AM in milliseconds since epoch
  .setExpirationTimeMillis(1767052800000)
  .build();

此外,如果用户还订阅了某项附属服务,请添加另一项订阅,并相应地设置关联的服务软件包名称。

// Subscription for linked service package
val linkedSubscription = Subscription
  .Builder()
  .setSubscriptionType(
    SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE
  )
  .setProviderPackageName("linked service package name")
  // Optional
  // December 30, 2025 12:00:00AM in milliseconds since epoch
  .setExpirationTimeMillis(1767052800000)
  .addBundledSubscription(
    BundledSubscription.Builder()
      .setBundledSubscriptionProviderPackageName(
        "bundled-subscription-package-name"
      )
      .setSubscriptionType(SubscriptionType.SUBSCRIPTION_TYPE_ACTIVE)
      .setExpirationTimeMillis(111)
      .addEntitlement(
        SubscriptionEntitlement.Builder()
        .setExpirationTimeMillis(111)
        .setDisplayName("Silver subscription")
        .setEntitlementId("subscription.tier.platinum")
        .build()
      )
      .build()
  )
    .build();

您也可以选择向关联的服务订阅添加授权。

提供订阅集

在应用位于前台时运行内容发布作业。

使用 AppEngagePublishClient 类中的 publishSubscriptionCluster() 方法来发布 SubscriptionCluster 对象。

使用 isServiceAvailable 检查服务是否可供集成。

client.publishSubscription(
  PublishSubscriptionRequest.Builder()
    .setAccountProfile(accountProfile)
    .setSubscription(subscription)
    .build();
  )

使用 setSubscription() 验证用户是否只能订阅一次相应服务。

使用 addLinkedSubscription()addLinkedSubscriptions()(接受关联订阅的列表),以允许用户拥有零个或多个关联订阅。

当服务收到请求时,系统会创建一个新条目,并在 60 天后自动删除旧条目。系统始终使用最新的条目。 如果发生错误,系统将拒绝整个请求,并保留现有状态。

让订阅保持最新状态

  1. 为了在发生更改时立即提供更新,每当用户的订阅状态发生变化(例如激活、停用、升级、降级)时,请调用 publishSubscriptionCluster()
  2. 为了定期验证以确保准确性,请至少每月调用一次 publishSubscriptionCluster()

  3. 如需在标准 60 天保留期限之前删除视频发现数据,请使用 client.deleteClusters() 方法手动从 Google TV 服务器中删除用户的数据。此方法会删除账号个人资料或整个账号的所有现有视频发现数据,具体取决于给定的 DeleteReason

    用于移除用户订阅的代码段

      // If the user logs out from your media app, you must make the following call
      // to remove subscription and other video discovery data from the current
      // google TV device.
      client.deleteClusters(
        new DeleteClustersRequest.Builder()
          .setAccountProfile(
            AccountProfile
              .Builder()
              .setAccountId()
              .setProfileId()
              .build()
          )
        .setReason(DeleteReason.DELETE_REASON_USER_LOG_OUT)
        .build()
        )
      ```
    Following code snippet demonstrates removal of user subscription
    when user revokes the consent.
    
    ```Kotlin
      // If the user revokes the consent to share across device, make the call
      // to remove subscription and other video discovery data from all google
      // TV devices.
      client.deleteClusters(
        new DeleteClustersRequest.Builder()
          .setAccountProfile(
            AccountProfile
            .Builder()
            .setAccountId()
            .setProfileId()
            .build()
          )
          .setReason(DeleteReason.DELETE_REASON_LOSS_OF_CONSENT)
          .build()
      )
      ```
    
    Following code demonstrates how to remove subscription data on user profile
    deletion.
    
    ```Kotlin
    // If the user delete a specific profile, you must make the following call
    // to remove subscription data and other video discovery data.
    client.deleteClusters(
      new DeleteClustersRequest.Builder()
      .setAccountProfile(
        AccountProfile
        .Builder()
        .setAccountId()
        .setProfileId()
        .build()
      )
      .setReason(DeleteReason.DELETE_REASON_ACCOUNT_PROFILE_DELETION)
      .build()
    )
    

测试

本部分提供有关测试订阅实现的分步指南。在发布之前,请验证数据准确性和功能是否正常。

发布集成核对清单

  1. 发布应在应用处于前台且用户正积极与其互动时进行。

  2. 发布时间:

    • 用户首次登录。
    • 用户更改了个人资料(如果支持个人资料)。
    • 用户购买了新订阅。
    • 用户升级订阅。
    • 用户订阅到期。
  3. 在 logcat 中检查应用是否在发布事件时正确调用了 isServiceAvailable()publishClusters() API。

  4. 验证数据是否显示在验证应用中。 验证应用应将订阅显示为单独的行。调用发布 API 时,数据应显示在验证应用中。

    • 验证应用的 Android 清单文件中的 Engage Service Flag 是否设置为生产环境。
    • 安装并打开 Engage Verification 应用。
    • 如果验证应用中的 isServiceAvailable 值为 false,请点击验证应用中的 Toggle 按钮,将其设置为 true
    • 输入应用的软件包名称。系统会自动显示已发布的数据。
  5. 前往应用并执行以下各项操作:

    • 登录。
    • 在个人资料之间切换(如果支持)。
    • 购买新订阅。
    • 升级现有订阅。
    • 使订阅过期。

验证集成

如需测试集成,请使用验证应用

验证应用是一款 Android 应用,开发者可以使用它来验证集成能否正常运行。此应用包含用于帮助开发者验证数据和广播 intent 的 capability。这有助于在发布前验证数据准确性和功能是否正常。

  1. 针对每个事件,检查应用是否已调用 publishSubscription API。在验证应用中验证已发布的数据。 验证应用中的所有内容是否均为绿色
  2. 如果所有实体的信息都正确,则所有实体都会显示“一切正常”绿色对勾标记。

    验证应用成功屏幕截图
    图 1. 成功订阅
  3. 验证应用中也会突出显示问题

    验证应用错误屏幕截图
    图 2.订阅失败
  4. 如需查看捆绑式订阅中的问题,请使用电视遥控器将焦点对准该特定捆绑式订阅,然后点击以查看问题。您可能需要先将焦点移至相应行,然后向右移动才能找到“捆绑式订阅”卡片。问题会突出显示为红色,如图 3 所示。此外,使用遥控器向下移动,查看套装订阅中授权存在的问题

    验证应用错误详情屏幕截图
    图 3. 订阅错误
  5. 如需查看相应授权中的问题,请使用电视遥控器将焦点对准该特定授权,然后点击以查看问题。问题会以红色突出显示。

    验证应用错误屏幕截图
    图 4. 订阅错误详情

下载

您必须先接受以下条款及条件才能下载。

条款及条件

以下是 Android 软件开发套件许可协议

1. 简介

1.1 Google 会按照本许可协议的条款向您授予使用 Android 软件开发套件(在本许可协议中称为“SDK”,具体包括 Android 系统文件、一些已打包好的 API 和一些 Google API 插件)的许可。本许可协议是您和 Google 之间就您使用 SDK 而达成的具有法律约束力的合约。 1.2“Android”是指通过 Android 开源项目(项目网址为:https://source.android.com/)提供的用于设备的 Android 软件堆栈(会不时更新)。1.3“兼容实现”是指满足以下条件的任何 Android 设备:(i) 符合 Android 兼容性定义文档(位于 Android 兼容性网站 https://source.android.com/compatibility 上,会不时更新)的要求;(ii) 成功通过 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,则您无法使用 SDK,也无法接受本许可协议。 2.4 如果您代表您的雇主或其他实体同意受本许可协议约束,则您声明并保证您拥有充足的法定权力来让您的雇主或上述实体受本许可协议的约束。如果您不具备必要的授权,则不得代表您的雇主或其他实体接受本许可协议或使用 SDK。

3. Google 授予的 SDK 许可

3.1 Google 依据本许可协议的条款授予您有限的、全球性、免版税、不可转让、非独占性且不可再许可的 SDK 使用许可,其用途仅限针对 Android 的兼容实现来开发应用。 3.2 您不得使用此 SDK 来开发适用于其他平台(包括 Android 的非兼容实现)的应用或开发其他 SDK。您当然可以随意开发用于其他平台(包括 Android 的非兼容实现)的应用,但不能将此 SDK 用于该目的。 3.3 您同意 Google 或第三方拥有此 SDK 的所有法定权利、所有权和利益,包括此 SDK 中存在的所有知识产权。“知识产权”是指专利法、版权法、商业秘密法、商标法以及任何和所有其他所有权法案中现行规定的任何及所有权利。Google 保留未明确授予您的所有权利。 3.4 您不得将 SDK 用于本许可协议未明确允许的任何用途。除非适用的第三方许可有相关要求,您不得对 SDK 或 SDK 的任何部分进行复制(备份用途除外)、修改、改编、再分发、反编译、逆向工程、反汇编或创建其衍生作品。 3.5 对于依据开源软件许可授权的 SDK 组件,其使用、复制和分发仅受该开源软件许可条款的制约,不受本许可协议的约束。 3.6 您同意 Google 所提供的 SDK 可在未事先通知您的情况下出现形式和性质上的改变,并且未来的 SDK 版本可以不兼容在较早的 SDK 版本上开发的应用。您同意,一般情况下,Google 可在不事先通知您的情况下自行决定(永久或暂时)停止向您或更多用户提供 SDK(或 SDK 内的任何功能)。 3.7 本许可协议中的任何内容均未授权您使用 Google 的任何商品名、商标、服务商标、徽标、域名或其他显著品牌特征。 3.8 对于 SDK 中可能附带或包含的任何所有权声明(包括版权和商标通告),您同意不会移除、模糊处理或更改这些声明。

4. 您对 SDK 的使用

4.1 Google 同意,对于您使用 SDK 开发的任何软件应用,Google 不能以本许可协议为由从您(或您的许可方)处获取这些应用的权利、所有权或利益,包括这些应用中存在的任何知识产权。 4.2 您同意,只在 (a) 本许可协议和 (b) 相关司法辖区内的任何适用法律法规或公认的惯例或准则(包括任何与从美国或其他相关国家/地区进口或向其出口数据或软件相关的法律)允许的情况下使用 SDK 以及编写应用。 4.3 您同意,如果您使用 SDK 开发面向一般公众用户的应用,您将会保护这些用户的隐私权和合法权利。如果用户向您提供用户名、密码或其他登录信息或个人信息,您必须确保用户知晓这些信息将供您的应用使用,并且您必须为这些用户提供足以满足法律要求的隐私权声明和保护。如果您的应用存储了用户提供的个人信息或敏感信息,则必须安全存储这类信息。如果用户为您的应用提供了 Google 账号信息,您的应用只能在用户允许时出于用户所许可的有限目的使用该信息访问用户的 Google 账号。 4.4 您同意您不会利用 SDK 从事任何干扰、破坏、损坏或以未经授权方式访问任何第三方(包括但不限于 Google 或任何移动通信运营商)的服务器、网络或其他财产或服务的行为(包括应用的开发或分发)。 4.5 您同意,对于您通过 Android 和/或 Android 版应用创建、传输或显示的任何数据、内容或资源,以及由此造成的任何后果(包括 Google 可能会蒙受的任何损失或损害),您要承担全部责任,且 Google 对您或任何第三方不承担任何责任。 4.6 您同意,对于未按本许可协议、任何适用的第三方合同或服务条款或任何适用法律法规的规定履行义务的任何行为以及由此造成的后果(包括 Google 或任何第三方可能会蒙受的损失或损害),您承担全部责任,且 Google 对您或任何第三方均不承担任何责任。

5. 开发者凭据

5.1 您同意负责维护 Google 向您发放或您自行选择的任何开发者凭据的机密性,并且对使用您的开发者凭据开发的所有应用承担全部责任。

6. 隐私权和信息

6.1 为了不断地对 SDK 进行创新和改进,Google 可能会通过软件收集某些使用情况统计信息,包括但不限于唯一标识符、关联的 IP 地址、软件版本号,以及关于 SDK 中正在使用的工具和/或服务以及使用方式的信息。在收集任何上述信息之前,SDK 都会通知您并征求您的同意。未经您同意,Google 不会擅自收集此类信息。6.2 Google 会对收集的数据进行汇总分析,从而改进 SDK,并会按照 Google 隐私权政策(网址为 https://policies.google.com/privacy)维护这些数据。 6.3 为了改进 SDK,我们可能会与 Google 合作伙伴分享经过匿名化和汇总处理的数据集。

7. 第三方应用

7.1 如果您使用 SDK 运行由第三方开发的应用,或者运行会访问由第三方提供的数据、内容或资源的应用,则您须同意 Google 对于此类应用、数据、内容或资源概不负责。您了解,对于您可通过此类第三方应用访问的所有数据、内容或资源,均由最初提供这些内容的人员承担全部责任;对于您因使用或访问任何此类第三方应用、数据、内容或资源而可能蒙受的任何损失或损坏,Google 概不负责。 7.2 您应了解,通过此类第三方应用向您提供的数据、内容和资源可能会受到提供者(或代表他们的其他个人或公司)所拥有的知识产权的保护。除非相关所有者明确给予许可,否则您不得修改、出租、租赁、借出、出售、分发这些数据、内容或资源(全部或部分),也不得以其为基础创建衍生作品。 7.3 您承认,您对此类第三方应用、数据、内容或资源的使用行为可能会受到您与相关第三方之间达成的独立条款的制约。在这种情况下,本许可协议不会影响您与这些第三方之间的法律关系。

8. 使用 Android API

8.1 Google 数据 API 8.1.1 如果您使用任何 API 从 Google 检索数据,即表示您承认这些数据可能会受到 Google 或这些数据的提供方(或者代表他们的其他人员或公司)拥有的知识产权的保护。使用任何此类 API 时,您可能会受到附加服务条款的制约。除非相关服务条款允许,否则您不得修改、出租、租赁、借出、出售、分发这些数据(全部或部分),也不得以其为基础创建衍生作品。 8.1.2 如果您使用任何 API 从 Google 检索用户数据,即表示您承认并同意,您只有在征得用户明确同意时才会检索数据,并且只能在用户允许时出于用户许可的有限目的检索数据。如果您使用 Android Recognition Service API(请参阅以下网址对应的文档:https://developer.android.com/reference/android/speech/RecognitionService,其内容会不时更新),即表示您承认使用此 API 时需遵循针对以 Google 作为数据处理方的产品的数据处理附录(附录网址为 https://privacy.google.com/businesses/gdprprocessorterms/,其内容会不时更新)。点击接受,即表示您特此同意遵循与数据处理方为 Google 的产品相关的数据处理附录的相关条款。

9. 终止本许可协议

9.1 本许可协议将持续有效,直至您或 Google 按以下规定终止本协议。 9.2 如果您想终止本许可协议,可通过停止使用 SDK 以及任何相关开发者凭据予以终止。 9.3 如果出现以下任意情况,Google 可随时终止本许可协议: (A) 您违反了本许可协议的规定;或 (B) 根据法律 Google 必须终止本协议;或 (C) 与 Google 合作向您提供 SDK 的特定部分(例如 API)的合作伙伴终止了与 Google 的合作关系,或者不再向您提供 SDK 的特定部分;或 (D) Google 决定不再向您所居住的国家/地区,或您使用相关服务时所在的国家/地区提供 SDK 或 SDK 的特定部分,或者 Google 单方面判定向您提供 SDK 或特定的 SDK 服务不再具有商业可行性。 9.4 当本许可协议终止时,您与 Google 受益于、受制于(或在本许可协议有效期内随时间累积)或明示将无限期延续的所有法定权利、义务和责任将不受此终止的影响,并且第 14.7 段的规定将继续无限期地适用于上述权利、义务和责任。

10. 免责声明

10.1 您明确了解并同意自行承担使用 SDK 的风险,并且 SDK 是“按原样”和“现状”提供,不由 Google 提供任何类型的保证。 10.2 您对 SDK 的使用以及通过 SDK 下载或以其他方式获得的任何材料的使用均由您自行斟酌并承担相关风险,对于由此给您的设备或计算机系统造成的任何数据损坏,您必须自行承担10.3 Google 另外明确声明,对于任何形式(无论是明示或暗示)的保证和条件,包括但不限于关于适销性、

11. 责任限制

11.1 因任何原因导致 Google、其子公司和关联公司及其许可方因任何原因,

12. 赔偿

12.1 您同意在法律允许的最大范围内,为 Google、其关联公司及其各自的董事、高级职员、员工和代理人出于任何和所有索赔、诉讼、诉讼或程序,以及任何和所有损失、法律责任、损害、

13. 许可协议的变更

13.1 Google 在发布新版 SDK 时可能会对本许可协议进行一些变更。做出这些更改后,Google 将在提供 SDK 的网站上公布新版本的许可协议。 14.1 本许可协议构成您和 Google 之间的完整法律协议,且您对 SDK 的使用(不包括 Google 根据单独书面协议为您提供的任何服务)将受本协议的约束。同时,本协议将完全取代您和 Google 之前就 SDK 达成的任何协议。 14.2 您同意,即使 Google 未行使或强制执行本许可协议中所述的(或 Google 根据任何适用法律所享有的)任何法定权利或补救措施,也不应视为 Google 正式自动放弃这些权利,Google 仍然可以行使这些权利或采取相应补救措施。 14.3 如果对此类事项有司法管辖权的任何法院判定本许可协议的任何规定无效,我们会将相应规定从本许可协议中移除,本协议其余部分不受影响。本许可协议的其余条款将继续有效并可强制执行。 14.4 您承认并同意,Google 的每一个子公司都应为本许可协议的第三方受益人,此类其他公司应有权直接执行本许可协议,并根据本许可协议的规定主张相关权益(或有利于他们的权利)。除此之外,其他任何个人或公司均不得成为本许可协议的第三方受益人。 14.5 出口限制。SDK 会受到美国出口法律和法规的限制。您必须遵守所有适用于 SDK 的国内以及国际出口法律和法规。这些法律包括对目的地、最终用户和最终用途的限制。 14.6 未经另一方的事先书面许可,您或 Google 不得转让或转移本许可协议中授予的权利。未经另一方事先书面批准,您或 Google 均不得将其在本许可协议下的责任或义务委托给他人。 14.7 本许可协议以及您与 Google 依据本许可协议而建立的关系应受美国加利福尼亚州法律(该州的法律冲突条款除外)的约束。您和 Google 同意服从加利福尼亚州圣克拉拉县法院的专有司法辖权,以此来解决因本许可协议产生的任何法律事务。尽管有上述规定,您同意仍允许 Google 在任何管辖区申请禁令救济(或同等类型的紧急法律救济)。 2021 年 7 月 27 日
下载

verify_app_multiplatform_public_20250602.apk