Повысьте вовлеченность приложения, охватывая пользователей там, где они находятся. Интегрируйте Engage SDK, чтобы доставлять персонализированные рекомендации и контент для продолжения пользователям напрямую через несколько поверхностей на устройстве, таких как Collections , Entertainment Space и Play Store. Интеграция добавляет менее 50 КБ (сжатый) к среднему APK и занимает у большинства приложений около недели времени разработчика. Узнайте больше на нашем бизнес-сайте .
В этом руководстве содержатся инструкции для партнеров-разработчиков по доставке контента для чтения (электронные книги, аудиокниги, комиксы/манга) на поверхности контента Engage.
Детали интеграции
Терминология
Эта интеграция включает в себя следующие три типа кластеров: Рекомендация , Продолжение и Избранное .
Кластеры рекомендаций отображают персонализированные предложения по контенту для чтения от отдельного партнера-разработчика.
Ваши рекомендации имеют следующую структуру:
Кластер рекомендаций: представление пользовательского интерфейса, содержащее группу рекомендаций от одного партнера-разработчика.
Рисунок 1. Пользовательский интерфейс Entertainment Space, демонстрирующий ��ластер рекомендаций от одного партнера. Сущность: объект, представляющий один элемент в кластере. Сущность может быть электронной книгой, аудиокнигой, серией книг и т. д. Список поддерживаемых типов сущностей см. в разделе «Предоставить данные сущности» .
Рисунок 2. Пользовательский интерфейс пространства развлечений, показывающий одну сущность в кластере рекомендаций одного партнера.
Кластер Continuation показывает незаконченные книги от нескольких партнеров-разработчиков в одной группе пользовательского интерфейса. Каждому партнеру-разработчику будет разрешено транслировать максимум 10 сущностей в кластере Continuation.
Рисунок 3. Пользовательский интерфейс Entertainment Space, показывающий кластер Continuation с незавершенными рекомендациями от нескольких партнеров (в настоящее время видна только одна рекомендация). Кластер Featured демонстрирует выборку элементов от нескольких партнеров-разработчиков в одной группировке пользовательского интерфейса. Будет один кластер Featured, который будет отображаться в верхней части пользовательского интерфейса с приоритетным размещением над всеми кластерами Recommendation. Каждому партнеру-разработчику будет разрешено транслировать до 10 сущностей в кластере Featured.
Рисунок 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'
}
Краткое содержание
Проект основан на реализации связанной службы .
На данные, которые клиент может публиковать, распространяются следующие ограничения для разных типов кластеров:
Тип кластера | Ограничения кластера | Максимальные пределы сущностей в кластере |
---|---|---|
Кластер(ы) рекомендаций | ��аксимум 7 | Максимум 50 |
Продолжение кластера | Максимум 1 | Максимум 20 |
Избранный кластер | Максимум 1 | Максимум 20 |
Шаг 1: Предоставьте данные об организации
SDK определил различные сущности для представления каждого типа элемента. Мы поддерживаем следующие сущности для категории Read:
-
EbookEntity
-
AudiobookEntity
-
BookSeriesEntity
В таблицах ниже представлены доступные атрибуты и требования для каждого типа.
EbookEntity
Объект EbookEntity
представляет электронную книгу (например, электронную книгу Becoming Мишель Обамы).
Атрибут | Требование | Примечания |
---|---|---|
Имя | Необходимый | |
Изображения постеров | Необходимый | Необходимо предоставить хотя бы одно изображение. См. Характеристики изображения для руководства. |
Автор | Необходимый | Необходимо указать хотя бы одно имя автора. |
Ссылка на действие URI | Необходимый | Глубокая ссылка на приложение поставщика электронной книги. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ |
Дата публикации | Необязательный | В миллисекундах эпохи, если указано. |
Описание | Необязательный | Если указано, длина имени не должна превышать 200 символов. |
Цена | Необязательный | Свободный текст |
Количество страниц | Необязательный | Если указано, должно быть положительным целым числом. |
Жанр | Необязательный | Список жанров, связанных с книгой. |
Название серии | Необязательный | Название серии, к которой принадлежит электронная книга (например, Гарри Поттер ). |
Индекс единиц серии | Необязательный | Индекс электронной книги в серии, где 1 — первая электронная книга в серии. Например, если Гарри Поттер и узник Азкабана — третья книга в серии, то следует установить значение 3. |
Продолжить тип книги | Необязательный | TYPE_CONTINUE — ��родолжение незаконченной книги. TYPE_NEXT — Продолжить работу над новым вопросом из серии. TYPE_NEW — Недавно выпущенный. |
Время последнего участия | Условно требуется | Необходимо указать, если элемент находится в кластере продолжения. *Недавно* приобретенные электронные книги могут стать частью кластера для продолжения чтения. В миллисекундах эпохи. |
Процент выполнения завершен | Условно требуется | Необходимо указать, если элемент находится в кластере продолжения. Значение должно быть больше 0 и меньше 100. |
DisplayTimeWindow — установка временного окна для отображения содержимого на поверхности. | ||
Начало отметки времени | Необязательный | Временная метка эпохи, после которой содержимое должно быть отображено на поверхности. Если не установлено, содержимое может быть отображено на поверхности. В миллисекундах эпохи. |
Конечная временная метка | Необязательный | Временная метка эпохи, после которой содержимое больше не отображается на поверхности. Если не установлено, содержимое может быть отображено на поверхности. В миллисекундах эпохи. |
AudiobookEntity
Объект AudiobookEntity
представляет аудиокнигу (например, аудиокнигу Becoming Мишель Обамы).
Атрибут | Требование | Примечания |
---|---|---|
Имя | Необходимый | |
Изображения постеров | Необходимый | Необходимо предоставить хотя бы одно изображение. См. Характеристики изображения для руководства. |
Автор | Необходимый | Необходимо указать хотя бы одно имя автора. |
Ссылка на действие URI | Необходимый | Глубокая ссылка на приложение провайдера аудиокниги. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ |
Рассказчик | Необязательный | Необходимо указать имя хотя бы одн��го рассказчика. |
Дата публикации | Необязательный | В миллисекундах эпохи, если указано. |
Описание | Необязательный | Если указано, длина имени не должна превышать 200 символов. |
Цена | Необязательный | Свободный текст |
Продолжительность | Необязательный | Если указано, должно быть положительное значение. |
Жанр | Необязательный | Список жанров, связанных с книгой. |
Название серии | Необязательный | Название серии, к которой принадлежит аудиокнига (например, Гарри Поттер . |
Индекс единиц серии | Необязательный | Индекс аудиокниги в серии, где 1 — первая аудиокнига в серии. Например, если Гарри Поттер и узник Азкабана — третья книга в серии, то следует установить значение 3. |
Продолжить тип книги | Необязательный | TYPE_CONTINUE — Продолжение незаконченной книги. TYPE_NEXT — Продолжить работу над новым вопросом из серии. TYPE_NEW — Недавно выпущенный. |
Время последнего участия | Условно требуется | Необходимо указать, если элемент находится в кластере продолжения. В миллисекундах эпохи. |
Процент выполнения завершен | Условно требуется | Необходимо указать, если элемент находится в кластере продолжения. *Недавно* приобретенные аудиокниги могут стать частью кластера для продолжения чтения. Значение должно быть больше 0 и меньше 100. |
DisplayTimeWindow — установка временного окна для отображения содержимого на поверхности. | ||
Начало отметки времени | Необязательный | Временная метка эпохи, после которой содержимое должно быть отображено на поверхности. Если не установлено, содержимое может быть отображено на поверхности. В миллисекундах эпохи. |
Конечная временная метка | Необязательный | Временная метка эпохи, после которой содержимое больше не отображается на поверхности. Если не установлено, содержимое может быть отображено на поверхности. В миллисекундах эпохи. |
BookSeriesEntity
Объект BookSeriesEntity
представляет серию книг (например, серию книг о Гарри Поттере , состоящую из 7 книг).
Атрибут | Требование | Примечания |
---|---|---|
Имя | Необходимый | |
Изображения постеров | Необходимый | Необходимо предоставить хотя бы одно изображение. См. Характеристики изображения для руководства. |
Автор | Необходимый | Должно быть указано хотя бы одно имя автора. |
Ссылка на действие URI | Необходимый | Глубокая ссылка на приложение поставщика аудиокниги или электронной книги. Примечание: Вы можете использовать глубокие ссылки для атрибуции. Обратитесь к этому FAQ |
Количество книг | Необходимый | Количество книг в серии. |
Описание | Необязательный | Если указано, длина имени не должна превышать 200 символов. |
Жанр | Необязательный | Список жанров, связанных с книгой. |
Продолжить тип книги | Необязательный | TYPE_CONTINUE — Продолжение незаконченной книги. TYPE_NEXT — Продолжить работу над новым вопросом из серии. TYPE_NEW — Недавно выпущенный. |
Время последнего участия | Условно требуется | Необходимо указать, если элемент находится в кластере продолжения. В миллисекундах эпохи. |
Процент выполнения завершен | Условно требуется | Необходимо указать, если элемент находится в кластере продолжения. *Недавно* приобретенные серии книг могут стать частью кластера для продолжения чтения. Значение должно быть больше 0 и меньше 100. |
DisplayTimeWindow — установка временного окна для отображения содержимого на поверхности. | ||
Начало отметки времени | Необязательный | Временная метка эпохи, после которой содержимое должно быть отображено на поверхности. Если не установлено, содержимое может быть отображено на поверхности. В миллисекундах эпохи. |
Конечная временная метка | Необязательный | Временная метка эпохи, после которой содержимое больше не отображается на поверхности. Если не установлено, содержимое может быть отображено на поверхности. В миллисекундах эпохи. |
Характеристики изображения
Требуемые характеристики для графических ресурсов перечислены ни��е:
Соотношение сторон | Требование | Минимальное количество пикселей | Рекомендуемые пиксели |
---|---|---|---|
Квадрат (1x1) | Необходимый | 300x300 | 1200x1200 |
Пейзаж (1,91x1) | Необязательный | 600x314 | 1200x628 |
Портрет (4x5) | Необязательный | 480x600 | 960x1200 |
Форматы файлов
PNG, JPG, статический GIF, WebP
Максимальный размер файла
5120 КБ
Дополнительные рекомендации
- Безопасная область изображения: разместите важный контент в центре изображения (80%).
Пример
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("Reconnect with yourself")
.build())
.build())
Ява
client.publishRecommendationClusters(
new PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
new RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Reconnect with yourself")
.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
от партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном Featured Cluster.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
publishContinuationCluster
Этот API используется для публикации объекта ContinuationCluster
.
Котлин
client.publishContinuationCluster(
PublishContinuationClusterRequest.Builder()
.setContinuationCluster(
ContinuationCluster.Builder()
.addEntity(book_entity1)
.addEntity(book_entity2)
.build())
.build())
Ява
client.publishContinuationCluster(
PublishContinuationClusterRequest.Builder()
.setContinuationCluster(
ContinuationCluster.Builder()
.addEntity(book_entity1)
.addEntity(book_entity2)
.build())
.build())
При получении запроса сервисом в рамках одной транзакции выполняются следующие действия:
- Существующие данные
ContinuationCluster
от партнера-разработчика удаляются. - Данные из запроса анализируются и сохраняются в обновленном кластере продолжения.
В случае ошибки весь запрос отклоняется и сохраняется текущее состояние.
publishUserAccountManagementRequest
Этот API используется для публикации карты входа. Действие входа направляет пользователей на страницу входа в приложение, чтобы приложение могло опубликовать контент (или предоставить более персонализированный контент)
Следующие метаданные являются частью карты входа в систему:
Атрибут | Требование | Описание |
---|---|---|
Действие Uri | Необходимый | Глубокая ссылка на действие (т.е. ��ереход на страницу входа в приложение) |
Изображение | Необязательно - если не указано, необходимо указать название | Изображение на карте Изображения с соотношением сторон 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 рекомендует опубликовать Sign In Card. Если по какой-либо причине поставщики не могут опубликовать Sign In Card, мы рекомендуем вызвать 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();
Когда служба получает запрос, она удаляет существующие данные из Recommendation Clusters. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
deleteFeaturedCluster
Этот API используется для удаления содержимого Featured Cluster.
Котлин
client.deleteFeaturedCluster()
Ява
client.deleteFeaturedCluster();
Когда служба получает запрос, она удаляет существующие данные из Featured Cluster. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
deleteContinuationCluster
Этот API используется для удаления содержимого Continuation Cluster.
Котлин
client.deleteContinuationCluster()
Ява
client.deleteContinuationCluster();
Когда служба получает запрос, она удаляет существующие данные из Continuation Cluster. В случае ошибки весь запрос отклоняется, а существующее состояние сохраняется.
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
с причиной, указанной в виде кода ошибки.
Код ошибки | Имя ошибки | Примечание |
---|---|---|
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 Service определяет, что контент может быть устаревшим (например, недельной давности). Таким образом, есть больше уверенности в том, что пользователь может получить свежий контент, даже если приложение не запускалось в течение длительного периода времени.
BroadcastReceiver
необходимо настроить следующими двумя способами:
Динамически зарегистрируйте экземпляр класса
BroadcastReceiver
с помощьюContext.registerReceiver()
. Это позволяет осуществлять связь из приложений, которые все еще находятся в памяти.
Котлин
class AppEngageBroadcastReceiver : 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
}
fun registerBroadcastReceivers(context: Context){
var context = context
context = context.applicationContext
// Register Recommendation Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_RECOMMENDATION),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null)
// Register Featured Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_FEATURED),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null)
// Register Continuation Cluster Publish Intent
context.registerReceiver(AppEngageBroadcastReceiver(),
IntentFilter(Intents.ACTION_PUBLISH_CONTINUATION),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null)
}
Ява
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),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null);
// Register Featured Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_FEATURED),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null);
// Register Continuation Cluster Publish Intent
context.registerReceiver(new AppEngageBroadcastReceiver(),
new IntentFilter(com.google.android.engage.service.Intents.ACTION_PUBLISH_CONTINUATION),
com.google.android.engage.service.BroadcastReceiverPermissions.BROADCAST_REQUEST_DATA_PUBLISH_PERMISSION,
/*scheduler=*/null);
}
Статически объявите реализацию с тегом
<receiver>
в вашем файлеAndroidManifest.xml
. Это позволяет приложению получать широковещательные намерения, когда оно не запущено, а также позволяет приложению публиковать контент.
<application>
<receiver
android:name=".AppEngageBroadcastReceiver"
android:permission="com.google.android.engage.REQUEST_ENGAGE_DATA"
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 При получении этого намерения
It is recommended to start a
вызов publishContinuationCluster.
Рабочий процесс интеграции
Пошаговое руководство по проверке интеграции после ее завершения см. в разделе Рабочий процесс интеграции Engage developer .
Часто задаваемые вопросы
См. раздел « Часто задаваемые вопросы по Engage SDK» .
Контакт
Если в процессе интеграции возникнут какие-либо вопросы, свяжитесь с Engage-Developers@google.com . Наша команда ответит как можно скорее.
Следующие шаги
Посл�� завершения этой интеграции ваши дальнейшие шаги будут следующими:
- Отправьте электронное письмо на адрес Engage-developers@google.com и прикрепите свой интегрированный APK-файл, готовый к тестированию Google.
- Google выполнит внутреннюю проверку и обзор, чтобы убедиться, что интеграция работает так, как ожидалось. Если потребуются изменения, Google свяжется с вами и предоставит все необходимые детали.
- После завершения тестирования и отсутствия необходимости внесения изменений Google свяжется с вами, чтобы уведомить вас о возможности начать публикацию обновленного и интегрированного APK в Play Store.
- После того как Google подтвердит, что ваш обновленный APK был опубликован в Play Store, ваши кластеры «Рекомендации» , «Избранное » и «Продолжение» будут опубликованы и видны пользователям.