Aumente o engajamento com o app alcançando os usuários onde eles estão. Integre o SDK Engage para oferecer recomendações personalizadas e conteúdo de continuação diretamente aos usuários em várias plataformas no dispositivo, como Coleções, Entertainment Space e Play Store. A integração adiciona menos de 50 KB (compactados) ao APK médio e leva cerca de uma semana de tempo de desenvolvimento para a maioria dos apps. Saiba mais no nosso site comercial.
Este guia contém instruções para que os parceiros dos desenvolvedores enviem conteúdo de saúde e fitness para as plataformas de conteúdo do Engage.
Suporte por categoria e plataformas
A qualificação da plataforma do SDK Engage é baseada na categoria de conteúdo do seu app. Use a tabela a seguir para determinar sua qualificação para plataformas específicas:
| Status | Categoria de conteúdo ou caso de uso | Plataformas compatíveis |
|---|---|---|
|
Compatível (Qualificado em todas as plataformas) |
|
|
| incompatível |
|
Habilidades do Android
Ver no GitHubIntegrar o SDK Engage
android skills add engage-sdk-integrationDetalhe de integração
Nesta seção, detalhamos as etapas, os modelos de dados e a terminologia necessários para fazer a integração com o SDK Engage para conteúdo de saúde e fitness.
Terminologia
Essa integração inclui os três tipos de cluster a seguir: recomendação, destaque e continuação.
Os clusters de recomendação mostram sugestões personalizadas de saúde e condicionamento físico de um parceiro de desenvolvimento. Essas recomendações podem ser personalizadas para o usuário ou generalizadas (por exemplo, fitness e saúde em alta). Use-os para destacar artigos ou pessoas relacionadas à saúde e ao condicionamento físico.
- Um cluster de recomendação pode ser formado por
ArticleEntity,PersonEntityouEventEntity, mas não por uma combinação de diferentes tipos de entidade.
As recomendações têm a seguinte estrutura:
Cluster de recomendação: uma visualização de interface que contém um grupo de recomendações do mesmo parceiro do desenvolvedor.
Entidade: um objeto que representa um único item em um cluster. Essa integração oferece algumas entidades que seriam mostradas usando o cluster de recomendação:
ArticleEntity: representa uma recomendação de conteúdo baseado em texto relacionado à saúde e ao condicionamento físico. Ele pode ser usado para artigos, postagens de blog, conteúdo de marketing, trechos de notícias etc.
Figura 1:interface mostrando uma única ArticleEntity em um cluster de recomendações. PersonEntity: representa uma pessoa. As recomendações podem ser para destacar um treinador ou qualquer pessoa relacionada à saúde e ao condicionamento físico etc.
Figura 2:interface mostrando uma única PersonEntity no cluster de recomendações. EventEntity: representa um evento que vai acontecer no futuro. O horário de início do evento é uma informação essencial que precisa ser transmitida aos usuários. Essa entidade pode ser usada para mostrar eventos como campanhas de doação de sangue, sessões de treinamento, aulas de academia ou ioga etc. relacionados à saúde e ao condicionamento físico.
Figura 3:interface mostrando uma única EventEntity no cluster de recomendações.
- Um cluster de recomendação pode ser formado por
O cluster de continuação mostra conteúdo com que os usuários interagiram recentemente de vários parceiros de desenvolvedores em um único grupo de interfaces. Cada parceiro de desenvolvedor poderá transmitir no máximo 10 entidades no cluster de continuação.
O conteúdo de continuação pode ter a seguinte estrutura:
ArticleEntity: representa uma recomendação de conteúdo baseado em texto relacionado à saúde e ao condicionamento físico. Essa entidade pode ser usada para representar notícias inacabadas ou outro conteúdo que o usuário gostaria de continuar consumindo de onde parou. Exemplo: snippet de notícias, snippet de postagem de blog sobre temas relacionados à saúde ou ao condicionamento físico.
Figura 6. Interface mostrando uma única ArticleEntity em um cluster de continuação. EventReservationEntity: representa a reserva de um evento e ajuda os usuários a acompanhar as reservas de eventos de saúde e fitness em andamento ou futuras. Exemplo: sessões de treinamento
Figura 8. Interface mostrando uma única EventReservationEntity em um cluster de continuação.
O cluster de destaque mostra uma seleção de entidades de vários parceiros de desenvolvimento em um único grupo de interfaces. Há um único cluster de destaque, exibido perto da parte de cima da interface, com um posicionamento prioritário acima de todos os clusters de recomendação. Cada parceiro de desenvolvedor pode transmitir até 10 entidades no cluster de destaque.
GenericFeaturedEntity: a GenericFeaturedEntity é diferente do item de recomendação, porque o item em destaque precisa ser usado para um único conteúdo principal dos desenvolvedores e representar o conteúdo mais importante que será interessante e relevante para os usuários.
Figura 12:IU mostrando um único card de destaque GenericFeaturedEntity em um cluster em destaque
Pré-trabalho
Nível mínimo da API: 19
Adicione a biblioteca com.google.android.engage:engage-core ao app:
dependencies {
// Make sure you also include that repository in your project's build.gradle file.
implementation 'com.google.android.engage:engage-core:1.6.0'
}
Resumo
O design é baseado na implementação de um serviço vinculado.
Os dados que um cliente pode publicar estão sujeitos aos seguintes limites para diferentes tipos de clusters:
| Tipo de cluster | Limites de cluster | Limites mínimos de entidades em um cluster | Limites máximos de entidades em um cluster |
|---|---|---|---|
| Clusters de recomendação | No máximo 7 | Pelo menos 1 | No máximo 50 (ArticleEntity, PersonEntity ou
EventEntity) |
| Cluster de continuação | No máximo 1 | Pelo menos 1 | No máximo 20 (ArticleEntity ou
EventReservationEntity) |
| Cluster de destaque | No máximo 1 | Pelo menos 1 | No máximo 20 (GenericFeaturedEntity) |
Etapa 1: fornecer dados da entidade
O SDK definiu entidades diferentes para representar cada tipo de item. Oferecemos suporte às seguintes entidades na categoria "Saúde e fitness":
GenericFeaturedEntityArticleEntityPersonEntityEventEntityEventReservationEntity
As tabelas abaixo descrevem os atributos e os requisitos disponíveis para cada tipo.
GenericFeaturedEntity
| Atributo | Requisito | Descrição | Formato |
|---|---|---|---|
| Action Uri | Obrigatório |
Link direto para a entidade no app do provedor. Observação: é possível usar links diretos para atribuição. Consulte as perguntas frequentes . |
URI |
| Poster images | Obrigatório | Mostraremos apenas uma imagem quando várias forem fornecidas. A proporção recomendada é 16:9. Observação:se um selo for fornecido, garanta um espaço seguro de 24 dps na parte de cima e de baixo da imagem. |
Consulte as orientações em Especificações de imagem. |
| Título | Opcional | Título da entidade. | Texto livre Tamanho de texto recomendado: 50 caracteres |
| Descrição | Opcional | Um único parágrafo de texto para descrever a entidade. Observação:a descrição ou a lista de subtítulos será mostrada ao usuário, não ambas. |
Texto livre Tamanho de texto recomendado: 180 caracteres |
| Lista de legendas | Opcional | Até 3 legendas, cada uma com uma única linha de texto. Observação:a descrição ou a lista de subtítulos será mostrada ao usuário, não ambas. |
Texto livre Tamanho de texto recomendado para cada subtítulo: no máximo 50 caracteres |
| Selos | Opcional | Cada selo é um texto livre (máximo de 15 caracteres) ou uma imagem pequena. Tratamento especial de UX na parte de cima da imagem/vídeo, por exemplo, como sobreposição de selo na imagem
|
|
| Selo: texto | Opcional | Título do selo Observação:o selo precisa ter texto ou imagem. |
Texto livre Tamanho de texto recomendado: até 15 caracteres |
| Selo: imagem | Opcional | Imagem pequena Tratamento especial de UX, por exemplo, como sobreposição de selo na miniatura da imagem/do vídeo. Observação:o selo precisa ter texto ou imagem. |
Consulte as orientações em Especificações de imagem. |
| Categorias de conteúdo | Opcional | Descreva a categoria do conteúdo na entidade. | Lista de tipos enumerados Consulte a seção "Categoria de conteúdo" para mais orientações. |
ArticleEntity
| Atributo | Requisito | Descrição | Formato |
|---|---|---|---|
| Action Uri | Obrigatório |
Link direto para a entidade no app do provedor. Observação: é possível usar links diretos para atribuição. Consulte as perguntas frequentes . |
URI |
| Título | Obrigatório | Título da entidade. | Texto livre Tamanho de texto recomendado: no máximo 50 caracteres |
| Poster images | Opcional | Mostraremos apenas uma imagem quando várias forem fornecidas. A proporção recomendada é 16:9. Observação:é altamente recomendável usar uma imagem. Se um selo for fornecido, garanta um espaço seguro de 24 dps na parte de cima e de baixo da imagem. |
Consulte as orientações em Especificações de imagem. |
| Origem: título | Opcional | O nome do autor, da organização ou do repórter. | Texto livre Tamanho de texto recomendado: menos de 25 caracteres |
| Origem: imagem | Opcional | Uma imagem da fonte, como o autor, a organização ou o repórter | Consulte as orientações em Especificações de imagem. |
| Descrição | Opcional | Um único parágrafo de texto para descrever a entidade. Observação:a descrição ou a lista de subtítulos será mostrada ao usuário, não ambas. |
Texto livre Tamanho de texto recomendado: 180 caracteres |
| Lista de legendas | Opcional | Até 3 legendas, cada uma com uma única linha de texto. Observação:a descrição ou a lista de subtítulos será mostrada ao usuário, não ambas. |
Texto livre Tamanho de texto recomendado para cada subtítulo: no máximo 50 caracteres |
| Selos | Opcional | Cada selo é um texto livre (máximo de 15 caracteres) ou uma imagem pequena. Tratamento especial de UX na parte de cima da imagem/vídeo, por exemplo, como sobreposição de selo na imagem
|
|
| Selo: texto | Opcional | Título do selo Observação:o selo precisa ter texto ou imagem. |
Texto livre Tamanho de texto recomendado: até 15 caracteres |
| Selo: imagem | Opcional | Imagem pequena Tratamento especial de UX, por exemplo, como sobreposição de selo na miniatura da imagem/do vídeo. Observação:o selo precisa ter texto ou imagem. |
Consulte as orientações em Especificações de imagem. |
| Horário de publicação do conteúdo | Opcional | É o carimbo de data/hora da época em milissegundos de quando o conteúdo foi publicado / atualizado no app. | Carimbo de data/hora da época em milissegundos |
| Last Engagement Time | Obrigatório sob certas condições | O carimbo de data/hora de época em milissegundos de quando o usuário interagiu com essa entidade pela última vez. Observação:este campo é obrigatório se a entidade fizer parte do cluster de continuação. |
Carimbo de data/hora da época em milissegundos |
| Porcentagem de progresso | Obrigatório sob certas condições | A porcentagem do conteúdo total consumido pelo usuário até o momento. Observação:esse campo é obrigatório se a entidade fizer parte do cluster de continuação. |
Um valor int entre 0 e 100, inclusive. |
| Categorias de conteúdo | Opcional | Descreva a categoria do conteúdo na entidade. | Lista de tipos enumerados Consulte a seção "Categoria de conteúdo" para mais orientações. |
PersonEntity
| Atributo | Requisito | Descrição | Formato |
|---|---|---|---|
| Action Uri | Obrigatório |
Link direto para a entidade no app do provedor. Observação: é possível usar links diretos para atribuição. Consulte as perguntas frequentes . |
URI |
| Perfil – Nome | Obrigatório | Nome, ID ou identificador do perfil, por exemplo, "João Silva", "@EquipePixel" etc. | String Tamanho de texto recomendado: no máximo 50 caracteres |
| Perfil: avatar | Obrigatório |
Foto do perfil ou imagem do avatar do usuário. Observação:precisa ser uma imagem quadrada 1:1. |
Consulte as orientações em Especificações de imagem. |
| Perfil – Texto adicional | Opcional | Texto livre, como o identificador do perfil. | Texto livre Tamanho de texto recomendado: até 15 caracteres |
| Perfil – Imagem adicional | Opcional | Imagem pequena, como um selo de verificação. | Consulte as orientações em Especificações de imagem. |
| Imagem de cabeçalho | Opcional | Mostraremos apenas uma imagem quando várias forem fornecidas. A proporção recomendada é 16:9. Observação:é altamente recomendável usar uma imagem. Se um selo for fornecido, garanta um espaço seguro de 24 dps na parte de cima e de baixo da imagem. |
Consulte as orientações em Especificações de imagem. |
| Popularidade: contagem | Opcional |
Indicação do número de seguidores ou do valor de popularidade, por exemplo, "3,7 M". Observação:se a contagem e o valor da contagem forem fornecidos, a contagem será usada. |
String Tamanho de texto recomendado: máximo de 20 caracteres para a combinação de contagem + rótulo |
| Popularidade: valor de contagem | Opcional | O número de seguidores ou o valor de popularidade. Observação:forneça o valor de contagem se o app não quiser processar a lógica de como um número grande precisa ser otimizado para diferentes tamanhos de tela. Se as duas opções forem fornecidas, "Contagem" será usada. |
Longo |
| Popularidade: rótulo | Opcional | Indicação do rótulo de popularidade, por exemplo, "Curtidas". | String Tamanho de texto recomendado: máximo de 20 caracteres para a combinação de contagem + rótulo |
| Popularidade: visual | Opcional |
Indicação do motivo da interação. Por exemplo, uma imagem mostrando o ícone de curtidas, emojis. É possível fornecer mais de uma imagem, embora nem todas possam aparecer em todos os formatos. Observação:precisa ser uma imagem quadrada 1:1. |
Consulte as orientações em Especificações de imagem. |
| Rating - Max value | Obrigatório | O valor máximo da escala de avaliação. Precisa ser fornecido se o valor atual da classificação também for informado. |
Número maior ou igual a 0,0 |
| Rating - Current value | Obrigatório | O valor atual da escala de avaliação. Precisa ser fornecido se o valor máximo de avaliação também for fornecido. |
Número maior ou igual a 0,0 |
| Rating - Count | Opcional | O número de classificações recebidas pela entidade. Observação:forneça esse campo se o app controlar como a contagem é mostrada aos usuários. Use uma string concisa. Por exemplo, se a contagem for 1.000.000, use uma abreviação como 1M para que a contagem não seja truncada em telas menores. |
String |
| Rating - Count Value | Opcional | O número de classificações recebidas pela entidade. Observação:preencha esse campo se você não processar a lógica de abreviação de exibição. Se ambos estiverem presentes, a contagem será mostrada aos usuários. |
Longo |
| Local: país | Opcional | O país em que a pessoa está localizada ou servindo. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: cidade | Opcional | A cidade onde a pessoa está localizada ou atendendo. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: endereço de exibição | Opcional | O endereço onde a pessoa está localizada ou atendendo será exibido para o usuário. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: endereço | Opcional | O endereço (se aplicável) em que a pessoa está localizada ou trabalhando. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: estado | Opcional | O estado (se aplicável) em que a pessoa está localizada ou servindo. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local - CEP | Opcional | O CEP (se aplicável) do local onde a pessoa está ou atende. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Localização: bairro | Opcional | O bairro (se aplicável) em que a pessoa está localizada ou atendendo. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Selos | Opcional |
Cada selo é um texto livre (máximo de 15 caracteres) ou uma imagem pequena. |
|
| Selo: texto | Opcional | Título do selo Observação:o selo precisa ter texto ou imagem. |
Texto livre Tamanho de texto recomendado: até 15 caracteres |
| Selo: imagem | Opcional | Imagem pequena Tratamento especial de UX, por exemplo, como sobreposição de selo na miniatura da imagem/do vídeo. Observação:o selo precisa ter texto ou imagem. |
Consulte as orientações em Especificações de imagem. |
| Descrição | Opcional | Um único parágrafo de texto para descrever a entidade. Observação:a descrição ou a lista de subtítulos será mostrada ao usuário, não ambas. |
Texto livre Tamanho de texto recomendado: 180 caracteres |
| Lista de legendas | Opcional | Até 3 legendas, cada uma com uma única linha de texto. Observação:a descrição ou a lista de subtítulos será mostrada ao usuário, não ambas. |
Texto livre Tamanho de texto recomendado para cada subtítulo: no máximo 50 caracteres |
| Categorias de conteúdo | Opcional | Descreva a categoria do conteúdo na entidade. | Lista de tipos enumerados qualificados
Consulte a seção "Categoria de conteúdo" para mais orientações. |
EventEntity
| Atributo | Requisito | Descrição | Formato |
|---|---|---|---|
| Action Uri | Obrigatório |
Link direto para a entidade no app do provedor. Observação: é possível usar links diretos para atribuição. Consulte as perguntas frequentes . |
URI |
| Título | Obrigatório | Título da entidade. | String Tamanho de texto recomendado: no máximo 50 caracteres |
| Horário de início | Obrigatório |
O carimbo de data/hora de época em que o evento deve começar. Observação:isso será representado em milissegundos. |
Carimbo de data/hora da época em milissegundos |
| Modo de evento | Obrigatório | Um campo para indicar se o evento será virtual, presencial ou ambos. |
Tipo enumerado: VIRTUAL, IN_PERSON ou HYBRID |
| Poster images | Obrigatório | Mostraremos apenas uma imagem quando várias forem fornecidas. A proporção recomendada é 16:9. Observação:é altamente recomendável usar uma imagem. Se um selo for fornecido, garanta um espaço seguro de 24 dps na parte de cima e de baixo da imagem. |
Consulte as orientações em Especificações de imagem. |
| Local: país | Obrigatório sob certas condições | O país em que o evento está acontecendo. Observação:isso é obrigatório para eventos IN_PERSON ou HYBRID. |
Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: cidade | Obrigatório sob certas condições | A cidade em que o evento está acontecendo. Observação:isso é obrigatório para eventos IN_PERSON ou HYBRID. |
Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: endereço de exibição | Obrigatório sob certas condições | O endereço ou nome do local onde o evento vai acontecer que deve ser mostrado ao usuário. Observação:isso é obrigatório para eventos IN_PERSON ou HYBRID. |
Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: endereço | Opcional | É o endereço (se aplicável) do local onde o evento será realizado. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: estado | Opcional | O estado ou a província (se aplicável) em que o evento está sendo realizado. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local - CEP | Opcional | O código postal (se aplicável) do local em que o evento será realizado. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Localização: bairro | Opcional | O bairro (se aplicável) em que o evento está sendo realizado. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Horário de término | Opcional |
O carimbo de data/hora de época em que o evento deve terminar. Observação:isso será representado em milissegundos. |
Carimbo de data/hora da época em milissegundos |
| Descrição | Opcional | Um único parágrafo de texto para descrever a entidade. Observação:a descrição ou a lista de subtítulos será mostrada ao usuário, não ambas. |
Texto livre Tamanho de texto recomendado: 180 caracteres |
| Lista de legendas | Opcional | Até 3 legendas, cada uma com uma única linha de texto. Observação:a descrição ou a lista de subtítulos será mostrada ao usuário, não ambas. |
Texto livre Tamanho de texto recomendado para cada subtítulo: no máximo 50 caracteres |
| Selos | Opcional |
Cada selo é um texto livre (máximo de 15 caracteres) ou uma imagem pequena. |
|
| Selo: texto | Opcional | Título do selo Observação:o selo precisa ter texto ou imagem. |
Texto livre Tamanho de texto recomendado: até 15 caracteres |
| Selo: imagem | Opcional | Imagem pequena Tratamento especial de UX, por exemplo, como sobreposição de selo na miniatura da imagem/do vídeo. Observação:o selo precisa ter texto ou imagem. |
Consulte as orientações em Especificações de imagem. |
| Price - CurrentPrice | Obrigatório sob certas condições |
O preço atual do ingresso/passe para o evento. Precisa ser fornecido se o preço tachado for informado. |
Texto livre |
| Price - StrikethroughPrice | Opcional | O preço original do ingresso/passe para o evento. | Texto livre |
| Frase de destaque de preço | Opcional | Frase de destaque de preço para apresentar uma promoção, evento ou desconto para membros, se disponível. | Texto livre Tamanho de texto recomendado: menos de 45 caracteres (um texto muito longo será mostrado com reticências) |
| Categorias de conteúdo | Opcional | Descreva a categoria do conteúdo na entidade. | Lista de tipos enumerados qualificados
Consulte a seção "Categoria de conteúdo" para mais orientações. |
EventReservationEntity
| Atributo | Requisito | Descrição | Formato |
|---|---|---|---|
| Action Uri | Obrigatório |
Link direto para a entidade no app do provedor. Observação: é possível usar links diretos para atribuição. Consulte as perguntas frequentes . |
URI |
| Título | Obrigatório | Título da entidade. | String Tamanho de texto recomendado: no máximo 50 caracteres |
| Horário de início | Obrigatório |
O carimbo de data/hora de época em que o evento deve começar. Observação:isso será representado em milissegundos. |
Carimbo de data/hora da época em milissegundos |
| Modo de evento | Obrigatório | Um campo para indicar se o evento será virtual, presencial ou ambos. |
Tipo enumerado: VIRTUAL, IN_PERSON ou HYBRID |
| Local: país | Obrigatório sob certas condições | O país em que o evento está acontecendo. Observação:isso é obrigatório para eventos IN_PERSON ou HYBRID. |
Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: cidade | Obrigatório sob certas condições | A cidade em que o evento está acontecendo. Observação:isso é obrigatório para eventos IN_PERSON ou HYBRID. |
Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: endereço de exibição | Obrigatório sob certas condições | O endereço ou nome do local onde o evento vai acontecer que deve ser mostrado ao usuário. Observação:isso é obrigatório para eventos IN_PERSON ou HYBRID. |
Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: endereço | Opcional | É o endereço (se aplicável) do local onde o evento será realizado. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local: estado | Opcional | O estado ou a província (se aplicável) em que o evento está sendo realizado. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Local - CEP | Opcional | O código postal (se aplicável) do local em que o evento será realizado. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Localização: bairro | Opcional | O bairro (se aplicável) em que o evento está sendo realizado. | Texto livre Tamanho de texto recomendado: máximo de ~20 caracteres |
| Poster images | Opcional | Mostraremos apenas uma imagem quando várias forem fornecidas. A proporção recomendada é 16:9. Observação:é altamente recomendável usar uma imagem. Se um selo for fornecido, garanta um espaço seguro de 24 dps na parte de cima e de baixo da imagem. |
Consulte as orientações em Especificações de imagem. |
| Horário de término | Opcional |
O carimbo de data/hora de época em que o evento deve terminar. Observação:isso será representado em milissegundos. |
Carimbo de data/hora da época em milissegundos |
| Provedor de serviços: nome | Opcional |
O nome do provedor de serviços. Observação:o prestador de serviços precisa de texto ou imagem. |
Texto livre. Por exemplo, nome do organizador do evento/turnê |
| Provedor de serviços: imagem | Opcional |
O logotipo/imagem do provedor de serviços. Observação:o provedor de serviços precisa de texto ou imagem. |
Consulte as orientações em Especificações de imagem. |
| Descrição | Opcional | Um único parágrafo de texto para descrever a entidade. Observação:a descrição ou a lista de subtítulos será mostrada ao usuário, não ambas. |
Texto livre Tamanho de texto recomendado: 180 caracteres |
| Lista de legendas | Opcional | Até 3 legendas, cada uma com uma única linha de texto. Observação:a descrição ou a lista de subtítulos será mostrada ao usuário, não ambas. |
Texto livre Tamanho de texto recomendado para cada subtítulo: no máximo 50 caracteres |
| Selos | Opcional |
Cada selo é um texto livre (máximo de 15 caracteres) ou uma imagem pequena. |
|
| Selo: texto | Opcional | Título do selo Observação:o selo precisa ter texto ou imagem. |
Texto livre Tamanho de texto recomendado: até 15 caracteres |
| Selo: imagem | Opcional | Imagem pequena Tratamento especial de UX, por exemplo, como sobreposição de selo na miniatura da imagem/do vídeo. Observação:o selo precisa ter texto ou imagem. |
Consulte as orientações em Especificações de imagem. |
| ID da reserva | Opcional | O ID da reserva do evento. | Texto livre |
| Price - CurrentPrice | Obrigatório sob certas condições |
O preço atual do ingresso/passe para o evento. Precisa ser fornecido se o preço tachado for informado. |
Texto livre |
| Price - StrikethroughPrice | Opcional | O preço original do ingresso/passe para o evento. | Texto livre |
| Frase de destaque de preço | Opcional | Frase de destaque de preço para apresentar uma promoção, evento ou desconto para membros, se disponível. | Texto livre Tamanho de texto recomendado: menos de 45 caracteres (um texto muito longo será mostrado com reticências) |
| Rating - Max value | Opcional | O valor máximo da escala de avaliação. Precisa ser fornecido se o valor atual da classificação também for informado. |
Número maior ou igual a 0,0 |
| Rating - Current value | Opcional | O valor atual da escala de avaliação. Precisa ser fornecido se o valor máximo de avaliação também for fornecido. |
Número maior ou igual a 0,0 |
| Rating - Count | Opcional | O número de classificações do evento. Observação:forneça esse campo se o app quiser controlar como isso é mostrado aos usuários. Forneça a string concisa que pode ser mostrada ao usuário. Por exemplo, se a contagem for 1.000.000, use abreviações como 1M para que ela não seja truncada em telas menores. |
String |
| Rating - Count Value | Opcional | O número de classificações do evento. Observação:preencha esse campo se você não quiser processar a lógica de abreviação de exibição por conta própria. Se ambos estiverem presentes, vamos usar a contagem para mostrar aos usuários. |
Longo |
| Categorias de conteúdo | Opcional | Descreva a categoria do conteúdo na entidade. | Lista de tipos enumerados qualificados
Consulte a seção "Categoria de conteúdo" para mais orientações. |
Especificações da imagem
Consulte nesta tabela as especificações necessárias para recursos de imagem:
| Proporção | Mínimo de pixels | Pixels recomendados |
|---|---|---|
Quadrada (1 x 1) Preferida |
300 x 300 | 1.200 x 1.200 |
| Paisagem (1,91 x 1) | 600 x 314 | 1.200 x 628 |
| Retrato (4 x 5) | 480 x 600 | 960 x 1.200 |
As imagens precisam ser hospedadas em CDNs públicas para que possam ser acessadas pelo Google.
Formatos de arquivo
PNG, JPG, GIF estático, WebP
Tamanho máximo do arquivo
5.120 KB
Recomendações adicionais
- Área de segurança da imagem: posicione o conteúdo importante no centro da imagem, ocupando 80% do espaço.
- Use um plano de fundo transparente para que a imagem possa ser exibida corretamente nas configurações do tema claro e escuro.
Categoria do conteúdo
A categoria de conteúdo permite que os apps publiquem conteúdo de várias categorias. Isso mapeia o conteúdo com algumas das categorias predefinidas, como:
TYPE_EDUCATIONTYPE_SPORTSTYPE_MOVIES_AND_TV_SHOWSTYPE_BOOKSTYPE_AUDIOBOOKSTYPE_MUSICTYPE_DIGITAL_GAMESTYPE_TRAVEL_AND_LOCALTYPE_HOME_AND_AUTOTYPE_BUSINESSTYPE_NEWSTYPE_FOOD_AND_DRINKTYPE_SHOPPINGTYPE_HEALTH_AND_FITENESSTYPE_MEDICALTYPE_PARENTINGTYPE_DATING
As imagens precisam ser hospedadas em CDNs públicas para que possam ser acessadas pelo Google.
Diretrizes para usar as categorias de conteúdo
- Algumas entidades, como ArticleEntity e GenericFeaturedEntity, podem usar qualquer uma das categorias de conteúdo. Para outras entidades, como EventEntity, EventReservationEntity e PersonEntity, apenas um subconjunto dessas categorias é qualificado. Verifique a lista de categorias qualificadas para um tipo de entidade antes de preencher a lista.
Use o tipo de entidade específico para algumas categorias de conteúdo em vez de uma combinação das entidades genéricas e da ContentCategory:
- TYPE_MOVIES_AND_TV_SHOWS: confira as entidades do guia de integração do Google Assistente para assistir antes de usar as entidades genéricas.
- TYPE_BOOKS: confira o EbookEntity antes de usar as entidades genéricas.
- TYPE_AUDIOBOOKS: confira AudiobookEntity antes de usar as entidades genéricas.
- TYPE_SHOPPING: confira ShoppingEntity antes de usar as entidades genéricas.
- TYPE_FOOD_AND_DRINK: confira as entidades do guia de integração de alimentos antes de usar as entidades genéricas.
O campo ContentCategory é opcional e deve ser deixado em branco se o conteúdo não pertencer a nenhuma das categorias mencionadas anteriormente.
Se houver várias categorias de conteúdo, forneça-as em ordem de relevância para o conteúdo, com a categoria mais relevante em primeiro lugar na lista.
Etapa 2: fornecer dados do cluster
É recomendável executar o job de publicação de conteúdo em segundo plano (por exemplo, usando o WorkManager) e o programar com frequência ou por evento (por exemplo, toda vez que o usuário abrir o app ou adicionar algo ao carrinho).
AppEngagePublishClient é responsável pela publicação de clusters.
Estas são as APIs para publicar clusters no cliente:
isServiceAvailablepublishRecommendationClusterspublishFeaturedClusterpublishContinuationClusterpublishUserAccountManagementRequestupdatePublishStatusdeleteRecommendationsClustersdeleteFeaturedClusterdeleteContinuationClusterdeleteUserManagementClusterdeleteClusters
isServiceAvailable
Essa API é usada para conferir se o serviço está disponível para integração e se o conteúdo pode ser apresentado no dispositivo.
Para o SDK Engage v1.6.0 e versões mais recentes (recomendado)
Habilidades do Android
Ver no GitHubIntegração do SDK Engage
android skills add engage-sdk-integrationUse the engage-sdk-integration skill to use Engage SDK 1.6.0 and refactor isServiceAvailable to pass ServiceAvailabilityRequest for publishing all cluster types.Verifique a disponibilidade do serviço para cada tipo de cluster que você pretende
publicar. A API isServiceAvailable aceita um objeto de solicitação,
ServiceAvailabilityRequest, que contém os tipos de cluster para os quais a disponibilidade
do serviço precisa ser verificada. Confira os valores de tipo enumerado ClusterType
necessários para ServiceAvailabilityRequest na tabela a seguir.
| Tipo de cluster | Constante do tipo de cluster | Número inteiro |
|---|---|---|
| Desconhecido | TYPE_UNKNOWN |
0 |
| Cluster de recomendação | TYPE_RECOMMENDATION |
1 |
| Cluster de destaque | TYPE_FEATURED |
2 |
| Cluster de continuação | TYPE_CONTINUATION |
3 |
| Cluster de Gerenciamento de usuários | TYPE_ENGAGEMENT |
8 |
| Cluster de assinatura | TYPE_SUBSCRIPTION |
12 |
Kotlin
val request = ServiceAvailabilityRequest.Builder()
.addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
.addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
.build()
client.isServiceAvailable(request).addOnCompleteListener { task ->
if (task.isSuccessful) {
val availabilityMap = task.result
if (availabilityMap[ClusterType.TYPE_CONTINUATION] == true) {
// Proceed with publishing continuation content
}
if (availabilityMap[ClusterType.TYPE_RECOMMENDATION] == true) {
// Proceed with publishing recommendation content
}
} else {
// The IPC call itself fails, proceed with error handling logic here,
// such as retry.
}
}
Java
ServiceAvailabilityRequest request =
new ServiceAvailabilityRequest.Builder()
.addIntendedClusterType(ClusterType.TYPE_CONTINUATION)
.addIntendedClusterType(ClusterType.TYPE_RECOMMENDATION)
.build();
client.isServiceAvailable(request).addOnCompleteListener(task -> {
if (task.isSuccessful()) {
Map<Integer, Boolean> availabilityMap = task.getResult();
if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_CONTINUATION))) {
// Proceed with publishing continuation content
}
if (Boolean.TRUE.equals(availabilityMap.get(ClusterType.TYPE_RECOMMENDATION))) {
// Proceed with publishing recommendation content
}
} else {
// The IPC call itself fails, proceed with error handling logic here,
// such as retry.
}
});
Recurso de disponibilidade de serviço condicional
Alguns apps integrados solicitam uma configuração especial que ativa e desativa o serviço Engage de forma intermitente para reduzir os custos de veiculação. No entanto, essa estratégia de ingestão de conteúdo intermitente afeta negativamente a experiência do usuário: o conteúdo desatualizado não será apresentado, e algumas plataformas não serão veiculadas.
A partir da versão 1.6.0, o SDK Engage permite verificar a disponibilidade de tipos de cluster específicos. Se o app usa ingestão intermitente:
- Os clusters de continuação (como "Continuar lendo" e "Reservas de eventos") permanecem ativados por padrão em todos os dispositivos compatíveis.
- Outros tipos de cluster (como recomendações) são ativados e desativados de forma intermitente.
Se essa configuração padrão não for adequada às suas necessidades, entre em contato com engage-developers@google.com.
Para versões do SDK anteriores à v1.6.0 (descontinuada)
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
Essa API é usada para publicar uma lista de objetos RecommendationCluster.
Kotlin
client.publishRecommendationClusters(
PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Top Picks For You")
.build()
)
.build()
)
Java
client.publishRecommendationClusters(
new PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(
new RecommendationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.setTitle("Top Picks For You")
.build())
.build());
Quando o serviço recebe a solicitação, as ações abaixo ocorrem em uma transação:
- Os dados do
RecommendationClusterdo parceiro do desenvolvedor são removidos. - Os dados da solicitação são analisados e armazenados no cluster de recomendação atualizado.
Em caso de erro, o pedido inteiro é rejeitado e o estado atual é mantido.
publishFeaturedCluster
Essa API é usada para publicar uma lista de objetos FeaturedCluster.
Kotlin
client.publishFeaturedCluster(
PublishFeaturedClusterRequest.Builder()
.setFeaturedCluster(
FeaturedCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.build())
.build())
Java
client.publishFeaturedCluster(
new PublishFeaturedClusterRequest.Builder()
.setFeaturedCluster(
new FeaturedCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.build())
.build());
Quando o serviço recebe a solicitação, as ações abaixo ocorrem em uma transação:
- Os dados do
FeaturedClusterdo parceiro do desenvolvedor são removidos. - Os dados da solicitação são analisados e armazenados no cluster de destaque atualizado.
Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.
publishContinuationCluster
Essa API é usada para publicar um objeto ContinuationCluster.
Kotlin
client.publishContinuationCluster(
PublishContinuationClusterRequest.Builder()
.setContinuationCluster(
ContinuationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.build())
.build())
Java
client.publishContinuationCluster(
new PublishContinuationClusterRequest.Builder()
.setContinuationCluster(
new ContinuationCluster.Builder()
.addEntity(entity1)
.addEntity(entity2)
.build())
.build());
Quando o serviço recebe a solicitação, as ações abaixo ocorrem em uma transação:
- Os dados do
ContinuationClusterdo parceiro do desenvolvedor são removidos. - Os dados da solicitação são analisados e armazenados no cluster de continuação atualizado.
Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.
publishUserAccountManagementRequest
Essa API é usada para publicar um card de login. A ação de login direciona os usuários à página de login do app para que ele possa publicar ou oferecer conteúdo mais personalizado.
Os metadados abaixo fazem parte do card de login:
| Atributo | Requisito | Descrição |
|---|---|---|
| Action Uri | Obrigatório | Link direto para a ação (ou seja, leva à página de login do app) |
| Image | Opcional: se não for fornecido, o título precisa ser fornecido |
Imagem mostrada no card Imagens com proporção de 16 x 9 e resolução de 1.264 x 712 |
| Title | Opcional: se não for fornecido, a imagem precisará ser fornecida | Título do card |
| Action Text | Opcional | Texto mostrado no CTA (por exemplo, "Fazer login") |
| Subtitle | Opcional | Subtítulo opcional do card |
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());
Quando o serviço recebe o pedido, as seguintes ações ocorrem em uma transação:
- Os dados do
UserAccountManagementClusterdo parceiro do desenvolvedor são removidos. - Os dados do pedido são analisados e armazenados no cluster UserAccountManagementCluster atualizado.
Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.
updatePublishStatus
Se, por qualquer motivo interno, nenhum dos clusters for publicado, é altamente recomendável atualizar o status de publicação usando a API updatePublishStatus. Isso é importante pelos seguintes motivos:
- Informar o status em todos os casos possíveis, mesmo quando o conteúdo é publicado (STATUS == PUBLISHED), é fundamental para preencher painéis que usam o status explícito para transmitir informações de integridade e outras métricas da integração.
- Se nenhum conteúdo for publicado, mas o status da integração não estiver corrompido (STATUS == NOT_PUBLISHED), o Google poderá evitar o acionamento de alertas nos painéis de integridade do app. Isso confirma que o conteúdo não foi publicado devido a uma situação esperada pelo provedor.
- Ajuda os desenvolvedores a oferecer insights sobre quando os dados foram publicados ou não.
- O Google pode usar os códigos de status para incentivar o usuário a executar ações específicas no app, como acessar o conteúdo ou resolver o problema.
Lista de códigos de status de publicação que podem ser usados:
// 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
Se o conteúdo não for publicado porque o usuário não estava conectado, o Google recomenda publicar o card de login. Se, por algum motivo, os provedores não conseguirem publicar o card de login, recomendamos chamar a API updatePublishStatus usando o código de status NOT_PUBLISHED_REQUIRES_SIGN_IN.
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());
deleteRecommendationsClusters
Essa API é usada para excluir o conteúdo dos clusters de recomendação.
Kotlin
client.deleteRecommendationsClusters()
Java
client.deleteRecommendationsClusters();
Quando o serviço recebe o pedido, ele remove os dados atuais dos clusters de recomendação. Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.
deleteFeaturedCluster
Essa API é usada para excluir o conteúdo do cluster de destaque.
Kotlin
client.deleteFeaturedCluster()
Java
client.deleteFeaturedCluster();
Quando o serviço recebe o pedido, ele remove os dados atuais do cluster de destaque. Em caso de erro, a solicitação inteira é rejeitada e o estado existente é mantido.
deleteContinuationCluster
Essa API é usada para excluir o conteúdo do cluster de continuação.
Kotlin
client.deleteContinuationCluster()
Java
client.deleteContinuationCluster();
Quando o serviço recebe o pedido, ele remove os dados atuais do cluster de continuação. Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.
deleteUserManagementCluster
Essa API é usada para excluir o conteúdo do cluster UserAccountManagement.
Kotlin
client.deleteUserManagementCluster()
Java
client.deleteUserManagementCluster();
Quando o serviço recebe o pedido, ele remove os dados atuais do cluster UserAccountManagement. Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.
deleteClusters
Essa API é usada para excluir o conteúdo de determinado tipo de cluster.
Kotlin
client.deleteClusters(
DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_CONTINUATION)
.addClusterType(ClusterType.TYPE_FEATURED)
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
.build())
Java
client.deleteClusters(
new DeleteClustersRequest.Builder()
.addClusterType(ClusterType.TYPE_CONTINUATION)
.addClusterType(ClusterType.TYPE_FEATURED)
.addClusterType(ClusterType.TYPE_RECOMMENDATION)
.build());
Quando o serviço recebe a solicitação, ele remove os dados de todos os clusters que correspondem aos tipos especificados. Os clientes podem transmitir um ou vários tipos de clusters. Em caso de erro, a solicitação inteira é rejeitada e o estado existente é mantido.
Tratamento de erros
É recomendável detectar o resultado da tarefa nas APIs de publicação. Com isso, uma ação de acompanhamento pode ser realizada para extrair e reenviar uma tarefa bem-sucedida.
Kotlin
client.publishRecommendationClusters(
PublishRecommendationClustersRequest.Builder()
.addRecommendationCluster(..)
.build())
.addOnCompleteListener { task ->
if (task.isSuccessful) {
// do something
} else {
val exception = task.exception
if (exception is AppEngageException) {
@AppEngageErrorCode val errorCode = exception.errorCode
if (errorCode == AppEngageErrorCode.SERVICE_NOT_FOUND) {
// do something
}
}
}
}
Java
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
}
}
}
});
O erro é retornado como AppEngageException e a causa é incluída como um
código de erro.
| Código do erro | Nome do erro | Observação |
|---|---|---|
1 |
SERVICE_NOT_FOUND |
O serviço não está disponível no dispositivo. |
2 |
SERVICE_NOT_AVAILABLE |
O serviço está disponível no dispositivo em questão, mas não no momento da chamada (por exemplo, está desativado). |
3 |
SERVICE_CALL_EXECUTION_FAILURE |
A execução da tarefa falhou devido a problemas de linha de execução. Nesse caso, ela pode ser repetida. |
4 |
SERVICE_CALL_PERMISSION_DENIED |
O autor da chamada não tem permissão para fazer a chamada de serviço. |
5 |
SERVICE_CALL_INVALID_ARGUMENT |
A solicitação contém dados inválidos (por exemplo, tem um número de clusters maior do que o permitido). |
6 |
SERVICE_CALL_INTERNAL |
Há um erro no serviço. |
7 |
SERVICE_CALL_RESOURCE_EXHAUSTED |
A chamada de serviço é feita com muita frequência. |
Etapa 3: processar intents de transmissão
Além de fazer chamadas de API de conteúdo de publicação usando um job, também é
necessário configurar um
BroadcastReceiver para receber
a solicitação de publicação de conteúdo.
O objetivo principal das intents de transmissão é reativar o app e forçar a sincronização de dados. As intents de transmissão não são projetadas para envio muito frequente. Elas só são acionadas quando o serviço do Engage determina que o conteúdo pode estar desatualizado (por exemplo, é de uma semana atrás). Dessa forma, há mais confiança de que o usuário poderá ter uma nova experiência de conteúdo, mesmo que o aplicativo não tenha sido executado por um longo período.
O BroadcastReceiver precisa ser configurado de duas maneiras:
Registre dinamicamente uma instância da classe
BroadcastReceiverusandoContext.registerReceiver(). Isso permite a comunicação de aplicativos que ainda estão ativos na memória.
Kotlin
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)
}
Java
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);
}
Declare estaticamente uma implementação com a tag
<receiver>no arquivoAndroidManifest.xml. Isso permite que o aplicativo receba intents de transmissão quando não está em execução e também permite que ele publique o conteúdo.
<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>
As intents abaixo são enviadas pelo serviço:
com.google.android.engage.action.PUBLISH_RECOMMENDATIONRecomendamos que você inicie uma chamadapublishRecommendationClustersao receber essa intent.com.google.android.engage.action.PUBLISH_FEATUREDRecomendamos que você inicie uma chamadapublishFeaturedClusterao receber essa intent.com.google.android.engage.action.PUBLISH_CONTINUATIONRecomendamos que você inicie uma chamadapublishContinuationClusterao receber essa intent.
Fluxo de trabalho de integração
Para acessar um guia explicativo sobre como verificar a integração após a conclusão, consulte Fluxo de trabalho de integração de desenvolvedor.
Perguntas frequentes
Consulte as Perguntas frequentes sobre o SDK Engage para acessar as perguntas frequentes.
Contato
Entre em contato com
engage-developers@google.com se tiver
perguntas durante o processo de integração.
Próximas etapas
Depois de concluir essa integração, as próximas etapas serão as seguintes:
- Envie um e-mail para
engage-developers@google.come anexe seu APK integrado pronto para ser testado pelo Google. - O Google realiza uma verificação e revisão interna para garantir que a integração funcione como esperado. Se for necessário fazer mudanças, o Google vai entrar em contato informando todos os detalhes necessários.
- Quando o teste estiver concluído e nenhuma mudança for necessária, o Google vai entrar em contato para informar que você pode começar a publicar o APK atualizado e integrado na Play Store.
- Depois que o Google confirmar a publicação do APK atualizado na Play Store, seus clusters de recomendação, destaque e continuação poderão ser publicados e ficar visíveis aos usuários.