Engage SDK Listen: инструкции по технической интеграции сторонних разработчиков

Google создает поверхность на устройстве, которая организует приложения пользователей по вертикалям и обеспечивает новый захватывающий опыт для персонализированного потребления и обнаружения контента приложений. Этот полноэкранный режим дает партнерам-разработчикам возможность продемонстрировать свой лучший насыщенный контент на специальном канале за пределами своего приложения.

В этом руководстве содержатся инструкции для партнеров-разработчиков по интеграции их аудиоконтента с помощью Engage SDK для заполнения как этой новой области, так и существующих поверхностей Google.

Детали интеграции

Терминология

Эта интеграция включает следующие три типа кластеров: Рекомендация , Продолжение и Рекомендуемые .

  • Кластеры рекомендаций отображают персонализированные предложения по содержанию для чтения от отдельного партнера-разработчика.

    Ваши рекомендации имеют следующую структуру:

    • Кластер рекомендаций: представление пользовательского интерфейса, содержащее группу рекомендаций от одного и того же партнера-разработчика.

      Рис. 1. Пользовательский интерфейс Entertainment Space, показывающий кластер рекомендаций от одного партнера.
    • Сущность: объект, представляющий один элемент в кластере. Объектом может быть список воспроизведения, аудиокнига, подкаст и т. д. Список поддерживаемых типов объектов см. в разделе «Предоставление данных объекта» .

      Рис. 2. Пользовательский интерфейс Entertainment Space, показывающий одну сущность в кластере рекомендаций одного партнера.
  • Кластер «Продолжение» показывает аудиоконтент, недавно использованный пользователями от нескольких партнеров-разработчиков, в одной группе пользовательского интерфейса. Каждому партнеру-разработчику будет разрешено транслировать максимум 10 сущностей в кластере продолжения.

    Рисунок 3. Пользовательский интерфейс Entertainment Space, показывающий кластер продолжения с незаконченными рекомендациями от нескольких партнеров (в настоящее время видна только одна рекомендация).
  • Кластер «Рекомендуемые» демонстрирует подборку элементов от нескольких партнеров-разработчиков в одной группе пользовательского интерфейса. Будет один кластер «Рекомендуемые», который будет отображаться в верхней части пользовательского интерфейса с приоритетом над всеми кластерами «Рекомендации». Каждому партнеру-разработчику будет разрешено транслировать до 10 объектов в избранном кластере.

    Рис. 4. Пользовательский интерфейс Entertainment Space, показывающий избранный кластер с рекомендациями от нескольких партнеров (в настоящее время видна только одна рекомендация).

Предварительная работа

Минимальный уровень 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 определены разные объекты для представления каждого типа элементов. Мы поддерживаем следующие объекты для категории «Прослушивание»:

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

В таблицах ниже показаны доступные атрибуты и требования для каждого типа.

MusicAlbumEntity

Объект MusicAlbumEntity представляет музыкальный альбом (например, Midnights Тейлора Свифта).

Атрибут Требование Примечания
Имя Необходимый Название музыкального альбома.
Изображения для плакатов Необходимый Необходимо предоставить хотя бы одно изображение. Дополнительные сведения см. в разделе «Спецификации изображения» .
URI информационной страницы Необходимый

Глубокая ссылка на приложение поставщика для получения подробной информации о музыкальном альбоме.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Художники Необходимый Список исполнителей в музыкальном альбоме.
Воспроизведение URI Необязательный

Глубокая ссылка, которая запускает воспроизведение альбома в приложении провайдера.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Описание Необязательный Если указано, длина должна быть не более 200 символов.
Количество песен Необязательный Количество песен в музыкальном альбоме.
Жанры Необязательный Список жанров в музыкальном альбоме.
Формат альбома Необязательный

АЛЬБОМ (включает LP и двойной LP)

EP

ОДИНОКИЙ

Микстейп

Музыкальные лейблы Необязательный Список музыкальных лейблов, связанных с альбомом.
Загружено на устройство Необязательный Логическое значение, указывающее, загружен ли музыкальный альбом на устройство.
Явный Необязательный

Логическое значение, указывающее, является ли содержимое явным или нет.

Для элементов, содержащих откровенный материал или имеющих предупреждение для родителей, должно быть установлено значение TRUE. Явные элементы отмечаются тегом «E».

Дата выпуска Необязательный Дата выхода альбома в миллисекундах эпохи.
Продолжительность Необязательный Длительность альбома в миллисекундах.
Время последнего взаимодействия Необязательный

Рекомендуется для предметов в кластере продолжений. Может использоваться для ранжирования.

В эпоху миллисекунд

Процент выполнения выполнен Необязательный

Рекомендуется для предметов в кластере продолжений.

Целое число от 0 до 100

MusicArtistEntity

Объект MusicArtistEntity представляет музыкального исполнителя (например, Адель).

Атрибут Требование Примечания
Имя Необходимый Имя музыкального исполнителя.
Изображения для плакатов Необходимый Необходимо предоставить хотя бы одно изображение. Дополнительные сведения см. в разделе «Спецификации изображения» .
URI информационной страницы Необходимый

Глубокая ссылка на приложение поставщика для получения подробной информации о музыкальном исполнителе.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Воспроизведение URI Необязательный

Глубокая ссылка, которая запускает воспроизведение песен исполнителя в приложении провайдера.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Описание Необязательный Если указано, длина должна быть не более 200 символов.
Время последнего взаимодействия Необязательный

Рекомендуется для предметов в кластере продолжений. Может использоваться для ранжирования.

В эпоху миллисекунд

MusicTrackEntity

Объект MusicTrackEntity представляет музыкальную дорожку (например, Yellow группы Coldplay).

Атрибут Требование Примечания
Имя Необходимый Название музыкального трека.
Изображения для плакатов Необходимый Необходимо предоставить хотя бы одно изображение. Дополнительные сведения см. в разделе «Спецификации изображения» .
Воспроизведение URI Необходимый

Глубокая ссылка, запускающая воспроизведение музыкальной дорожки в приложении провайдера.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

URI информационной страницы Необязательный

Глубокая ссылка на приложение поставщика для получения подробной информации о музыкальном треке.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Описание Необязательный Если указано, длина должна быть не более 200 символов.
Продолжительность Необязательный Длительность трека в миллисекундах.
Альбом Необязательный Название альбома, которому принадлежит песня.
Художники Необходимый Список исполнителей музыкального трека.
Загружено на устройство Необязательный Логическое значение, указывающее, загружена ли музыкальная дорожка на устройство.
Явный Необязательный

Логическое значение, указывающее, является ли содержимое явным или нет.

Для элементов, содержащих откровенный материал или имеющих предупреждение для родителей, должно быть установлено значение TRUE. Явные элементы отмечаются тегом «E».

Время последнего взаимодействия Необязательный

Рекомендуется для предметов в кластере продолжений. Может использоваться для ранжирования.

В эпоху миллисекунд

Процент выполнения выполнен Необязательный

Рекомендуется для предметов в кластере продолжений.

Целое число от 0 до 100

MusicVideoEntity

Объект MusicVideoEntity представляет музыкальное видео (например, The Weeknd — Take My Breath (Official Music Video) ).

Атрибут Требование Примечания
Имя Необходимый Название музыкального клипа.
Изображения для плакатов Необходимый Необходимо предоставить хотя бы одно изображение. Дополнительные сведения см. в разделе «Спецификации изображения» .
Воспроизведение URI Необходимый

Глубокая ссылка, которая запускает воспроизведение музыкального видео в приложении провайдера.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

URI информационной страницы Необязательный

Глубокая ссылка на приложение поставщика для получения подробной информации о музыкальном видео.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Продолжительность Необязательный Длительность видео в миллисекундах.
Количество просмотров Необязательный Количество просмотров видео в произвольном текстовом формате.
Художники Необязательный Список исполнителей клипа.
Рейтинг контента Необязательный Список рейтингов контента трека.
Описание Необязательный Если указано, длина должна быть не более 200 символов.
Загружено на устройство Необязательный Логическое значение, указывающее, загружено ли музыкальное видео на устройство.
Явный Необязательный

Логическое значение, указывающее, является ли содержимое явным или нет.

Для элементов, содержащих откровенный материал или имеющих предупреждение для родителей, должно быть установлено значение TRUE. Явные элементы отмечаются тегом «E».

Время последнего взаимодействия Необязательный

Рекомендуется для предметов в кластере продолжений. Может использоваться для ранжирования.

В эпоху миллисекунд

Процент выполнения выполнен Необязательный

Рекомендуется для предметов в кластере продолжений.

Целое число от 0 до 100

PlaylistEntity

Объект PlaylistEntity представляет список воспроизведения музыки (например, список воспроизведения «10 лучших в США»).

Атрибут Требование Примечания
Имя Необходимый Название плейлиста.
Изображения для плакатов Необходимый Необходимо предоставить хотя бы одно изображение. Дополнительные сведения см. в разделе «Спецификации изображения» .
Воспроизведение URI Необходимый

Глубокая ссылка, запускающая воспроизведение музыкального плейлиста в приложении провайдера.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

URI информационной страницы Необязательный

Глубокая ссылка на приложение поставщика для получения подробной информации о музыкальном плейлисте.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Продолжительность Необязательный Длительность плейлиста в миллисекундах.
Количество песен Необязательный Количество песен в музыкальном плейлисте.
Описание Необязательный Если указано, длина должна быть не более 200 символов.
Загружено на устройство Необязательный Логическое значение, указывающее, загружен ли список воспроизведения на устройство.
Явный Необязательный

Логическое значение, указывающее, является ли содержимое явным или нет.

Для элементов, содержащих откровенный материал или имеющих предупреждение для родителей, должно быть установлено значение TRUE. Явные элементы отмечаются тегом «E».

Время последнего взаимодействия Необязательный

Рекомендуется для предметов в кластере продолжений. Может использоваться для ранжирования.

В эпоху миллисекунд

Процент выполнения выполнен Необязательный

Рекомендуется для предметов в кластере продолжений.

Целое число от 0 до 100

PodcastSeriesEntity

Объект PodcastSeriesEntity представляет серию подкастов (например, This American Life ).

Атрибут Требование Примечания
Имя Необходимый Название серии подкастов.
Изображения для плакатов Необходимый Необходимо предоставить хотя бы одно изображение. Дополнительные сведения см. в разделе «Спецификации изображения» .
URI информационной страницы Необходимый

Глубокая ссылка на приложение провайдера для получения подробной информации о серии подкастов.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Воспроизведение URI Необязательный

Глубокая ссылка, которая запускает воспроизведение серии подкастов в приложении провайдера.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Количество эпизодов Необязательный Количество серий в серии подкастов.
Название продукции Необязательный Название выпуска серии подкастов.
Хозяева Необязательный Список ведущих серии подкастов.
Жанры Необязательный Список жанров серии подкастов.
Загружено на устройство Необязательный Логическое значение, указывающее, загружен ли подкаст на устройство.
Описание Необязательный Если указано, длина должна быть не более 200 символов.
Явный Необязательный

Логическое значение, указывающее, является ли содержимое явным или нет.

Для элементов, содержащих откровенный материал или имеющих предупреждение для родителей, должно быть установлено значение TRUE. Явные элементы отмечаются тегом «E».

Время последнего взаимодействия Необязательный

Рекомендуется для предметов в кластере продолжений. Может использоваться для ранжирования.

В эпоху миллисекунд

PodcastEpisodeEntity

Объект PodcastEpisodeEntity представляет серию подкастов (например, Spark Bird, Episode 754: This American Life ).

Атрибут Требование Примечания
Имя Необходимый Название эпизода подкаста.
Изображения для плакатов Необходимый Необходимо предоставить хотя бы одно изображение. См. инструкции в разделе «Технические характеристики изображения» .
Воспроизведение URI Необходимый

Глубокая ссылка, которая запускает воспроизведение эпизода подкаста в приложении провайдера.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Название производственной серии Необходимый Название серии подкаста, к которой принадлежит эпизод.
Продолжительность Необходимый Продолжительность эпизода подкаста в миллисекундах.
Дата публикации Необходимый Дата публикации подкаста (в миллисекундах эпохи)
URI информационной страницы Необязательный

Глубокая ссылка на приложение провайдера для получения подробной информации об эпизоде ​​подкаста.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Название продукции Необязательный Название выпуска серии подкастов.
Индекс эпизода Необязательный Индекс серии в сериале (первый индекс — 1).
Хозяева Необязательный Список ведущих выпуска подкаста.
Жанры Необязательный Список жанров выпуска подкаста.
Загружено на устройство Необязательный Логическое значение, указывающее, загружен ли выпуск подкаста на устройство.
Описание Необязательный Если указано, длина должна быть не более 200 символов.
Видео подкаст Необязательный Логическое значение, указывающее, есть ли в эпизоде ​​подкаста видеоконтент.
Явный Необязательный

Логическое значение, указывающее, является ли содержимое явным или нет.

Для элементов, содержащих откровенный материал или имеющих предупреждение для родителей, должно быть установлено значение TRUE. Явные элементы отмечаются тегом «E».

Прослушать следующий тип Необязательный

Рекомендуется для предметов в кластере продолжения.

TYPE_CONTINUE — Возобновление незавершенного аудиофайла.

TYPE_NEXT — Продолжение новой серии.

TYPE_NEW – недавно выпущенный.

Время последнего взаимодействия Необязательный

Рекомендуется для предметов в кластере продолжений. Может использоваться для ранжирования.

В эпоху миллисекунд

Процент выполнения выполнен Необязательный

Рекомендуется для предметов в кластере продолжений.

Целое число от 0 до 100

LiveRadioStationEntity

Объект LiveRadioStationEntity представляет радиостанцию ​​в прямом эфире (например, 98.1 The Breeze).

Атрибут Требование Примечания
Имя Необходимый Название прямой радиостанции.
Изображения для плакатов Необходимый Необходимо предоставить хотя бы одно изображение. См. инструкции в разделе «Технические характеристики изображения» .
Воспроизведение URI Необходимый

Глубокая ссылка, запускающая воспроизведение радиостанции в приложении провайдера.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

URI информационной страницы Необязательный

Глубокая ссылка на приложение провайдера для получения подробной информации о радиостанции.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Частота Необязательный Частота, на которой вещает радиостанция (например, «98,1 FM»).
Показать заголовок Необязательный Текущее шоу, которое идет на радиостанции.
Хозяева Необязательный Список ведущих радиостанции.
Описание Необязательный Если указано, длина должна быть не более 200 символов.
Время последнего взаимодействия Необязательный

Рекомендуется для предметов в кластере продолжений. Может использоваться для ранжирования.

В эпохе миллисекунды

AudiobookEntity

Объект AudiobookEntity представляет аудиокнигу (например, аудиокнигу « Становление » Мишель Обамы).

Атрибут Требование Примечания
Имя Необходимый
Изображения для плакатов Необходимый Необходимо предоставить хотя бы одно изображение. Дополнительные сведения см. в разделе «Спецификации изображения» .
Автор Необходимый Должно быть указано хотя бы одно имя автора.
Рассказчик Необходимый Должно быть указано хотя бы имя одного рассказчика.
URI ссылки на действие Необходимый

Глубокая ссылка на приложение поставщика аудиокниги.

Примечание. Для атрибуции можно использовать глубокие ссылки. Обратитесь к этому FAQ

Дата публикации Необязательный В миллисекундах эпохи, если указано.
Описание Необязательный Если указано, длина должна быть не более 200 символов.
Цена Необязательный Открытый текст
Продолжительность Необязательный Должно быть положительное значение, если оно указано.
Жанр Необязательный Список жанров, связанных с книгой.
Название серии Необязательный Название серии, к которой относится аудиокнига (например, «Гарри Поттер» .
Индекс единицы серии Необязательный Индекс аудиокниги серии, где 1 — первая аудиокнига серии. Например, если «Гарри Поттер и узник Азкабана» — третья книга в серии, для этого параметра следует установить значение 3.
Продолжить тип книги Необязательный

TYPE_CONTINUE — Возобновить незаконченную книгу.

TYPE_NEXT — Продолжение новой серии.

TYPE_NEW – недавно выпущенный.

Время последнего взаимодействия Условно требуется

Должен быть предоставлен, когда элемент находится в кластере продолжения.

В эпоху миллисекунд.

Процент выполнения Условно требуется

Должен быть предоставлен, когда элемент находится в кластере продолжения.

*Недавно* приобретенные аудиокниги могут стать частью группы продолжения чтения.

Значение должно быть больше 0 и меньше 100.

DisplayTimeWindow — установите временное окно для отображения содержимого на поверхности.
Начальная временная метка Необязательный

Временная метка эпохи, после которой содержимое должно отображаться на поверхности.

Если не установлено, контент может отображаться на поверхности.

В эпоху миллисекунд.

Конечная временная метка Необязательный

Временная метка эпохи, после которой содержимое больше не отображается на поверхности.

Если не установлено, контент может отображаться на поверхности.

В эпоху миллисекунд.

Характеристики изображения

Ниже перечислены необходимые характеристики для изображений.

Соотношение сторон Требование Минимум пикселей Рекомендуемые пиксели
Квадрат (1x1) Необходимый 300х300 1200x1200
Пейзаж (1,91x1) Необязательный 600x314 1200x628
Портрет (4x5) Необязательный 480x600 960x1200

Форматы файлов

PNG, JPG, статический GIF, WebP

Максимальный размер файла

5120 КБ

Дополнительные рекомендации

  • Безопасная область изображения: поместите важный контент в центр 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 используется для проверки доступности сервиса для интеграции и возможности представления контента на устройстве.

Котлин


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.
    }
}

Джава


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 .

Котлин


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

Джава


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

Когда сервис получает запрос, в рамках одной транзакции происходят следующие действия:

  • Существующие данные RecommendationCluster от партнера-разработчика удаляются.
  • Данные запроса анализируются и сохраняются в обновленном кластере рекомендаций.

В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.

publishFeaturedCluster

Этот API используется для публикации списка объектов FeaturedCluster .

Котлин


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

Джава


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

Когда сервис получает запрос, в рамках одной транзакции происходят следующие действия:

  • Существующие данные FeaturedCluster от партнера-разработчика удаляются.
  • Данные запроса анализируются и сохраняются в обновленном избранном кластере.

В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.

publishContinuationCluster

Этот API используется для публикации объекта ContinuationCluster .

Котлин


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

Джава


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

Когда сервис получает запрос, в рамках одной транзакции происходят следующие действия:

  • Существующие данные ContinuationCluster от партнера-разработчика удаляются.
  • Данные запроса анализируются и сохраняются в обновленном кластере продолжения.

В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.

publishUserAccountManagementRequest

Этот API используется для публикации карты входа. Действие входа направляет пользователей на страницу входа в приложение, чтобы приложение могло публиковать контент (или предоставлять более персонализированный контент).

Следующие метаданные являются частью карты входа:

Атрибут Требование Описание
Действие Ури Необходимый Глубокая ссылка на действие (т. е. переход на страницу входа в приложение)
Изображение Необязательно: если не указано, необходимо указать название.

Изображение на карте

Изображения с соотношением сторон 16x9 и разрешением 1264x712.

Заголовок Необязательно: если не указано, необходимо предоставить изображение. Титул на карте
Текст действия Необязательный Текст, отображаемый в призыве к действию (т. е. войдите в систему)
Субтитры Необязательный Дополнительный субтитр на карте

Котлин


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

Джава


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

Если по каким-либо внутренним бизнес-причинам ни один из кластеров не опубликован, мы настоятельно рекомендуем обновить статус публикации с помощью API updatePublishStatus . Это важно, потому что:

  • Предоставление статуса во всех сценариях, даже когда контент опубликован (СТАТУС == ПУБЛИКИРОВАНО), имеет решающее значение для заполнения панелей мониторинга, которые используют этот явный статус для передачи работоспособности и других показателей вашей интеграции.
  • Если контент не опубликован, но статус интеграции не нарушен (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 рекомендует опубликовать карту входа. Если по какой-либо причине поставщики не могут опубликовать карту входа, мы рекомендуем вызвать API updatePublishStatus с кодом состояния NOT_PUBLISHED_REQUIRES_SIGN_IN.

Котлин


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

Джава


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

deleteRecommendationClusters

Этот API используется для удаления содержимого кластеров рекомендаций.

Котлин


client.deleteRecommendationClusters()

Джава


client.deleteRecommendationClusters();

Когда служба получает запрос, она удаляет существующие данные из кластеров рекомендаций. В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.

deleteFeaturedCluster

Этот API используется для удаления содержимого избранного кластера.

Котлин


client.deleteFeaturedCluster()

Джава


client.deleteFeaturedCluster();

Когда служба получает запрос, она удаляет существующие данные из избранного кластера. В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.

deleteContinuationCluster

Этот API используется для удаления содержимого кластера продолжения.

Котлин


client.deleteContinuationCluster()

Джава


client.deleteContinuationCluster();

Когда служба получает запрос, она удаляет существующие данные из кластера продолжения. В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.

deleteUserManagementCluster

Этот API используется для удаления содержимого кластера UserAccountManagement.

Котлин


client.deleteUserManagementCluster()

Джава


client.deleteUserManagementCluster();

Когда служба получает запрос, она удаляет существующие данные из кластера UserAccountManagement. В случае ошибки весь запрос отклоняется и существующее состояние сохраняется.

deleteClusters

Этот API используется для удаления содержимого кластера определенного типа.

Котлин


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

Джава


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 необходимо настроить двумя следующими способами:

  • Динамически зарегистрируйте экземпляр класса BroadcastReceiver с помощью Context.registerReceiver() . Это позволяет осуществлять связь с приложениями, которые все еще находятся в памяти.
class AppEngageBroadcastReceiver extends BroadcastReceiver {
// Trigger recommendation cluster publish when PUBLISH_RECOMMENDATION broadcast
// is received

// Trigger featured cluster publish when PUBLISH_FEATURED broadcast is received

// Trigger continuation cluster publish when PUBLISH_CONTINUATION broadcast is
// received
}

public static void registerBroadcastReceivers(Context context) {

context = context.getApplicationContext();

// Register Recommendation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_RECOMMENDATION));

// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED));

// Register Continuation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_CONTINUATION));

}
  • Статически объявите реализацию с помощью тега <receiver> в файле AndroidManifest.xml . Это позволяет приложению получать широковещательные намерения, когда оно не запущено, а также позволяет приложению публиковать контент.
<application>
   <receiver
      android:name=".AppEngageBroadcastReceiver"
      android:exported="true"
      android:enabled="true">
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_RECOMMENDATION" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_FEATURED" />
      </intent-filter>
      <intent-filter>
         <action android:name="com.google.android.engage.action.PUBLISH_CONTINUATION" />
      </intent-filter>
   </receiver>
</application>

Служба отправит следующие намерения :

  • com.google.android.engage.action.PUBLISH_RECOMMENDATION При получении этого намерения рекомендуется запустить publishRecommendationClusters .
  • com.google.android.engage.action.PUBLISH_FEATURED При получении этого намерения рекомендуется запустить publishFeaturedCluster .
  • com.google.android.engage.action.PUBLISH_CONTINUATION При получении этого намерения рекомендуется запустить publishContinuationCluster .

Рабочий процесс интеграции

Пошаговое руководство по проверке интеграции после ее завершения см. в разделе Рабочий процесс интеграции с разработчиком .

Часто задаваемые вопросы

См. Часто задаваемые вопросы по Engage SDK .

Контакт

Если в процессе интеграции возникнут какие-либо вопросы, свяжитесь с нами по адресу Engage-developers@google.com . Наша команда ответит как можно скорее.

Следующие шаги

После завершения интеграции ваши следующие действия будут следующими:

  • Отправьте электронное письмо на адрес Engage-developers@google.com и прикрепите интегрированный APK-файл, готовый к тестированию Google.
  • Google проведет внутреннюю проверку и проверку, чтобы убедиться, что интеграция работает должным образом. Если потребуются изменения, Google свяжется с вами и предоставит всю необходимую информацию.
  • Когда тестирование завершится и никаких изменений не потребуется, Google свяжется с вами и уведомит, что вы можете начать публикацию обновленного и интегрированного APK в Play Store.
  • После того как Google подтвердит, что ваш обновленный APK-файл опубликован в Play Store, ваши кластеры «Рекомендации» , «Избранное» и «Продолжение» будут опубликованы и видны пользователям.