Guia de integração do SDK Engage para TV

O recurso "Continuar assistindo" usa o cluster de continuação para mostrar vídeos inacabados e os próximos episódios da mesma temporada de TV, de vários apps em um único grupo de interfaces. Você pode destacar as entidades deles neste cluster de continuação. Siga este guia para saber como aumentar o engajamento do usuário com a experiência "Continuar assistindo" usando o Engage SDK.

Pré-trabalho

Antes de começar, siga estas etapas:

  1. atualizar para a API de destino 19 ou mais recente

  2. Adicione a biblioteca com.google.android.engage ao app:

    Há SDKs separados para usar na integração: um para apps para dispositivos móveis e outro para apps de TV.

    Dispositivos móveis

    
      dependencies {
        implementation 'com.google.android.engage:engage-core:1.5.5
      }
    

    TV

    
      dependencies {
        implementation 'com.google.android.engage:engage-tv:1.0.2
      }
    
  3. Defina o ambiente de serviço do Engage como produção no arquivo AndroidManifest.xml.

    Dispositivos móveis

    
    <meta-data
        android:name="com.google.android.engage.service.ENV"
        android:value="PRODUCTION" />
    

    TV

    
    <meta-data
        android:name="com.google.android.engage.service.ENV"
        android:value="PRODUCTION" />
    
  4. Adicionar permissão para WRITE_EPG_DATA para APK de TV

    <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
    
  5. Verifique a publicação de conteúdo confiável usando um serviço em segundo plano, como o androidx.work, para programação.

  6. Para oferecer uma experiência de visualização perfeita, publique os dados de "Continuar assistindo" quando estes eventos ocorrerem:

    1. Primeiro login: quando um usuário faz login pela primeira vez, publique dados para garantir que o histórico de exibição esteja disponível imediatamente.
    2. Criação ou troca de perfil (apps com vários perfis): se o app for compatível com vários perfis, publique dados quando um usuário criar ou trocar de perfil.
    3. Interrupção da reprodução de vídeo: para ajudar os usuários a retomar de onde pararam, publique dados quando eles pausarem ou interromperem um vídeo ou quando o app for fechado durante a reprodução.
    4. Atualizações da seção "Continuar assistindo" (se compatível): quando um usuário remove um item da seção "Continuar assistindo", reflita essa mudança publicando dados atualizados.
    5. Conclusão do vídeo:
      1. Para filmes, remova o filme concluído da seção "Continuar assistindo". Se o filme fizer parte de uma série, adicione o próximo para manter o usuário engajado.
      2. Para episódios, remova o episódio concluído e adicione o próximo da série, se disponível, para incentivar a continuidade da visualização.

Exemplo de código

Este app de exemplo mostra como os desenvolvedores podem fazer a integração com as APIs de descoberta de vídeo para enviar dados personalizados do usuário ao Google. O app de exemplo também demonstra como criar um módulo comum que pode ser importado nos apps para dispositivos móveis e TV, quando invocar as APIs de publicação e exclusão e como usar Workers para invocar as APIs de publicação e exclusão.

Integração

AccountProfile

Para permitir uma experiência personalizada de "continuar assistindo" no Google TV, forneça informações de conta e perfil. Use o AccountProfile para fornecer:

  1. ID da conta: um identificador exclusivo que representa a conta do usuário no aplicativo. Pode ser o ID real da conta ou uma versão adequadamente ofuscada.

  2. ID do perfil (opcional): se o aplicativo for compatível com vários perfis em uma única conta, forneça um identificador exclusivo para o perfil de usuário específico (real ou ofuscado).

// If your app only supports account
val accountProfile = AccountProfile.Builder()
    .setAccountId("your_users_account_id")
    .build()

// If your app supports both account and profile
val accountProfile = AccountProfile.Builder()
    .setAccountId("your_users_account_id")
    .setProfileId("your_users_profile_id")
    .build()

Criar entidades

O SDK definiu entidades diferentes para representar cada tipo de item. O cluster de continuação é compatível com as seguintes entidades:

  1. MovieEntity
  2. TvEpisodeEntity
  3. LiveStreamingVideoEntity
  4. VideoClipEntity

Especifique os URIs e as imagens de pôster específicos da plataforma para essas entidades.

Além disso, crie URIs de reprodução para cada plataforma, como Android TV, Android ou iOS, se ainda não tiver feito isso. Assim, quando um usuário continua assistindo em cada plataforma, o app usa um URI de reprodução segmentada para tocar o conteúdo de vídeo.

// Required. Set this when you want continue watching entities to show up on
// Google TV
val playbackUriTv = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_ANDROID_TV)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_tv"))
    .build()

// Required. Set this when you want continue watching entities to show up on
// Google TV Android app, Entertainment Space, Playstore Widget
val playbackUriAndroid = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_ANDROID_MOBILE)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_android"))
    .build()

// Optional. Set this when you want continue watching entities to show up on
// Google TV iOS app
val playbackUriIos = PlatformSpecificUri.Builder()
    .setPlatformType(PlatformType.TYPE_IOS)
    .setActionUri(Uri.parse("https://www.example.com/entity_uri_for_ios"))
    .build()

val platformSpecificPlaybackUris =
    Arrays.asList(playbackUriTv, playbackUriAndroid, playbackUriIos)

As imagens de pôster exigem um URI e dimensões de pixel (altura e largura). Para segmentar diferentes formatos, forneça várias imagens de pôster, mas verifique se todas mantêm uma proporção de 16:9 e uma altura mínima de 200 pixels para exibição correta da entidade "Continuar assistindo", principalmente no Espaço de entretenimento do Google. Imagens com altura menor que 200 pixels podem não ser mostradas.

val images = Arrays.asList(
    Image.Builder()
        .setImageUri(Uri.parse("http://www.example.com/entity_image1.png"))
        .setImageHeightInPixel(300)
        .setImageWidthInPixel(169)
        .build(),
    Image.Builder()
        .setImageUri(Uri.parse("http://www.example.com/entity_image2.png"))
        .setImageHeightInPixel(640)
        .setImageWidthInPixel(360)
        .build()
    // Consider adding other images for different form factors
)
MovieEntity

Este exemplo mostra como criar um MovieEntity com todos os campos obrigatórios:

val movieEntity = MovieEntity.Builder()
   .setWatchNextType(WatchNextType.TYPE_CONTINUE)
   .setName("Movie name")
   .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
   .addPosterImages(images)
   // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
   .setLastEngagementTimeMillis(1701388800000)
   // Suppose the duration is 2 hours, it is 72000000 in milliseconds
   .setDurationMills(72000000)
   // Suppose last playback offset is 1 hour, 36000000 in milliseconds
   .setLastPlayBackPositionTimeMillis(36000000)
   .build()

Ao fornecer detalhes como gêneros e classificações de conteúdo, o Google TV pode mostrar seu conteúdo de maneiras mais dinâmicas e conectá-lo aos espectadores certos.

val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val movieEntity = MovieEntity.Builder()
    ...
    .addGenres(genres)
    .addContentRatings(contentRatings)
    .build()

As entidades ficam disponíveis automaticamente por 60 dias, a menos que você especifique um tempo de expiração menor. Defina uma expiração personalizada apenas se precisar que a entidade seja removida antes desse período padrão.

// Set the expiration time to be now plus 30 days in milliseconds
val expirationTime = DisplayTimeWindow.Builder()
    .setEndTimestampMillis(now().toMillis()+2592000000).build()
val movieEntity = MovieEntity.Builder()
    ...
    .addAvailabilityTimeWindow(expirationTime)
    .build()
TvEpisodeEntity

Este exemplo mostra como criar um TvEpisodeEntity com todos os campos obrigatórios:

val tvEpisodeEntity = TvEpisodeEntity.Builder()
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Episode name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(72000000) // 2 hours in milliseconds
    // 45 minutes and 15 seconds in milliseconds is 2715000
    .setLastPlayBackPositionTimeMillis(2715000)
    .setEpisodeNumber("2")
    .setSeasonNumber("1")
    .setShowTitle("Title of the show")
    .build()

A string do número do episódio (como "2") e a string do número da temporada (como "1") serão expandidas para a forma adequada antes de serem exibidas no card "Continuar assistindo". Use uma string numérica, não coloque "e2", "episódio 2", "s1" ou "temporada 1".

Se um programa de TV específico tiver uma única temporada, defina o número da temporada como 1.

Para aumentar as chances de os espectadores encontrarem seu conteúdo no Google TV, forneça dados adicionais, como gêneros, classificações de conteúdo e períodos de disponibilidade. Esses detalhes podem melhorar as opções de exibição e filtragem.

val genres = Arrays.asList("Action", "Science fiction")
val rating1 = RatingSystem.Builder().setAgencyName("MPAA").setRating("PG-13").build()
val contentRatings = Arrays.asList(rating1)
val tvEpisodeEntity = TvEpisodeEntity.Builder()
    ...
    .addGenres(genres)
    .addContentRatings(contentRatings)
    .setSeasonTitle("Season Title")
    .setShowTitle("Show Title")
    .build()
VideoClipEntity

Confira um exemplo de como criar um VideoClipEntity com todos os campos obrigatórios.

VideoClipEntity representa um clipe gerado pelo usuário, como um vídeo do YouTube.

val videoClipEntity = VideoClipEntity.Builder()
    .setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform")
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Video clip name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(600000) //10 minutes in milliseconds
    .setLastPlayBackPositionTimeMillis(300000) //5 minutes in milliseconds
    .addContentRating(contentRating)
    .build()

Você pode definir o criador, a imagem do criador, o tempo de criação em milissegundos ou o período de disponibilidade .

LiveStreamingVideoEntity

Confira um exemplo de como criar um LiveStreamingVideoEntity com todos os campos obrigatórios.

val liveStreamingVideoEntity = LiveStreamingVideoEntity.Builder()
    .setPlaybackUri(Uri.parse("https://www.example.com/uri_for_current_platform")
    .setWatchNextType(WatchNextType.TYPE_CONTINUE)
    .setName("Live streaming name")
    .addPlatformSpecificPlaybackUri(platformSpecificPlaybackUris)
    .addPosterImages(images)
    // Timestamp in millis for sample last engagement time 12/1/2023 00:00:00
    .setLastEngagementTimeMillis(1701388800000)
    .setDurationMills(72000000) //2 hours in milliseconds
    .setLastPlayBackPositionTimeMillis(36000000) //1 hour in milliseconds
    .addContentRating(contentRating)
    .build()

Se quiser, defina o horário de início, o ícone do broadcaster ou o período de disponibilidade da entidade de transmissão ao vivo.

Para informações detalhadas sobre atributos e requisitos, consulte a referência da API.

Fornecer dados do cluster de continuação

O AppEngagePublishClient é responsável pela publicação do cluster de continuação. Use o método publishContinuationCluster() para publicar um objeto ContinuationCluster.

Primeiro, use isServiceAvailable() para verificar se o serviço está disponível para integração.

client.publishContinuationCluster(
    PublishContinuationClusterRequest
        .Builder()
        .setContinuationCluster(
            ContinuationCluster.Builder()
                .setAccountProfile(accountProfile)
                .addEntity(movieEntity1)
                .addEntity(movieEntity2)
                .addEntity(tvEpisodeEntity1)
                .addEntity(tvEpisodeEntity2)
                .setSyncAcrossDevices(true)
                .build()
        )
        .build()
)

Quando o serviço recebe a solicitação, as seguintes ações ocorrem em uma transação:

  • Os dados do ContinuationCluster do parceiro do desenvolvedor são removidos.
  • Os dados da solicitação são analisados e armazenados no ContinuationCluster atualizado.

Em caso de erro, a solicitação inteira é rejeitada e o estado atual é mantido.

As APIs de publicação são APIs de inserção que substituem o conteúdo já existente. Se você precisar atualizar uma entidade específica no ContinuationCluster, será necessário publicar todas as entidades novamente.

Os dados de ContinuationCluster só devem ser fornecidos para contas de adultos. Publicar somente quando o AccountProfile pertencer a um adulto.

Sincronização entre dispositivos

A flag SyncAcrossDevices controla se os dados ContinuationCluster de um usuário são sincronizados em dispositivos como TV, smartphone, tablets etc. A sincronização entre dispositivos fica desativada por padrão.

Valores:

  • true: os dados do ContinuationCluster são compartilhados em todos os dispositivos do usuário para uma experiência de visualização perfeita. Recomendamos essa opção para ter a melhor experiência em vários dispositivos.
  • false: os dados do ContinuationCluster são restritos ao dispositivo atual.

O aplicativo de mídia precisa oferecer uma configuração clara para ativar/desativar a sincronização entre dispositivos. Explicar os benefícios para o usuário e armazenar a preferência dele uma vez para aplicá-la no publishContinuationCluster.

// Example to allow cross device syncing.
client.publishContinuationCluster(
    PublishContinuationClusterRequest
        .Builder()
        .setContinuationCluster(
            ContinuationCluster.Builder()
                .setAccountProfile(accountProfile)
                .setSyncAcrossDevices(true)
                .build()
        )
        .build()
)

Para aproveitar ao máximo nosso recurso entre dispositivos, verifique se o app recebe o consentimento do usuário e ative o SyncAcrossDevices para true. Isso permite que o conteúdo seja sincronizado perfeitamente em todos os dispositivos, resultando em uma melhor experiência do usuário e maior engajamento. Por exemplo, um parceiro que implementou isso teve um aumento de 40% nos cliques em "Continuar assistindo" porque o conteúdo dele apareceu em vários dispositivos.

Excluir os dados de descoberta de vídeo

Para excluir manualmente os dados de um usuário do servidor do Google TV antes do período padrão de retenção de 60 dias, use o método client.deleteClusters(). Ao receber a solicitação, o serviço vai excluir todos os dados de descoberta de vídeo do perfil da conta ou de toda a conta.

O enum DeleteReason define o motivo da exclusão de dados. O código a seguir remove os dados de "Continuar assistindo" ao sair.


// If the user logs out from your media app, you must make the following call
// to remove continue watching data from the current google TV device,
// otherwise, the continue watching data will persist on the current
// google TV device until 60 days later.
client.deleteClusters(
    DeleteClustersRequest.Builder()
        .setAccountProfile(AccountProfile())
        .setReason(DeleteReason.DELETE_REASON_USER_LOG_OUT)
        .setSyncAcrossDevices(true)
        .build()
)

Teste

Use o app de verificação para conferir se a integração do SDK do Engage está funcionando corretamente. O app de verificação oferece ferramentas para ajudar você a verificar seus dados e confirmar se os intents de transmissão estão sendo processados corretamente.

Depois de invocar a API Publish, confira se os dados estão sendo publicados corretamente no app de verificação. Seu cluster de continuação vai aparecer como uma linha distinta na interface do app.

  • Defina a flag do serviço de engajamento apenas para builds de não produção no arquivo de manifesto do Android do app.
  • Instale e abra o app Engage Verify.
  • Se isServiceAvailable for false, clique no botão "Alternar" para ativar.
  • Insira o nome do pacote do seu app para ver automaticamente os dados publicados assim que você começar a publicar.
  • Teste estas ações no seu app:
    • Faça login.
    • Alternar entre perfis(se aplicável).
    • Iniciar e pausar um vídeo ou voltar para a página inicial.
    • Feche o app durante a reprodução do vídeo.
    • Remover um item da linha "Continuar assistindo" (se disponível).
  • Depois de cada ação, confirme se o app invocou a API publishContinuationClusters e se os dados estão sendo exibidos corretamente no app de verificação.
  • O app de verificação vai mostrar uma marca de seleção verde "Tudo certo" para entidades implementadas corretamente.

    Captura de tela de sucesso do app de verificação
    Figura 1. Sucesso do app de verificação
  • O app de verificação vai sinalizar as entidades problemáticas.

    Captura de tela de erro do app de verificação
    Figura 2. Erro no app de verificação
  • Para resolver problemas com entidades, use o controle remoto da TV para selecionar e clicar na entidade no app de verificação. Os problemas específicos vão aparecer e serão destacados em vermelho para sua análise (confira o exemplo abaixo).

    Detalhes do erro do app de verificação
    Figura 3. Detalhes do erro do app de verificação

REST API

O SDK Engage oferece uma API REST para proporcionar uma experiência consistente de continuar assistindo em plataformas que não são Android, como iOS e Roku TV. A API permite que os desenvolvedores atualizem o status "Continuar assistindo" para usuários que ativaram a opção em plataformas que não são Android.

Pré-requisitos

  • Primeiro, conclua a integração no dispositivo baseada no SDK do Engage. Essa etapa essencial estabelece a associação necessária entre o ID de usuário do Google e o AccountProfile do seu app.
  • Acesso e autenticação da API: para ver e ativar a API no seu projeto do Google Cloud, você precisa passar por um processo de lista de permissões. Todas as solicitações de API exigem autenticação.

Conseguir acesso

Para ter acesso à API no console do Google Cloud, sua conta precisa estar inscrita.

  1. O ID do cliente do Google Workspace precisa estar disponível. Se não estiver disponível, talvez seja necessário configurar um Google Workspace e as Contas do Google que você quer usar para chamar a API.
  2. Configure uma conta com o console do Google Cloud usando um e-mail associado ao Google Workspace.
  3. Criar um novo projeto
  4. Crie uma conta de serviço para autenticação de API. Depois de criar a conta de serviço, você terá dois itens:
    • Um ID de conta de serviço.
    • Um arquivo JSON com a chave da sua conta de serviço. Mantenha esse arquivo seguro, já que você precisará dele para autenticar seu cliente na API mais tarde.
  5. O Workspace e as Contas do Google associadas agora podem usar APIs REST. Depois que a mudança for propagada, você vai receber uma notificação informando se a API está pronta para ser chamada pelas suas contas de serviço.
  6. Siga estas etapas para se preparar para fazer uma chamada de API delegada.

Publicar cluster de continuação

Para publicar os dados de descoberta de vídeo, faça uma solicitação POST para a API publishContinuationCluster usando a seguinte sintaxe.

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/profiles/{profile_id}/publishContinuationCluster

Em que:

  • package_name: o nome do pacote do provedor de mídia
  • accountId: o ID exclusivo da conta do usuário no seu sistema. Ele precisa corresponder ao accountId usado no caminho do dispositivo.
  • profileId: o ID exclusivo do perfil do usuário na conta do seu sistema. Ele precisa corresponder ao profileId usado no caminho do dispositivo.

O URL da conta sem perfil é:

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/publishContinuationCluster

O payload da solicitação é representado no campo entities. entities representa uma lista de entidades de conteúdo que podem ser MovieEntity ou TVEpisodeEntity. Este campo é obrigatório.

Corpo da solicitação

Campo

Tipo

Obrigatório

Descrição

entidades

Lista de objetos MediaEntity

Sim

Lista de entidades de conteúdo (máximo de 5). Somente as cinco principais serão mantidas, e o restante será descartado. Uma lista vazia é permitida para indicar que o usuário terminou de assistir todas as entidades.

O campo entities contém movieEntity e tvEpisodeEntity individuais.

Campo

Tipo

Obrigatório

Descrição

movieEntity

MovieEntity

Sim

Um objeto que representa um filme no ContinuationCluster.

tvEpisodeEntity

TvEpisodeEntity

Sim

Um objeto que representa um episódio de TV no ContinuationCluster.

Cada objeto na matriz de entidades precisa ser um dos tipos MediaEntity disponíveis, ou seja, MovieEntity e TvEpisodeEntity, além de campos comuns e específicos do tipo.

O snippet de código a seguir mostra a carga útil do corpo da solicitação para a API publishContinuationCluster.

{
  "entities": [
    {
      "movieEntity": {
        "watch_next_type": "WATCH_NEXT_TYPE_CONTINUE",
        "name": "Movie1",
        "platform_specific_playback_uris": [
          "https://www.example.com/entity_uri_for_android",
          "https://www.example.com/entity_uri_for_iOS"
        ],
        "poster_images": [
          "http://www.example.com/movie1_img1.png",
          "http://www.example.com/movie1_imag2.png"
        ],
        "last_engagement_time_millis": 864600000,
        "duration_millis": 5400000,
        "last_play_back_position_time_millis": 3241111
      }
    },
    {
      "tvEpisodeEntity": {
        "watch_next_type": "WATCH_NEXT_TYPE_CONTINUE",
        "name": "TV SERIES EPISODE 1",
        "platform_specific_playback_uris": [
          "https://www.example.com/entity_uri_for_android",
          "https://www.example.com/entity_uri_for_iOS"
        ],
        "poster_images": [
          "http://www.example.com/episode1_img1.png",
          "http://www.example.com/episode1_imag2.png"
        ],
        "last_engagement_time_millis": 864600000,
        "duration_millis": 1800000,
        "last_play_back_position_time_millis": 2141231,
        "episode_display_number": "1",
        "season_number": "1",
        "show_title": "title"
      }
    }
  ]
}

Excluir os dados de descoberta de vídeo

Use a API clearClusters para remover os dados de descoberta de vídeo.

Use o URL POST para remover as entidades dos dados de descoberta de vídeo. Para excluir os dados do cluster de continuação, faça uma solicitação POST para a API clearClusters usando a seguinte sintaxe.

https://tvvideodiscovery.googleapis.com/v1/packages/{package_name}/accounts/{account_id}/profiles/{profile_id}/clearClusters

Em que:

  • package_name: o nome do pacote do provedor de mídia.
  • accountId: o ID exclusivo da conta do usuário no seu sistema. Ele precisa corresponder ao accountId usado no caminho do dispositivo.
  • profileId: o ID exclusivo do perfil do usuário na conta do seu sistema. Ele precisa corresponder ao profileId usado no caminho do dispositivo.

O payload da API clearClusters contém apenas um campo, reason, que contém um DeleteReason que especifica o motivo da remoção dos dados.

{
  "reason": "DELETE_REASON_LOSS_OF_CONSENT"
}

Teste

Depois de postar os dados, use uma conta de teste de usuário para verificar se o conteúdo esperado aparece na linha "Continuar assistindo" nas plataformas do Google, como o Google TV e os apps Google TV para dispositivos móveis Android e iOS.

No teste, permita um atraso de propagação razoável de alguns minutos e siga os requisitos de exibição, como assistir parte de um filme ou terminar um episódio. Consulte as diretrizes do "Assistir a seguir" para desenvolvedores de apps para mais detalhes.

Fazer o download

Antes de fazer o download, é necessário concordar com os Termos e Condições a seguir.

Termos e Condições

Este é o Contrato de Licença do kit de desenvolvimento de software do Android

1. Introdução

1.1 O kit de desenvolvimento de software do Android (referido no Contrato de Licença como "SDK" e incluindo especificamente os arquivos do sistema Android, pacotes de APIs e complementos de APIs do Google) é licenciado para você de acordo com os termos do Contrato de Licença. O Contrato de Licença constitui um acordo legal entre você e o Google em relação ao uso do SDK. 1.2 "Android" significa a pilha de software Android para dispositivos, conforme disponibilizado no Android Open Source Project, localizado no seguinte URL: https://source.android.com/, atualizado periodicamente. 1.3 Uma "implementação compatível" significa qualquer dispositivo Android que (i) esteja em conformidade com o documento de definição de compatibilidade do Android, que pode ser encontrado no site de compatibilidade do Android (https://source.android.com/compatibility) e atualizado periodicamente; e (ii) seja aprovado no conjunto de teste de compatibilidade do Android (CTS). 1.4 "Google" se refere à Google LLC, empresa estabelecida de acordo com as leis do estado de Delaware, EUA, e que opera de acordo com as leis dos EUA, com sede principal em 1600 Amphitheatre Parkway, Mountain View, CA 94043, EUA.

2. Aceitação deste Contrato de Licença

2.1 Para usar o SDK, primeiro é preciso concordar com o Contrato de Licença. Não é possível usar o SDK sem aceitar o Contrato de Licença. 2.2 Ao clicar para aceitar e/ou usar este SDK, você atesta que concorda com os termos do Contrato de Licença. 2.3 São proibidos o uso do SDK e a aceitação deste Contrato de Licença por indivíduos legalmente impedidos de receber o SDK nos termos das leis dos Estados Unidos ou de outros países, incluindo seu país de residência ou no qual você usa o SDK. 2.4 Se você aceitar as obrigações estabelecidas no Contrato de Licença em nome do seu empregador ou de outra entidade, você declara e garante ter total autoridade legal para vincular seu empregador ou tal entidade ao Contrato de Licença. Se você não tiver a autoridade necessária, não poderá aceitar o Contrato de Licença ou usar o SDK em nome do seu empregador ou de outra entidade.

3. Licença do SDK do Google

3.1 Sujeito aos termos do Contrato de Licença, o Google concede a você uma licença limitada, mundial, livre de royalties, não atribuível, não exclusiva e não sublicenciável para usar o SDK apenas com fins de desenvolvimento de aplicativos para implementações compatíveis do Android. 3.2 Não é permitido usar este SDK para desenvolver aplicativos para outras plataformas (incluindo implementações não compatíveis do Android) ou para desenvolver outro SDK. Evidentemente, você está livre para desenvolver aplicativos para outras plataformas, incluindo implementações não compatíveis do Android, desde que este SDK não seja usado para essa finalidade. 3.3 Você concorda que o Google ou terceiros detêm todos os direitos legais, títulos e participações no SDK, incluindo quaisquer direitos de propriedade intelectual que subsistam no SDK. "Direitos de propriedade intelectual" refere-se a todo e qualquer direito existente de acordo com a lei de patentes, a lei de direitos autorais, a lei de segredos comerciais, a lei de marcas registradas e todo e qualquer outro direito de propriedade. O Google se reserva todos os direitos não concedidos expressamente a você. 3.4 Não é permitido o uso do SDK para qualquer outra finalidade que não seja expressamente permitida pelo Contrato de Licença. Exceto na medida imposta por licenças aplicáveis de terceiros, não é permitido copiar (exceto para fins de backup), modificar, adaptar, redistribuir, descompilar, fazer engenharia reversa, desmontar ou criar obras derivadas do SDK ou de qualquer parte do SDK. 3.5 O uso, a reprodução e a distribuição de componentes do SDK licenciado sob uma licença de software de código aberto são regidos exclusivamente pelos termos dessa licença de software de código aberto, e não pelo Contrato de Licença. 3.6 Você concorda que a forma e a natureza do SDK fornecido pelo Google podem mudar sem aviso prévio e que as versões futuras do SDK podem ser incompatíveis com aplicativos desenvolvidos em versões anteriores dele. Você concorda que o Google pode parar, de modo permanente ou temporário, de fornecer o SDK (ou qualquer recurso dele) para você ou para usuários em geral, a critério exclusivo do Google, sem aviso prévio. 3.7 Nada no Contrato de Licença concede a você o direito de usar qualquer um dos nomes comerciais, marcas registradas, marcas de serviço, logotipos, nomes de domínio ou outras características da marca do Google. 3.8 Você concorda em não remover, ocultar ou alterar quaisquer notificações de direitos de propriedade (incluindo notificações de direitos autorais e marcas comerciais) que possam estar afixadas ou contidas no SDK.

4. Uso do SDK

4.1 O Google concorda que não receberá qualquer direito, título ou participação de você (ou dos seus licenciantes) conforme o Contrato de Licença em ou para qualquer aplicativo de software que você desenvolva usando o SDK, incluindo direitos de propriedade intelectual que subsistam nesses aplicativos. 4.2 Você concorda em usar o SDK e criar aplicativos apenas para os fins permitidos pelo (a) Contrato de Licença e (b) qualquer legislação, regulamento, práticas ou diretrizes geralmente aceitas nas jurisdições relevantes, incluindo qualquer lei relacionada à exportação de dados ou software para e dos Estados Unidos ou outros países relevantes. 4.3 Você concorda que, caso utilize o SDK para desenvolver aplicativos para usuários do público geral, protegerá a privacidade e os direitos legais desses usuários. Se os usuários fornecerem nomes de usuário, senhas ou outras informações de login ou pessoais, você deverá informar a eles que as informações estarão disponíveis no seu aplicativo. Você também deverá fornecer avisos de privacidade e proteger a privacidade dos usuários de forma legalmente adequada. Caso seu aplicativo armazene informações pessoais ou confidenciais fornecidas pelos usuários, precisará fazê-lo de forma segura. Se o usuário fornecer ao aplicativo informações da Conta do Google, seu app poderá usar essas informações somente para acessar a Conta do Google do usuário quando e para os fins limitados aos que o usuário tenha dado permissão. 4.4 Você concorda que não se envolverá em qualquer atividade com o SDK que interfira, perturbe, danifique ou acesse servidores, redes ou outras propriedades ou serviços de terceiros de modo não autorizado, incluindo o desenvolvimento ou a distribuição de um aplicativo. Isso inclui, sem limitações, o Google ou qualquer operadora de comunicações móveis. 4.5 Você se responsabiliza integralmente (e reconhece que o Google não tem nenhuma responsabilidade para com você ou para com terceiros) por qualquer dado, conteúdo ou recurso que você criar, transmitir ou exibir pelo Android e/ou por aplicativos para Android e pelas consequências das suas ações, incluindo qualquer perda ou dano que o Google possa sofrer. 4.6 Você se responsabiliza integralmente (e reconhece que o Google não tem nenhuma responsabilidade para com você ou para com terceiros) por qualquer violação das suas obrigações estabelecidas pelo Contrato de Licença, por qualquer contrato ou Termos de Serviço aplicáveis de terceiros ou por qualquer lei ou regulamentação aplicável e pelas consequências (incluindo perdas ou danos que o Google ou terceiros possam sofrer) resultantes de qualquer violação.

5. Suas credenciais de desenvolvedor

Você assume a responsabilidade de manter a confidencialidade de qualquer credencial de desenvolvedor que possa ser emitida pelo Google ou que esteja à sua escolha e responsabiliza-se integralmente por todos os aplicativos desenvolvidos com as suas credenciais de desenvolvedor.

6. Privacidade e informações

6.1 A fim de inovar e melhorar o SDK continuamente, o Google pode coletar determinadas estatísticas de uso do software, incluindo, mas não se limitando a, um identificador único, o endereço IP associado, o número da versão do software e informações sobre quais ferramentas e/ou serviços no SDK estão sendo usados e como estão sendo usados. Antes da coleta de qualquer uma dessas informações, você será notificado e poderá consentir ou negar essa ação. Se você negar o consentimento, as informações não serão coletadas. 6.2 Os dados coletados são analisados de forma agregada para melhorar o SDK e são mantidos de acordo com a Política de Privacidade do Google, localizada no seguinte URL: https://policies.google.com/privacy 6.3 Conjuntos anonimizados e agregados dos dados podem ser compartilhados com os parceiros do Google para melhorar o SDK.

7. Aplicativos de terceiros

7.1 Ao usar o SDK para executar aplicativos desenvolvidos por terceiros ou que acessem dados, conteúdos ou recursos fornecidos por um terceiro, você concorda que o Google não será responsável por esses aplicativos, dados, conteúdos ou recursos. Você entende que todos os dados, conteúdos ou recursos que possa acessar por esses aplicativos de terceiros são de exclusiva responsabilidade da pessoa que os forneceu e que o Google não é responsável por qualquer perda ou dano que você possa ter em decorrência do uso ou acesso de qualquer um desses aplicativos, dados, conteúdos ou recursos de terceiros. 7.2 Você está ciente de que os dados, conteúdos e recursos apresentados a você por esse aplicativo de terceiros podem estar protegidos por direitos de propriedade intelectual detidos pelos fornecedores (ou por outras pessoas ou empresas deles). Não é permitido modificar, alugar, emprestar, vender, distribuir ou criar trabalhos derivados com base nesses dados, conteúdos ou recursos (na íntegra ou em parte), a menos que você tenha recebido permissão específica para isso por parte dos proprietários relevantes. 7.3 Você reconhece que o uso desses aplicativos, dados, conteúdos ou recursos de terceiros podem estar sujeitos a termos adicionais entre você e o terceiro relevante. Nesse caso, o Contrato de Licença não afeta sua relação jurídica com esses terceiros.

8. Uso de APIs do Android

8.1 APIs Google Data 8.1.1 Ao utilizar qualquer API para recuperar dados do Google, você reconhece que os dados podem estar protegidos por direitos de propriedade intelectual do Google ou das partes que fornecem os dados (ou de outras pessoas ou empresas em nome delas). O uso que você faz de qualquer API pode estar sujeito a Termos de Serviço adicionais. Não é permitido modificar, alugar, emprestar, vender, distribuir ou criar trabalhos derivados com base nesses dados (na íntegra ou em parte), a menos que isso seja permitido pelos Termos de Serviço relevantes. 8.1.2 Ao utilizar qualquer API para acessar dados de um usuário do Google, você reconhece e concorda em acessar os dados apenas com o consentimento explícito do usuário e somente quando e para os fins limitados aos quais o usuário tenha dado permissão. Se você usa a API Android Recognition Service, documentada no seguinte URL: https://developer.android.com/reference/android/speech/RecognitionService, conforme atualizado periodicamente, você reconhece que o uso da API está sujeito ao Adendo de processamento de dados para produtos em que o Google é um processador de dados, localizado no seguinte URL: https://privacy.google.com/businesses/gdprprocessorterms/ (link em inglês), conforme atualizado periodicamente. Ao clicar para aceitar, você concorda com os termos do Adendo de processamento de dados para produtos em que o Google é um processador de dados.

9. Rescisão deste Contrato de Licença

9.1 O Contrato de Licença continuará em vigor até a rescisão pelo desenvolvedor ou pelo Google, conforme estabelecido abaixo. 9.2 Caso queira rescindir o Contrato de Licença, você poderá fazê-lo cessando o uso do SDK e de qualquer credencial relevante de desenvolvedor. 9.3 O Google pode, a qualquer momento, rescindir o Contrato de Licença se: (A) você tiver violado qualquer cláusula do Contrato de Licença; ou (B) o Google for obrigado a fazer isso por lei; ou (C) o parceiro com o qual o Google ofereceu certas partes do SDK (como APIs) tiver rescindido a relação com o Google ou deixado de oferecer certas partes do SDK para você; ou (D) o Google decidir deixar de fornecer o SDK ou certas partes do SDK a usuários do país onde você reside ou em que utiliza o serviço, ou se o fornecimento do SDK ou a prestação de certos serviços do SDK pelo Google deixarem de ser, a critério exclusivo do Google, comercialmente viáveis. 9.4 Quando o Contrato de Licença chegar ao fim, todos os direitos, obrigações e responsabilidades de que você e o Google se beneficiaram, aos quais estiveram sujeitos (ou que tenham acumulado enquanto o Contrato de Licença esteve em vigor) ou que estiverem definidos para continuar por tempo indeterminado, não serão afetados por essa rescisão, e as disposições do parágrafo 14.7 continuarão a ser aplicáveis a esses direitos, obrigações e responsabilidades indefinidamente.

10. EXONERAÇÃO DE RESPONSABILIDADE DE GARANTIAS

10.1 VOCÊ ENTENDE E CONCORDA EXPRESSAMENTE QUE O USO DO SDK É FEITO POR SUA CONTA E RISCO E QUE O SDK É FORNECIDO "NO ESTADO EM QUE SE ENCONTRA" E "CONFORME DISPONIBILIDADE" SEM GARANTIAS DE QUALQUER TIPO DO GOOGLE. 10.2 O SDK E QUALQUER MATERIAL BAIXADO OU OBTIDO DE OUTRO MODO POR MEIO DO SDK SÃO USADOS A SEU CRITÉRIO E RISCO E VOCÊ É O ÚNICO RESPONSÁVEL POR QUALQUER DANO AO SEU SISTEMA DE COMPUTADORES OU A OUTRO DISPOSITIVO, BEM COMO PELA PERDA DE DADOS QUE PODE RESULTAR DESSE USO. 10.3 ALÉM DISSO, O GOOGLE EXCLUI EXPRESSAMENTE TODAS AS GARANTIAS E CONDIÇÕES DE QUALQUER TIPO, EXPRESSAS OU IMPLÍCITAS, INCLUINDO, ENTRE OUTRAS, GARANTIAS E CONDIÇÕES IMPLÍCITAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UMA FINALIDADE PARTICULAR E A NÃO VIOLAÇÃO.

11. LIMITAÇÃO DE RESPONSABILIDADE

11.1 VOCÊ ENTENDE E CONCORDA EXPRESSAMENTE QUE O GOOGLE, AS SUBSIDIÁRIAS E AFILIADAS DELE E OS LICENCIANTES DELE NÃO SERÃO RESPONSÁVEIS PERANTE VOCÊ EM QUALQUER TEORIA DE RESPONSABILIDADE POR DANOS DIRETOS, INDIRETOS, INCIDENTAIS, ESPECIAIS, EMERGENTES OU EXEMPLARES QUE VOCÊ POSSA SOFRER, INCLUINDO PERDA DE DADOS, QUER O GOOGLE OU OS REPRESENTANTES DELE TENHAM OU NÃO SIDO NOTIFICADOS OU TIVESSEM CONHECIMENTO DA POSSIBILIDADE DE OCORRÊNCIA DE TAIS PERDAS.

12. Indenização

12.1 Até o limite máximo permitido por lei, você concorda em defender, indenizar e isentar de responsabilidade o Google, as afiliadas dele e os respectivos diretores, executivos, funcionários e agentes de e contra toda e qualquer contestação, ação, processo ou procedimento, bem como toda e qualquer perda, responsabilidade, dano, custo e despesa (incluindo honorários advocatícios razoáveis) decorrentes ou resultantes de (a) seu uso do SDK, (b) qualquer aplicativo que você desenvolva no SDK que viole direitos autorais, marcas registradas, segredos comerciais, conjunto-imagem, patentes ou outro direito de propriedade intelectual de qualquer pessoa, ou difame qualquer pessoa ou viole os direitos de imagem ou privacidade dela e (c) qualquer situação em que você descumpra o Contrato de Licença.

13. Alterações no Contrato de Licença

13.1 A Google pode modificar o Contrato de licença à medida que distribui novas versões do SDK. Quando essas mudanças forem realizadas, a Google criará uma nova versão do Contrato de licença, disponível no site em que o SDK for disponibilizado. 14.1 O Contrato de Licença constitui o acordo integral entre você e o Google e rege o uso do SDK (excluindo qualquer serviço que o Google possa fornecer a você segundo um contrato escrito em separado) e substitui integralmente quaisquer contratos anteriores entre você e o Google em relação ao SDK. 14.2 Você concorda que, se o Google não exercer nem fizer valer qualquer direito ou recurso legal contido no Contrato de Licença (ou conferido ao Google nos termos de qualquer lei aplicável), esse fato não será considerado renúncia formal aos direitos do Google e esses direitos ou recursos legais continuarão disponíveis para o Google. 14.3 Se algum tribunal com jurisdição para decidir sobre esse caso determinar que alguma cláusula do Contrato de Licença é inválida, tal cláusula será removida do Contrato de Licença sem afetar o restante do Contrato de Licença. As cláusulas restantes do Contrato de Licença continuarão válidas e executáveis. 14.4 Você reconhece e concorda que cada membro do grupo de empresas controladas pelo Google será um terceiro beneficiário do Contrato de Licença e que essas outras empresas terão direito de aplicar diretamente e contar com qualquer cláusula do Contrato de Licença que conferir um benefício a elas (ou um direito a favor delas). Fora isso, nenhuma outra pessoa ou empresa poderá ser um terceiro beneficiário do Contrato de Licença. 14.5 RESTRIÇÕES DE EXPORTAÇÃO. O SDK ESTÁ SUJEITO ÀS LEIS E REGULAMENTAÇÕES DE EXPORTAÇÃO DOS ESTADOS UNIDOS. VOCÊ PRECISA OBEDECER A TODAS AS LEIS E REGULAMENTAÇÕES DE EXPORTAÇÃO NACIONAIS E INTERNACIONAIS APLICÁVEIS AO SDK. ESSAS LEIS INCLUEM RESTRIÇÕES DE DESTINO, USUÁRIOS FINAIS E USO FINAL. 14.6 Os direitos concedidos no Contrato de Licença não podem ser atribuídos ou transferidos por você ou pelo Google sem a aprovação prévia, por escrito, da outra parte. Não será permitido, nem a você nem ao Google, delegar suas responsabilidades ou obrigações estabelecidas por este Contrato de Licença sem aprovação prévia, por escrito, da outra parte. 14.7 O Contrato de Licença e sua relação com o Google nos termos do Contrato de Licença serão regidos pelas leis do estado da Califórnia sem considerar conflitos de provisões legais. Você e o Google concordam em se submeter à jurisdição exclusiva dos tribunais localizados no condado de Santa Clara, Califórnia, para resolver qualquer questão legal decorrente do Contrato de Licença. Não obstante, você aceita que o Google continuará a ter o direito de solicitar as medidas judiciais de reparação cabíveis (ou tipo equivalente de medida jurídica urgente) em qualquer jurisdição. 27 de julho de 2021
Fazer o download de

verify_app_multiplatform_public_20250602.apk