Google 正在构建一个设备上的界面,该界面按垂直领域组织用户的应用,并为个性化应用内容使用和发现提供全新的沉浸式体验。此全屏体验为开发者合作伙伴提供了一个机会,让他们能够在应用外部的专用渠道中展示其最佳的丰富内容。
本指南包含开发者合作伙伴集成其音频内容的说明,使用 Engage SDK 来填充此新界面区域和现有的 Google 界面。
集成详情
术语
此集成包括以下三种集群类型:**推荐**、**继续**和**特色**。
**推荐**集群显示来自单个开发者合作伙伴的内容的个性化建议。
您的推荐采用以下结构
**推荐集群:**包含来自同一开发者合作伙伴的一组推荐的 UI 视图。
**实体:**表示集群中单个项目的对象。实体可以是播放列表、有声读物、播客等。有关支持的实体类型的列表,请参阅提供实体数据部分。
**继续**集群显示来自多个开发者合作伙伴的用户最近参与的音频内容,在一个 UI 分组中。每个开发者合作伙伴将被允许在继续集群中广播最多 10 个实体。
**特色**集群在一个 UI 分组中展示来自多个开发者合作伙伴的一系列项目。将有一个特色集群,它将显示在 UI 的顶部附近,优先于所有推荐集群。每个开发者合作伙伴将被允许在特色集群中广播最多 10 个实体。
准备工作
最低 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 已定义不同的实体来表示每种项目类型。我们支持以下适用于“倾听”类别的实体
音乐专辑实体
音乐艺术家实体
音乐曲目实体
音乐视频实体
播放列表实体
播客系列实体
播客剧集实体
直播电台实体
有声书实体
下表概述了每种类型可用的属性和要求。
音乐专辑实体
该MusicAlbumEntity
对象表示音乐专辑(例如,泰勒·斯威夫特的《午夜》)。
属性 | 要求 | 备注 |
---|---|---|
名称 | 必填 | 音乐专辑的标题。 |
海报图片 | 必填 | 必须提供至少一张图片。有关指导,请参阅图片规格。 |
信息页面uri | 必填 |
指向提供商应用中有关音乐专辑详细信息的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
艺术家 | 必填 | 音乐专辑中艺术家的列表。 |
播放uri | 可选 |
在提供商应用中开始播放专辑的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
描述 | 可选 | 如果提供,必须在 200 个字符以内。 |
歌曲数量 | 可选 | 音乐专辑中的歌曲数量。 |
流派 | 可选 | 音乐专辑中流派的列表。 |
专辑格式 | 可选 |
专辑(包括 LP 和双 LP) EP 单曲 混音带 |
音乐厂牌 | 可选 | 与专辑相关的音乐厂牌列表。 |
已下载到设备 | 可选 | 布尔值,指示音乐专辑是否已下载到设备上。 |
显示敏感内容 | 可选 |
布尔值,指示内容是否为敏感内容 包含敏感材料或带有家长指导警告的项目应设置为 TRUE。显示敏感内容的项目将显示“E”标签。 |
发行日期 | 可选 | 专辑的发行日期,以毫秒为单位的纪元时间戳表示。 |
时长 | 可选 | 专辑的时长,以毫秒为单位。 |
上次互动时间 | 可选 |
建议用于延续集群中的项目。可用于排序。 以毫秒为单位的纪元时间戳表示 |
进度百分比完成 | 可选 |
建议用于延续集群中的项目。 0 到 100 之间的整数 |
音乐艺术家实体
该MusicArtistEntity
对象表示音乐艺术家(例如,阿黛尔)。
属性 | 要求 | 备注 |
---|---|---|
名称 | 必填 | 音乐艺术家的姓名。 |
海报图片 | 必填 | 必须提供至少一张图片。有关指导,请参阅图片规格。 |
信息页面uri | 必填 |
指向提供商应用中有关音乐艺术家的详细信息的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
播放uri | 可选 |
在提供商应用中开始播放艺术家的歌曲的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
描述 | 可选 | 如果提供,必须在 200 个字符以内。 |
上次互动时间 | 可选 |
建议用于延续集群中的项目。可用于排序。 以毫秒为单位的纪元时间戳表示 |
音乐曲目实体
该MusicTrackEntity
对象表示音乐曲目(例如,酷玩乐队的《黄色》)。
属性 | 要求 | 备注 |
---|---|---|
名称 | 必填 | 音乐曲目的标题。 |
海报图片 | 必填 | 必须提供至少一张图片。有关指导,请参阅图片规格。 |
播放uri | 必填 |
在提供商应用中开始播放音乐曲目的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
信息页面uri | 可选 |
指向提供商应用中有关音乐曲目详细信息的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
描述 | 可选 | 如果提供,必须在 200 个字符以内。 |
时长 | 可选 | 曲目的时长,以毫秒为单位。 |
专辑 | 可选 | 歌曲所属专辑的名称。 |
艺术家 | 必填 | 音乐曲目的艺术家列表。 |
已下载到设备 | 可选 | 布尔值,指示音乐曲目是否已下载到设备上。 |
显示敏感内容 | 可选 |
布尔值,指示内容是否为敏感内容 包含敏感材料或带有家长指导警告的项目应设置为 TRUE。显示敏感内容的项目将显示“E”标签。 |
上次互动时间 | 可选 |
建议用于延续集群中的项目。可用于排序。 以毫秒为单位的纪元时间戳表示 |
进度百分比完成 | 可选 |
建议用于延续集群中的项目。 0 到 100 之间的整数 |
音乐视频实体
该MusicVideoEntity
对象表示音乐视频(例如,《周末 - 让我喘息(官方音乐视频)》)。
属性 | 要求 | 备注 |
---|---|---|
名称 | 必填 | 音乐视频的标题。 |
海报图片 | 必填 | 必须提供至少一张图片。有关指导,请参阅图片规格。 |
播放uri | 必填 |
在提供商应用中开始播放音乐视频的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
信息页面uri | 可选 |
指向提供商应用中有关音乐视频详细信息的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
时长 | 可选 | 视频的时长,以毫秒为单位。 |
观看次数 | 可选 | 视频的观看次数,以自由文本格式表示。 |
艺术家 | 可选 | 音乐视频的艺术家列表。 |
内容分级 | 可选 | 曲目的内容分级列表。 |
描述 | 可选 | 如果提供,必须在 200 个字符以内。 |
已下载到设备 | 可选 | 布尔值,指示音乐视频是否已下载到设备上。 |
显示敏感内容 | 可选 |
布尔值,指示内容是否为敏感内容 包含敏感材料或带有家长指导警告的项目应设置为 TRUE。显示敏感内容的项目将显示“E”标签。 |
上次互动时间 | 可选 |
建议用于延续集群中的项目。可用于排序。 以毫秒为单位的纪元时间戳表示 |
进度百分比完成 | 可选 |
建议用于延续集群中的项目。 0 到 100 之间的整数 |
播放列表实体
该PlaylistEntity
对象表示音乐播放列表(例如,美国前 10 名播放列表)。
属性 | 要求 | 备注 |
---|---|---|
名称 | 必填 | 播放列表的标题。 |
海报图片 | 必填 | 必须提供至少一张图片。有关指导,请参阅图片规格。 |
播放uri | 必填 |
在提供商应用中开始播放音乐播放列表的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
信息页面uri | 可选 |
指向提供商应用中有关音乐播放列表详细信息的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
时长 | 可选 | 播放列表的时长,以毫秒为单位。 |
歌曲数量 | 可选 | 音乐播放列表中的歌曲数量。 |
描述 | 可选 | 如果提供,必须在 200 个字符以内。 |
已下载到设备 | 可选 | 布尔值,指示播放列表是否已下载到设备上。 |
显示敏感内容 | 可选 |
布尔值,指示内容是否为敏感内容 包含敏感材料或带有家长指导警告的项目应设置为 TRUE。显示敏感内容的项目将显示“E”标签。 |
上次互动时间 | 可选 |
建议用于延续集群中的项目。可用于排序。 以毫秒为单位的纪元时间戳表示 |
进度百分比完成 | 可选 |
建议用于延续集群中的项目。 0 到 100 之间的整数 |
播客系列实体
该PodcastSeriesEntity
对象表示播客系列(例如,《美国生活》)。
属性 | 要求 | 备注 |
---|---|---|
名称 | 必填 | 播客系列的标题。 |
海报图片 | 必填 | 必须提供至少一张图片。有关指导,请参阅图片规格。 |
信息页面uri | 必填 |
指向提供商应用中有关播客系列详细信息的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
播放uri | 可选 |
在提供商应用中开始播放播客系列的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
剧集数量 | 可选 | 播客系列中的剧集数量。 |
制作名称 | 可选 | 播客系列的制作名称。 |
主持人 | 可选 | 播客系列的主持人列表。 |
流派 | 可选 | 播客系列的流派列表。 |
已下载到设备 | 可选 | 布尔值,指示播客是否已下载到设备上。 |
描述 | 可选 | 如果提供,必须在 200 个字符以内。 |
显示敏感内容 | 可选 |
布尔值,指示内容是否为敏感内容 包含敏感材料或带有家长指导警告的项目应设置为 TRUE。显示敏感内容的项目将显示“E”标签。 |
上次互动时间 | 可选 |
建议用于延续集群中的项目。可用于排序。 以毫秒为单位的纪元时间戳表示 |
播客剧集实体
该PodcastEpisodeEntity
对象表示播客剧集(例如,《火花鸟,第 754 集:美国生活》)。
属性 | 要求 | 备注 |
---|---|---|
名称 | 必填 | 播客剧集的标题。 |
海报图片 | 必填 | 必须提供至少一张图片。有关指导,请参阅图片规格。 |
播放uri | 必填 |
在提供商应用中开始播放播客剧集的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
制作系列标题 | 必填 | 剧集所属播客系列的名称。 |
时长 | 必填 | 播客剧集的时长,以毫秒为单位。 |
发布日期 | 必填 | 播客的发布日期(以毫秒为单位的纪元时间戳表示) |
信息页面uri | 可选 |
指向提供商应用中有关播客剧集详细信息的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
制作名称 | 可选 | 播客系列的制作名称。 |
剧集索引 | 可选 | 剧集在系列中的索引(第一个索引为 1)。 |
主持人 | 可选 | 播客剧集的主持人列表。 |
流派 | 可选 | 播客剧集的流派列表。 |
已下载到设备 | 可选 | 布尔值,指示播客剧集是否已下载到设备上。 |
描述 | 可选 | 如果提供,必须在 200 个字符以内。 |
视频播客 | 可选 | 布尔值,指示播客剧集是否包含视频内容 |
显示敏感内容 | 可选 |
布尔值,指示内容是否为敏感内容 包含敏感材料或带有家长指导警告的项目应设置为 TRUE。显示敏感内容的项目将显示“E”标签。 |
下一个收听类型 | 可选 |
建议用于延续集群中的项目 TYPE_CONTINUE - 恢复未完成的音频项目。 TYPE_NEXT - 继续收听系列中的下一个项目。 TYPE_NEW - 新发布的。 |
上次互动时间 | 可选 |
建议用于延续集群中的项目。可用于排序。 以毫秒为单位的纪元时间戳表示 |
进度百分比完成 | 可选 |
建议用于延续集群中的项目。 0 到 100 之间的整数 |
直播电台实体
该LiveRadioStationEntity
对象表示直播电台(例如,98.1 The Breeze)。
属性 | 要求 | 备注 |
---|---|---|
名称 | 必填 | 直播电台的标题。 |
海报图片 | 必填 | 必须提供至少一张图片。有关指导,请参阅图片规格。 |
播放uri | 必填 |
在提供商应用中开始播放电台的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
信息页面uri | 可选 |
指向提供商应用中有关电台详细信息的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
频率 | 可选 | 电台广播的频率(例如,“98.1 FM”)。 |
节目标题 | 可选 | 当前正在电台播放的节目。 |
主持人 | 可选 | 电台的主持人列表。 |
描述 | 可选 | 如果提供,必须在 200 个字符以内。 |
上次互动时间 | 可选 |
建议用于延续集群中的项目。可用于排序。 以毫秒为单位的纪元时间戳表示 |
有声书实体
该AudiobookEntity
对象表示有声书(例如,米歇尔·奥巴马的《成为》的有声书)。
属性 | 要求 | 备注 |
---|---|---|
名称 | 必填 | |
海报图片 | 必填 | 必须提供至少一张图片。有关指导,请参阅图片规格。 |
作者 | 必填 | 必须提供至少一个作者姓名。 |
旁白 | 必填 | 必须提供至少一个旁白姓名。 |
操作链接uri | 必填 |
指向提供商应用中该有声书的深层链接。 注意:您可以使用深层链接进行归因。 请参阅此常见问题解答 |
发布日期 | 可选 | 如果提供,则以毫秒为单位的纪元时间戳表示。 |
描述 | 可选 | 如果提供,必须在 200 个字符以内。 |
价格 | 可选 | 自由文本 |
时长 | 可选 | 如果提供,必须为正值。 |
流派 | 可选 | 与书籍相关的流派列表。 |
系列名称 | 可选 | 有声书所属系列的名称(例如,《哈利·波特》)。 |
系列单元索引 | 可选 | 有声书在系列中的索引,其中 1 是系列中的第一本有声书。例如,如果《哈利·波特与阿兹卡班的囚徒》是该系列中的第三本书,则应将其设置为 3。 |
继续阅读书籍类型 | 可选 |
TYPE_CONTINUE - 恢复未完成的书籍。 TYPE_NEXT - 继续收听系列中的下一个项目。 TYPE_NEW - 新发布的。 |
上次互动时间 | 条件必填 | 当项目位于延续集群中时,必须提供。 以毫秒为单位的纪元时间戳表示。 |
进度百分比完成 | 条件必填 |
当项目位于延续集群中时,必须提供。 *新* 获取的有声书可以成为继续阅读集群的一部分。 值必须大于 0 且小于 100。 |
DisplayTimeWindow - 设置内容在界面上显示的时间窗口 | ||
开始时间戳 | 可选 |
内容应在界面上显示的纪元时间戳。 如果未设置,则内容有资格在界面上显示。 以毫秒为单位的纪元时间戳表示。 |
结束时间戳 | 可选 |
内容不再在界面上显示的纪元时间戳。 如果未设置,则内容有资格在界面上显示。 以毫秒为单位的纪元时间戳表示。 |
图片规格
下面列出了图像资产的必要规格
纵横比 | 要求 | 最小像素 | 推荐像素 |
---|---|---|---|
正方形 (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
数据。 - 请求中的数据被解析并存储在更新后的 Continuation Cluster 中。
如果发生错误,则会拒绝整个请求并保持现有状态。
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
数据将被删除。 - 请求中的数据被解析并存储在更新后的 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 用于删除 Recommendation Clusters 的内容。
Kotlin
client.deleteRecommendationClusters()
Java
client.deleteRecommendationClusters();
当服务收到请求时,它会从 Recommendation Clusters 中删除现有数据。如果发生错误,则整个请求将被拒绝,并保持现有状态。
deleteFeaturedCluster
此 API 用于删除 Featured Cluster 的内容。
Kotlin
client.deleteFeaturedCluster()
Java
client.deleteFeaturedCluster();
当服务收到请求时,它会从 Featured Cluster 中删除现有数据。如果发生错误,则整个请求将被拒绝,并保持现有状态。
deleteContinuationCluster
此 API 用于删除 Continuation Cluster 的内容。
Kotlin
client.deleteContinuationCluster()
Java
client.deleteContinuationCluster();
当服务收到请求时,它会从 Continuation Cluster 中删除现有数据。如果发生错误,则整个请求将被拒绝,并保持现有状态。
deleteUserManagementCluster
此 API 用于删除 UserAccountManagement Cluster 的内容。
Kotlin
client.deleteUserManagementCluster()
Java
client.deleteUserManagementCluster();
当服务收到请求时,它会从 UserAccountManagement Cluster 中删除现有数据。如果发生错误,则整个请求将被拒绝,并保持现有状态。
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
返回。
错误代码 | 注意 |
---|---|
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:处理广播意图
除了通过作业进行发布内容 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 商店后,您的推荐、特色和续集集群将发布并对用户可见。