Engage SDK Listen:第三方技术集成说明

Google 正在构建一个设备上的界面,该界面按垂直方向组织用户的应用,并为个性化应用内容使用和发现提供新的沉浸式体验。此全屏体验为开发者合作伙伴提供了一个机会,让他们能够在应用之外的专用频道中展示其最佳的丰富内容。

本指南包含开发者合作伙伴使用 Engage SDK 集成其音频内容以填充此新界面区域和现有 Google 界面的说明。

集成详情

术语

此集成包括以下三种集群类型:**推荐**、**续播**和**精选**。

  • **推荐**集群显示来自单个开发者合作伙伴的个性化内容阅读建议。

    您的推荐采用以下结构

    • **推荐集群:**包含来自同一开发者合作伙伴的一组推荐的 UI 视图。

      图 1. 娱乐空间 UI 显示来自单个合作伙伴的推荐集群。
    • **实体:**表示集群中单个项目的对象。实体可以是播放列表、有声读物、播客等等。有关支持的实体类型的列表,请参阅提供实体数据部分。

      图 2. 娱乐空间 UI 显示单个合作伙伴的推荐集群中的单个实体。
  • **续播**集群显示来自多个开发者合作伙伴的用户最近参与的音频内容,这些内容在一个 UI 分组中。每个开发者合作伙伴最多允许在续播集群中广播 10 个实体。

    图 3. 娱乐空间 UI 显示一个续播集群,其中包含来自多个合作伙伴的未完成推荐(目前仅可见一个推荐)。
  • **精选**集群在一个 UI 分组中展示来自多个开发者合作伙伴的选择项目。将有一个精选集群,它将在 UI 顶部附近显示,优先于所有推荐集群。每个开发者合作伙伴最多允许在精选集群中广播 10 个实体。

    图 4. 娱乐空间 UI 显示一个精选集群,其中包含来自多个合作伙伴的推荐(目前仅可见一个推荐)。

预工作

最低 API 级别:19

com.google.android.engage:engage-core库添加到您的应用中

dependencies {
    // Make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.engage:engage-core:1.5.2'
}

总结

该设计基于绑定服务的实现。

客户端可以发布的数据受以下不同集群类型的限制:

集群类型 集群限制 集群中实体的最大限制
推荐集群 最多 5 个 最多 50 个
续播集群 最多 1 个 最多 10 个
精选集群 最多 1 个 最多 10 个

步骤 1:提供实体数据

SDK 已定义不同的实体来表示每种项目类型。我们支持以下 Listen 类别的实体:

  1. MusicAlbumEntity
  2. MusicArtistEntity
  3. MusicTrackEntity
  4. MusicVideoEntity
  5. PlaylistEntity
  6. PodcastSeriesEntity
  7. PodcastEpisodeEntity
  8. LiveRadioStationEntity
  9. AudiobookEntity

下表概述了每种类型的可用属性和要求。

MusicAlbumEntity

MusicAlbumEntity对象表示音乐专辑(例如,泰勒·斯威夫特的《午夜》)。

属性 要求 注释
名称 必需 音乐专辑的标题。
海报图片 必需 必须提供至少一张图片。有关指南,请参阅图片规格
信息页面 uri 必需

音乐专辑详细信息的提供程序应用的深层链接。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

艺术家 必需 音乐专辑中的艺术家列表。
播放 uri 可选

在提供程序应用中开始播放专辑的深层链接。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

描述

可选 如果提供,必须在 200 个字符以内。
歌曲数量 可选 音乐专辑中歌曲的数量。
流派 可选 音乐专辑中流派的列表。
专辑格式 可选

专辑(包括 LP 和双 LP)

EP

单曲

混音带

音乐厂牌 可选 与专辑相关的音乐厂牌列表。
设备上已下载 可选 布尔值,指示音乐专辑是否已下载到设备上。
显式内容 可选

布尔值,指示内容是否为显式内容

包含显式内容或带有家长指导警告的项目应设置为 TRUE。显式内容将显示“E”标签。

发行日期 可选 专辑的发行日期,以毫秒为单位的 Unix 时间戳表示。
时长 可选 专辑的时长,以毫秒为单位。
上次互动时间 可选

建议用于延续聚类中的项目。可用于排序。

以毫秒为单位的 Unix 时间戳表示

进度百分比 可选

建议用于延续聚类中的项目。

0 到 100 之间的整数

MusicArtistEntity

The MusicArtistEntity 对象表示一位音乐艺术家(例如,Adele)。

属性 要求 注释
名称 必需 音乐艺术家的名称。
海报图片 必需 必须提供至少一张图片。有关指南,请参阅图片规格
信息页面 uri 必需

指向提供程序应用的深层链接,用于获取有关音乐艺术家的详细信息。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

播放 uri 可选

指向提供程序应用的深层链接,用于在提供程序应用中开始播放该艺术家的歌曲。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

描述

可选 如果提供,必须在 200 个字符以内。
上次互动时间 可选

建议用于延续聚类中的项目。可用于排序。

以毫秒为单位的 Unix 时间戳表示

MusicTrackEntity

The MusicTrackEntity 对象表示一首音乐曲目(例如,Coldplay 的《Yellow》)。

属性 要求 注释
名称 必需 音乐曲目的标题。
海报图片 必需 必须提供至少一张图片。有关指南,请参阅图片规格
播放 uri 必需

指向提供程序应用的深层链接,用于在提供程序应用中开始播放该音乐曲目。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

信息页面 uri 可选

指向提供程序应用的深层链接,用于获取有关音乐曲目的详细信息。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

描述

可选 如果提供,必须在 200 个字符以内。
时长 可选 曲目的时长,以毫秒为单位。
专辑 可选 歌曲所属专辑的名称。
艺术家 必需 音乐曲目的艺术家列表。
设备上已下载 可选 布尔值,指示音乐曲目是否已下载到设备上。
显式内容 可选

布尔值,指示内容是否为显式内容

包含显式内容或带有家长指导警告的项目应设置为 TRUE。显式内容将显示“E”标签。

上次互动时间 可选

建议用于延续聚类中的项目。可用于排序。

以毫秒为单位的 Unix 时间戳表示

进度百分比 可选

建议用于延续聚类中的项目。

0 到 100 之间的整数

MusicVideoEntity

The MusicVideoEntity 对象表示一个音乐视频(例如,《The Weeknd - Take My Breath (Official Music Video)》)。

属性 要求 注释
名称 必需 音乐视频的标题。
海报图片 必需 必须提供至少一张图片。有关指南,请参阅图片规格
播放 uri 必需

指向提供程序应用的深层链接,用于在提供程序应用中开始播放该音乐视频。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

信息页面 uri 可选

指向提供程序应用的深层链接,用于获取有关音乐视频的详细信息。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

时长 可选 视频的时长,以毫秒为单位。
观看次数 可选 视频的观看次数,以自由文本格式表示。
艺术家 可选 音乐视频的艺术家列表。
内容分级 可选 曲目的内容分级列表。
描述

可选 如果提供,必须在 200 个字符以内。
设备上已下载 可选 布尔值,指示音乐视频是否已下载到设备上。
显式内容 可选

布尔值,指示内容是否为显式内容

包含显式内容或带有家长指导警告的项目应设置为 TRUE。显式内容将显示“E”标签。

上次互动时间 可选

建议用于延续聚类中的项目。可用于排序。

以毫秒为单位的 Unix 时间戳表示

进度百分比 可选

建议用于延续聚类中的项目。

0 到 100 之间的整数

PlaylistEntity

The PlaylistEntity 对象表示一个音乐播放列表(例如,美国热门 10 首播放列表)。

属性 要求 注释
名称 必需 播放列表的标题。
海报图片 必需 必须提供至少一张图片。有关指南,请参阅图片规格
播放 uri 必需

指向提供程序应用的深层链接,用于在提供程序应用中开始播放该音乐播放列表。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

信息页面 uri 可选

指向提供程序应用的深层链接,用于获取有关音乐播放列表的详细信息。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

时长 可选 播放列表的时长,以毫秒为单位。
歌曲数量 可选 音乐播放列表中歌曲的数量。
描述

可选 如果提供,必须在 200 个字符以内。
设备上已下载 可选 布尔值,指示播放列表是否已下载到设备上。
显式内容 可选

布尔值,指示内容是否为显式内容

包含显式内容或带有家长指导警告的项目应设置为 TRUE。显式内容将显示“E”标签。

上次互动时间 可选

建议用于延续聚类中的项目。可用于排序。

以毫秒为单位的 Unix 时间戳表示

进度百分比 可选

建议用于延续聚类中的项目。

0 到 100 之间的整数

PodcastSeriesEntity

The PodcastSeriesEntity 对象表示一个播客系列(例如,《This American Life》)。

属性 要求 注释
名称 必需 播客系列的标题。
海报图片 必需 必须提供至少一张图片。有关指南,请参阅图片规格
信息页面 uri 必需

指向提供程序应用的深层链接,用于获取有关播客系列的详细信息。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

播放 uri 可选

指向提供程序应用的深层链接,用于在提供程序应用中开始播放该播客系列。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

剧集数量 可选 播客系列中剧集的数量。
制作名称 可选 播客系列的制作名称。
主持人 可选 播客系列的主持人列表。
流派 可选 播客系列的流派列表。
设备上已下载 可选 布尔值,指示播客是否已下载到设备上。
描述

可选 如果提供,必须在 200 个字符以内。
显式内容 可选

布尔值,指示内容是否为显式内容

包含显式内容或带有家长指导警告的项目应设置为 TRUE。显式内容将显示“E”标签。

上次互动时间 可选

建议用于延续聚类中的项目。可用于排序。

以毫秒为单位的 Unix 时间戳表示

PodcastEpisodeEntity

The PodcastEpisodeEntity 对象表示一个播客剧集(例如,《Spark Bird,第 754 集:This American Life》)。

属性 要求 注释
名称 必需 播客剧集的标题。
海报图片 必需 必须提供至少一张图片。有关指南,请参阅图片规格
播放 uri 必需

指向提供程序应用的深层链接,用于在提供程序应用中开始播放该播客剧集。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

制作系列标题 必需 剧集所属播客系列的名称。
时长 必需 播客剧集的时长,以毫秒为单位。
发布日期 必需 播客的发布日期(以毫秒为单位的 Unix 时间戳表示)
信息页面 uri 可选

指向提供程序应用的深层链接,用于获取有关播客剧集的详细信息。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

制作名称 可选 播客系列的制作名称。
剧集索引 可选 剧集在系列中的索引(第一个索引为 1)。
主持人 可选 播客剧集的主持人列表。
流派 可选 播客剧集的流派列表。
设备上已下载 可选 布尔值,指示播客剧集是否已下载到设备上。
描述

可选 如果提供,必须在 200 个字符以内。
视频播客 可选 布尔值,指示播客剧集是否包含视频内容
显式内容 可选

布尔值,指示内容是否为显式内容

包含显式内容或带有家长指导警告的项目应设置为 TRUE。显式内容将显示“E”标签。

下一个收听类型 可选

建议用于延续聚类中的项目

TYPE_CONTINUE - 继续未完成的音频项目。

TYPE_NEXT - 继续系列中的下一个项目。

TYPE_NEW - 新发布的。

上次互动时间 可选

建议用于延续聚类中的项目。可用于排序。

以毫秒为单位的 Unix 时间戳表示

进度百分比 可选

建议用于延续聚类中的项目。

0 到 100 之间的整数

LiveRadioStationEntity

The LiveRadioStationEntity 对象表示一个直播电台(例如,98.1 The Breeze)。

属性 要求 注释
名称 必需 直播电台的标题。
海报图片 必需 必须提供至少一张图片。有关指南,请参阅图片规格
播放 uri 必需

指向提供程序应用的深层链接,用于在提供程序应用中开始播放该电台。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

信息页面 uri 可选

指向提供程序应用的深层链接,用于获取有关电台的详细信息。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

频率 可选 电台广播的频率(例如,“98.1 FM”)。
节目标题 可选 电台当前正在播放的节目。
主持人 可选 电台主持人的列表。
描述

可选 如果提供,必须在 200 个字符以内。
上次互动时间 可选

建议用于延续聚类中的项目。可用于排序。

以毫秒为单位的 Unix 时间戳表示

AudiobookEntity

The AudiobookEntity 对象表示一本有声书(例如,米歇尔·奥巴马的《Becoming》的有声书)。

属性 要求 注释
名称 必需
海报图片 必需 必须提供至少一张图片。有关指南,请参阅图片规格
作者 必需 必须提供至少一个作者姓名。
旁白 必需 必须提供至少一个旁白者的姓名。
操作链接 URI 必需

指向提供程序应用的深层链接,用于访问有声书。

注意:您可以使用深层链接进行归因。 请参阅此常见问题解答

发布日期 可选 如果提供,则以毫秒为单位的 Unix 时间戳表示。
描述

可选 如果提供,必须在 200 个字符以内。
价格 可选 自由文本
时长 可选 如果提供,必须为正值。
流派 可选 与书籍相关的流派列表。
系列名称 可选 有声书所属系列的名称(例如,《哈利·波特》)。
系列单元索引 可选 有声书在系列中的索引,其中 1 是系列中的第一本有声书。例如,如果《哈利·波特与阿兹卡班的囚徒》是系列中的第三本书,则应将其设置为 3。
继续阅读书籍类型 可选

TYPE_CONTINUE - 继续未完成的书籍。

TYPE_NEXT - 继续系列中的下一个项目。

TYPE_NEW - 新发布的。

上次互动时间 条件性必需

当项目位于延续聚类中时,必须提供。

以毫秒为单位的 Unix 时间戳表示。

进度百分比 条件性必需

当项目位于延续聚类中时,必须提供。

*新*获取的有声书可以是继续阅读聚类的一部分。

值必须大于 0 且小于 100。

DisplayTimeWindow - 设置内容在界面上显示的时间窗口
开始时间戳 可选

内容应在界面上显示的 Unix 时间戳。

如果未设置,则内容有资格在界面上显示。

以毫秒为单位的 Unix 时间戳表示。

结束时间戳 可选

内容不再在界面上显示的 Unix 时间戳。

如果未设置,则内容有资格在界面上显示。

以毫秒为单位的 Unix 时间戳表示。

图像规格

下面列出了图像资源的必需规格

纵横比 要求 最小像素 推荐像素
正方形 (1x1) 必需 300x300 1200x1200
横向 (1.91x1) 可选 600x314 1200x628
纵向 (4x5) 可选 480x600 960x1200

文件格式

PNG、JPG、静态 GIF、WebP

最大文件大小

5120 KB

其他建议

  • 图像安全区域:将重要内容放在图像中心的 80%。

示例

MusicAlbumEntity musicAlbumEntity =
        new MusicAlbumEntity.Builder()
            .setName(NAME)
             .addPosterImage(new Image.Builder()
                  .setImageUri(Uri.parse("http://www.x.com/image.png"))
                  .setImageHeightInPixel(960)
                  .setImageWidthInPixel(408)
                  .build())
            .setPlayBackUri("https://play.google/album/play")
            .setInfoPageUri("https://play.google/album/info")
            .setDescription("A description of this album.")
            .addArtist("Artist")
            .addGenre("Genre")
            .addMusicLabel("Label")
            .addContentRating("Rating")
            .setSongsCount(960)
            .setReleaseDateEpochMillis(1633032895L)
            .setDurationMillis(1633L)
            .build();
AudiobookEntity audiobookEntity =
        new AudiobookEntity.Builder()
            .setName("Becoming")
            .addPosterImage(new Image.Builder()
                 .setImageUri(Uri.parse("http://www.x.com/image.png"))
                 .setImageHeightInPixel(960)
                 .setImageWidthInPixel(408)
                  .build())
            .addAuthor("Michelle Obama")
            .addNarrator("Michelle Obama")
            .setActionLinkUri(
               Uri.parse("https://play.google/audiobooks/1"))
            .setDurationMillis(16335L)
            .setPublishDateEpochMillis(1633032895L)
            .setDescription("An intimate, powerful, and inspiring memoir")
            .setPrice("$16.95")
            .addGenre("biography")
            .build();

步骤 2:提供聚类数据

建议在后台执行内容发布作业(例如,使用 WorkManager)并定期或基于事件进行调度(例如,每次用户打开应用程序时或用户刚刚将某些内容添加到购物车时)。

AppEngagePublishClient 负责发布聚类。客户端中提供了以下 API

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

isServiceAvailable

此 API 用于检查服务是否可用于集成以及内容是否可以在设备上呈现。

Kotlin

client.isServiceAvailable.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // Handle IPC call success
        if(task.result) {
          // Service is available on the device, proceed with content
          // publish calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
}

Java

client.isServiceAvailable().addOnCompleteListener(task - > {
    if (task.isSuccessful()) {
        // Handle success
        if(task.getResult()) {
          // Service is available on the device, proceed with content publish
          // calls.
        } else {
          // Service is not available, no further action is needed.
        }
    } else {
      // The IPC call itself fails, proceed with error handling logic here,
      // such as retry.
    }
});

publishRecommendationClusters

此 API 用于发布 RecommendationCluster 对象列表。

Kotlin

client.publishRecommendationClusters(
            PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Trending music")
                        .build())
                .build())

Java

client.publishRecommendationClusters(
            new PublishRecommendationClustersRequest.Builder()
                .addRecommendationCluster(
                    new RecommendationCluster.Builder()
                        .addEntity(entity1)
                        .addEntity(entity2)
                        .setTitle("Trending music")
                        .build())
                .build());

当服务收到请求时,以下操作将在一个事务中进行

  • 删除来自开发合作伙伴的现有 RecommendationCluster 数据。
  • 解析请求中的数据并将其存储在更新的推荐聚类中。

如果发生错误,则整个请求将被拒绝,并且保持现有状态。

publishFeaturedCluster

此 API 用于发布 FeaturedCluster 对象列表。

Kotlin

client.publishFeaturedCluster(
            PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    FeaturedCluster.Builder()
                        ...
                        .build())
                .build())

Java

client.publishFeaturedCluster(
            new PublishFeaturedClusterRequest.Builder()
                .setFeaturedCluster(
                    new FeaturedCluster.Builder()
                        ...
                        .build())
                .build());

当服务收到请求时,以下操作将在一个事务中进行

  • 删除来自开发合作伙伴的现有 FeaturedCluster 数据。
  • 解析请求中的数据并将其存储在更新的精选聚类中。

如果发生错误,则整个请求将被拒绝,并且保持现有状态。

publishContinuationCluster

此 API 用于发布 ContinuationCluster 对象。

Kotlin

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

Java

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

当服务收到请求时,以下操作将在一个事务中进行

  • 删除来自开发合作伙伴的现有 ContinuationCluster 数据。
  • 解析请求中的数据并将其存储在更新的延续聚类中。

如果发生错误,则整个请求将被拒绝,并且保持现有状态。

publishUserAccountManagementRequest

此 API 用于发布登录卡片。登录操作会将用户引导至应用程序的登录页面,以便应用程序可以发布内容(或提供更个性化的内容)

以下元数据是登录卡片的一部分 -

属性 要求 描述

操作 URI 必需 指向操作的深层链接(即导航到应用程序登录页面)
图像 可选 - 如果未提供,则必须提供标题

卡片上显示的图像

16x9 纵横比的图像,分辨率为 1264x712

标题 可选 - 如果未提供,则必须提供图像 卡片上的标题
操作文本 可选 在 CTA 上显示的文本(即登录)
副标题 可选 卡片上的可选副标题

Kotlin

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

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

Java

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

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

当服务收到请求时,以下操作将在一个事务中进行

  • 删除来自开发合作伙伴的现有 UserAccountManagementCluster 数据。
  • 解析请求中的数据并将其存储在更新的用户帐户管理聚类中。

如果发生错误,则整个请求将被拒绝,并且保持现有状态。

updatePublishStatus

如果出于任何内部业务原因,未发布任何聚类,我们强烈建议使用updatePublishStatus API 更新发布状态。这很重要,因为

  • 在所有场景下提供状态,即使内容已发布 (STATUS == PUBLISHED),对于填充使用此显式状态传达集成健康状况和其他指标的仪表盘至关重要。
  • 如果没有内容发布但集成状态未中断 (STATUS == NOT_PUBLISHED),Google 可以在应用程序健康状况仪表盘中避免触发警报。它确认由于提供商的角度来看**预期**的情况导致内容未发布。
  • 它有助于开发人员深入了解数据何时发布以及何时未发布。
  • Google 可能会使用状态代码提示用户在应用中执行某些操作,以便他们查看应用内容或克服问题。

合格的发布状态代码列表为

// Content is published
AppEngagePublishStatusCode.PUBLISHED,

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

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

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

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

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

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

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

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

如果内容未发布是由于用户未登录,Google 建议发布登录卡片。如果由于任何原因提供商无法发布登录卡片,我们建议使用状态代码**NOT_PUBLISHED_REQUIRES_SIGN_IN**调用**updatePublishStatus** API。

Kotlin

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

Java

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

deleteRecommendationClusters

此 API 用于删除推荐集群的内容。

Kotlin

client.deleteRecommendationClusters()

Java

client.deleteRecommendationClusters();

当服务收到请求时,它会从推荐集群中删除现有数据。如果发生错误,则整个请求将被拒绝,并保持现有状态。

deleteFeaturedCluster

此 API 用于删除特色集群的内容。

Kotlin

client.deleteFeaturedCluster()

Java

client.deleteFeaturedCluster();

当服务收到请求时,它会从特色集群中删除现有数据。如果发生错误,则整个请求将被拒绝,并保持现有状态。

deleteContinuationCluster

此 API 用于删除延续集群的内容。

Kotlin

client.deleteContinuationCluster()

Java

client.deleteContinuationCluster();

当服务收到请求时,它会从延续集群中删除现有数据。如果发生错误,则整个请求将被拒绝,并保持现有状态。

deleteUserManagementCluster

此 API 用于删除用户账户管理集群的内容。

Kotlin

client.deleteUserManagementCluster()

Java

client.deleteUserManagementCluster();

当服务收到请求时,它会从用户账户管理集群中删除现有数据。如果发生错误,则整个请求将被拒绝,并保持现有状态。

deleteClusters

此 API 用于删除给定集群类型的内容。

Kotlin

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

Java

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

当服务收到请求时,它会从与指定集群类型匹配的所有集群中删除现有数据。客户端可以选择传递一个或多个集群类型。如果发生错误,则整个请求将被拒绝,并保持现有状态。

错误处理

强烈建议监听发布 API 的任务结果,以便可以采取后续操作来恢复并重新提交成功的任务。

client.publishRecommendationClusters(
              new PublishRecommendationClustersRequest.Builder()
                  .addRecommendationCluster(...)
                  .build())
          .addOnCompleteListener(
              task -> {
                if (task.isSuccessful()) {
                  // do something
                } else {
                  Exception exception = task.getException();
                  if (exception instanceof AppEngageException) {
                    @AppEngageErrorCode
                    int errorCode = ((AppEngageException) exception).getErrorCode();
                    if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
                      // do something
                    }
                  }
                }
              });

错误作为包含原因作为错误代码的AppEngageException返回。

错误代码 错误名称 注意
1 SERVICE_NOT_FOUND 给定设备上该服务不可用。
2 SERVICE_NOT_AVAILABLE 该服务在给定设备上可用,但在调用时不可用(例如,它被明确禁用)。
3 SERVICE_CALL_EXECUTION_FAILURE 由于线程问题导致任务执行失败。在这种情况下,可以重试。
4 SERVICE_CALL_PERMISSION_DENIED 调用者无权进行服务调用。
5 SERVICE_CALL_INVALID_ARGUMENT 请求包含无效数据(例如,超过允许的集群数量)。
6 SERVICE_CALL_INTERNAL 服务端出现错误。
7 SERVICE_CALL_RESOURCE_EXHAUSTED 服务调用过于频繁。

步骤 3:处理广播意图

除了通过作业进行发布内容 API 调用之外,还需要设置一个BroadcastReceiver来接收内容发布请求。

广播意图的主要目标是应用重新激活和强制数据同步。广播意图并非设计为非常频繁地发送。仅当 Engage 服务确定内容可能已过时(例如,一周前)时才会触发它。这样,即使应用程序长时间未执行,用户也可以更有把握获得新鲜的内容体验。

必须通过以下两种方式设置BroadcastReceiver

  • 使用Context.registerReceiver()动态注册BroadcastReceiver类的实例。这使得来自仍在内存中存活的应用程序的通信成为可能。
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));

}
  • AndroidManifest.xml文件中使用<receiver>标签静态声明一个实现。这允许应用程序在未运行时接收广播意图,并且还允许应用程序发布内容。
<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 开发人员集成工作流程

常见问题解答

有关常见问题解答,请参阅Engage SDK 常见问题解答

联系方式

在集成过程中如有任何疑问,请联系[email protected]。我们的团队会尽快回复。

后续步骤

完成此集成后,您的后续步骤如下

  • 发送电子邮件至[email protected],并附上您已准备好在 Google 进行测试的集成 APK。
  • Google 将在内部执行验证和审查,以确保集成按预期工作。如果需要更改,Google 将与您联系,提供任何必要的详细信息。
  • 测试完成后且无需更改时,Google 将与您联系,通知您可以开始将更新的集成 APK 发布到 Play 商店。
  • Google 确认您已将更新的 APK 发布到 Play 商店后,您的**推荐**、**特色**和**延续**集群将发布并对用户可见。