Guía de integración del SDK de Engage para TV

La función Seguir mirando aprovecha el clúster de Continuación para mostrar videos sin terminar y los próximos episodios para mirar de la misma temporada de TV, desde varias apps en una sola agrupación de IU. Puedes destacar sus entidades en este clúster de continuación. Sigue esta guía para aprender a mejorar la participación del usuario a través de la experiencia de Seguir mirando con el SDK de Engage.

Trabajo previo

Antes de comenzar, completa los siguientes pasos:

  1. Actualiza el nivel de API objetivo a 19 o uno superior.

  2. Agrega la biblioteca com.google.android.engage a tu app:

    Hay SDKs separados para usar en la integración: uno para apps para dispositivos móviles y otro para apps para TVs.

    Dispositivo móvil

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

    TV

    
      dependencies {
        implementation 'com.google.android.engage:engage-tv:1.0.2
      }
    
  3. Establece el entorno del servicio de Engage como producción en el archivo AndroidManifest.xml.

    Dispositivo móvil

    
    <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. Agrega permiso para WRITE_EPG_DATA para el APK de TV

    <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
    
  5. Verifica la publicación de contenido confiable con un servicio en segundo plano, como androidx.work, para la programación.

  6. Para brindar una experiencia de visualización fluida, publica los datos de Continuar mirando cuando ocurran los siguientes eventos:

    1. Primer acceso: Cuando un usuario accede por primera vez, publica datos para asegurarte de que su historial de visualizaciones esté disponible de inmediato.
    2. Creación o cambio de perfil (apps con varios perfiles): Si tu app admite varios perfiles, publica datos cuando un usuario cree o cambie de perfil.
    3. Interrupción de la reproducción de video: Para ayudar a los usuarios a retomar la reproducción donde la dejaron, publica datos cuando pausen o detengan un video, o cuando la app se cierre durante la reproducción.
    4. Actualizaciones de la bandeja de Continuar mirando (si se admite): Cuando un usuario quite un elemento de su bandeja de Continuar mirando, publica datos actualizados para reflejar ese cambio.
    5. Finalización del video:
      1. En el caso de las películas, quita la película completada de la bandeja Seguir mirando. Si la película forma parte de una serie, agrega la siguiente para mantener la participación del usuario.
      2. En el caso de los episodios, quita el episodio completado y agrega el siguiente de la serie, si está disponible, para fomentar la visualización continua.

Integración

AccountProfile

Para permitir una experiencia personalizada de "seguir mirando" en Google TV, proporciona información de la cuenta y el perfil. Usa AccountProfile para proporcionar lo siguiente:

  1. ID de la cuenta: Es un identificador único que representa la cuenta del usuario en tu aplicación. Puede ser el ID de la cuenta real o una versión ofuscada adecuada.

  2. ID de perfil (opcional): Si tu aplicación admite varios perfiles en una sola cuenta, proporciona un identificador único para el perfil de usuario específico (nuevamente, real o 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()

Crea entidades

El SDK definió distintas entidades para representar cada tipo de elemento. El clúster de continuación admite las siguientes entidades:

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

Especifica los URIs y las imágenes de póster específicos de la plataforma para estas entidades.

Además, si aún no lo hiciste, crea URIs de reproducción para cada plataforma, como Android TV, Android o iOS. Por lo tanto, cuando un usuario sigue mirando contenido en cada plataforma, la app usa un URI de reproducción segmentado para reproducir el contenido de video.

// 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)

Las imágenes de póster requieren un URI y dimensiones en píxeles (alto y ancho). Proporciona varias imágenes de póster para segmentar diferentes factores de forma, pero verifica que todas las imágenes mantengan una relación de aspecto de 16:9 y una altura mínima de 200 píxeles para que la entidad "Seguir mirando" se muestre correctamente, en especial dentro del Espacio de entretenimiento de Google. Es posible que no se muestren las imágenes con una altura inferior a 200 píxeles.

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

En este ejemplo, se muestra cómo crear un objeto MovieEntity con todos los campos obligatorios:

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

Proporcionar detalles como los géneros y las clasificaciones de contenido le permite a Google TV mostrar tu contenido de formas más dinámicas y conectarlo con los usuarios adecuados.

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

Las entidades permanecen disponibles automáticamente durante 60 días, a menos que especifiques un tiempo de vencimiento más corto. Solo establece un vencimiento personalizado si necesitas que se quite la entidad antes de este período predeterminado.

// 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

En este ejemplo, se muestra cómo crear un objeto TvEpisodeEntity con todos los campos obligatorios:

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

La cadena del número de episodio (como "2") y la cadena del número de temporada (como "1") se expandirán a la forma adecuada antes de mostrarse en la tarjeta de continuar mirando. Ten en cuenta que deben ser cadenas numéricas. No ingreses "e2", "episodio 2", "s1" ni "temporada 1".

Si un programa de TV en particular tiene una sola temporada, establece el número de temporada como 1.

Para maximizar las posibilidades de que los usuarios encuentren tu contenido en Google TV, considera proporcionar datos adicionales, como géneros, calificaciones de contenido y períodos de disponibilidad, ya que estos detalles pueden mejorar las opciones de visualización y filtrado.

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

Este es un ejemplo de cómo crear un objeto VideoClipEntity con todos los campos obligatorios.

VideoClipEntity representa un clip generado por el usuario, como un video de 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()

De manera opcional, puedes establecer el creador, la imagen del creador, la hora de creación en milisegundos o el período de disponibilidad .

LiveStreamingVideoEntity

Este es un ejemplo de cómo crear un objeto LiveStreamingVideoEntity con todos los campos obligatorios.

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

De manera opcional, puedes establecer la hora de inicio, el emisor, el ícono del emisor o el período de disponibilidad de la entidad de transmisión en vivo.

Para obtener información detallada sobre los atributos y los requisitos, consulta la referencia de la API.

Proporciona datos del clúster de Continuation

AppEngagePublishClient es responsable de publicar el clúster de Continuation. Usas el método publishContinuationCluster() para publicar un objeto ContinuationCluster.

Primero, debes usar isServiceAvailable() para verificar si el servicio está disponible para la integración.

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

Cuando el servicio recibe la solicitud, se realizan las siguientes acciones en una transacción:

  • Se quitan los datos existentes de ContinuationCluster del socio desarrollador.
  • Los datos de la solicitud se analizan y se almacenan en el ContinuationCluster actualizado.

En caso de error, se rechaza la solicitud completa y se mantiene el estado existente.

Las APIs de publicación son APIs de inserción y actualización. Reemplazan el contenido existente. Si necesitas actualizar una entidad específica en ContinuationCluster, deberás volver a publicar todas las entidades.

Los datos de ContinuationCluster solo se deben proporcionar para las cuentas de adultos. Se publica solo cuando el AccountProfile pertenece a un adulto.

Sincronización entre dispositivos

La marca SyncAcrossDevices controla si los datos de ContinuationCluster de un usuario se sincronizan en dispositivos como TVs, teléfonos, tablets, etcétera. La sincronización multidispositivo está inhabilitada de forma predeterminada.

Valores:

  • verdadero: Los datos de ContinuationCluster se comparten en todos los dispositivos del usuario para brindar una experiencia de visualización fluida. Recomendamos esta opción para obtener la mejor experiencia en todos los dispositivos.
  • Falso: Los datos de ContinuationCluster están restringidos al dispositivo actual.

La aplicación de medios debe proporcionar un parámetro de configuración claro para habilitar o inhabilitar la sincronización multidispositivo. Explicar los beneficios al usuario y almacenar su preferencia una vez para aplicarla en publishContinuationCluster según corresponda

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

Para aprovechar al máximo nuestra función multidispositivo, verifica que la app obtenga el consentimiento del usuario y habilita SyncAcrossDevices para true. Esto permite que el contenido se sincronice sin problemas en todos los dispositivos, lo que genera una mejor experiencia del usuario y una mayor participación. Por ejemplo, un socio que implementó esta función observó un aumento del 40% en los clics de "Seguir mirando" porque su contenido se mostró en varios dispositivos.

Borra los datos de la campaña de descubrimiento de video

Para borrar manualmente los datos de un usuario del servidor de Google TV antes del período de retención estándar de 60 días, usa el método client.deleteClusters(). Cuando reciba la solicitud, el servicio borrará todos los datos existentes de descubrimiento de videos del perfil de la cuenta o de toda la cuenta.

La enumeración DeleteReason define el motivo de la eliminación de datos. El siguiente código quita los datos de Continuar mirando cuando se cierra la sesión.


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

Prueba

Usa la app de verificación para confirmar que la integración del SDK de Engage funcione correctamente. La proporciona herramientas para ayudarte a verificar tus datos y confirmar que los intents de transmisión se controlan correctamente.

Después de invocar la API de publicación, confirma que tus datos se publiquen correctamente. Para ello, consulta la app de verificación. Tu clúster de continuación debe mostrarse como una fila distinta en la interfaz de la app.

  • Configura Engage Service Flag solo para las compilaciones que no son de producción en el archivo de manifiesto de Android de tu app.
  • Instala y abre la app de Engage Verify
  • Si isServiceAvailable es false, haz clic en el botón “Alternar” para habilitar la opción.
  • Ingresa el nombre del paquete de tu app para ver automáticamente los datos publicados una vez que comiences a publicar.
  • Prueba estas acciones en tu app:
    • Accede.
    • Cambia entre perfiles(si corresponde).
    • Iniciar y, luego, pausar un video, o volver a la página principal
    • Cierra la app durante la reproducción de videos.
    • Quitar un elemento de la fila "Seguir mirando" (si se admite)
  • Después de cada acción, confirma que tu app invocó la API de publishContinuationClusters y que los datos se muestran correctamente en la app de verificación.
  • La app de verificación mostrará una marca de verificación verde con el mensaje "Todo bien" para las entidades implementadas correctamente.

    Captura de pantalla de la verificación correcta de la app
    Figura 1: Éxito de la app de verificación
  • La app de verificación marcará las entidades problemáticas.

    Captura de pantalla del error de la app de verificación
    Figura 2: Error de la app de verificación
  • Para solucionar problemas relacionados con entidades que tienen errores, usa el control remoto de la TV para seleccionar y hacer clic en la entidad en la app de verificación. Los problemas específicos se mostrarán y destacarán en rojo para que los revises (consulta el ejemplo a continuación).

    Detalles del error de la app de verificación
    Figura 3: Detalles del error de la app de verificación

API de REST

El SDK de Engage ofrece una API de REST para proporcionar una experiencia coherente de seguir mirando en plataformas que no son de Android, como iOS y Roku TV. La API permite a los desarrolladores actualizar el estado de "Seguir mirando" para los usuarios que aceptaron participar desde plataformas que no son de Android.

Requisitos previos

  • Primero debes completar la integración basada en el SDK de Engage en el dispositivo. Este paso crítico establece la asociación necesaria entre el ID de usuario de Google y el AccountProfile de tu app.
  • Acceso y autenticación de la API: Para ver y habilitar la API en tu proyecto de Google Cloud, debes completar un proceso de lista de entidades permitidas. Todas las solicitudes a la API requieren autenticación.

Cómo obtener acceso

Para acceder a la API y habilitarla en tu consola de Google Cloud, debes inscribir tu cuenta.

  1. El ID de cliente de Google Workspace debe estar disponible. Si no está disponible, es posible que debas configurar un espacio de trabajo de Google Workspace y las Cuentas de Google que quieras usar para llamar a la API.
  2. Configura una cuenta con la consola de Google Cloud usando un correo electrónico asociado a Google Workspace.
  3. Crea un proyecto nuevo
  4. Crea una cuenta de servicio para la autenticación de la API. Una vez que crees la cuenta de servicio, tendrás dos elementos:
    • ID de una cuenta de servicio
    • Un archivo JSON con la clave de tu cuenta de servicio Mantén este archivo seguro, ya que lo necesitarás más adelante para autenticar tu cliente en la API.
  5. Ahora, Workspace y las Cuentas de Google asociadas pueden usar las APIs de REST. Una vez que se propague el cambio, recibirás una notificación para saber si tus cuentas de servicio pueden llamar a la API.
  6. Sigue estos pasos para prepararte para hacer una llamada a la API delegada.

Publica el clúster de Continuation

Para publicar los datos de Descubrimiento de videos, realiza una solicitud POST a la API de publishContinuationCluster con la siguiente sintaxis.

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

En la que:

  • package_name: Nombre del paquete del proveedor de contenido multimedia
  • accountId: Es el ID único de la cuenta del usuario en tu sistema. Debe coincidir con el accountId que se usa en la ruta de acceso en el dispositivo.
  • profileId: Es el ID único del perfil del usuario dentro de la cuenta en tu sistema. Debe coincidir con el profileId que se usa en la ruta de acceso del dispositivo.

La URL de la cuenta sin perfil es la siguiente:

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

La carga útil de la solicitud se representa en el campo entities. entities representa una lista de entidades de contenido que pueden ser MovieEntity o TVEpisodeEntity. Este es un campo obligatorio.

Cuerpo de la solicitud

Campo

Tipo

Obligatorio

Descripción

entidades

Lista de objetos MediaEntity

Lista de entidades de contenido (máximo 5). Solo se conservarán las cinco primeras y se descartará el resto. Se permite una lista vacía para indicar que el usuario terminó de mirar todas las entidades.

El campo entities contiene movieEntity y tvEpisodeEntity individuales.

Campo

Tipo

Obligatorio

Descripción

movieEntity

MovieEntity

Es un objeto que representa una película dentro de ContinuationCluster.

tvEpisodeEntity

TvEpisodeEntity

Es un objeto que representa un episodio de TV dentro de ContinuationCluster.

Cada objeto del array de entidades debe ser uno de los tipos de MediaEntity disponibles, es decir, MovieEntity y TvEpisodeEntity, junto con campos comunes y específicos del tipo.

En el siguiente fragmento de código, se muestra la carga útil del cuerpo de la solicitud para la API de 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"
      }
    }
  ]
}

Borra los datos de descubrimiento de videos

Usa la API de clearClusters para quitar los datos de descubrimiento de videos.

Usa la URL de POST para quitar las entidades de los datos de descubrimiento de videos. Para borrar los datos del clúster de continuación, realiza una solicitud POST a la API de clearClusters con la siguiente sintaxis.

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

En la que:

  • package_name: Es el nombre del paquete del proveedor de contenido multimedia.
  • accountId: Es el ID único de la cuenta del usuario en tu sistema. Debe coincidir con el accountId que se usa en la ruta de acceso en el dispositivo.
  • profileId: Es el ID único del perfil del usuario dentro de la cuenta en tu sistema. Debe coincidir con el profileId que se usa en la ruta de acceso del dispositivo.

La carga útil de la API de clearClusters contiene solo un campo, reason, que incluye un DeleteReason que especifica el motivo de la eliminación de datos.

{
  "reason": "DELETE_REASON_LOSS_OF_CONSENT"
}

Prueba

Después de publicar los datos correctamente, usa una cuenta de usuario de prueba para verificar que el contenido esperado aparezca en la fila "Seguir mirando" en las plataformas de Google objetivo, como Google TV y las apps para dispositivos móviles de Google TV para Android y iOS.

En las pruebas, permite una demora de propagación razonable de unos minutos y cumple con los requisitos de visualización, como mirar parte de una película o terminar un episodio. Consulta los lineamientos de Ver a continuación para desarrolladores de apps para obtener más detalles.

Descargar

Antes de la descarga, debes aceptar los Términos y Condiciones.

Términos y Condiciones

Este es el Acuerdo de Licencia del Kit para Desarrollo de Software de Android

1. Introducción

1.1 Se le otorga licencia para el Kit de Desarrollo de Software de Android (al que se hace referencia en el Contrato de Licencia como "SDK" y que incluye específicamente los archivos de sistema de Android, las API incorporadas y los complementos de las API de Google) sujeto a las condiciones del Contrato de Licencia. El Contrato de Licencia constituye un acuerdo legalmente vinculante entre usted y Google en relación con el uso que usted haga del SDK. 1.2 "Android" significa la pila de software de Android para dispositivos, tal como se ofrece en el proyecto de código abierto de Android, disponible en la siguiente URL: https://source.android.com/, y sus actualizaciones ocasionales. 1.3 Una "implementación compatible" hace referencia a cualquier dispositivo Android que (i) cumpla con el documento de Definición de Compatibilidad de Android, que está disponible en el sitio web de compatibilidad de Android (https://source.android.com/compatibility) y puede actualizarse de manera periódica; y que (ii) supere satisfactoriamente el Conjunto de Pruebas de Compatibilidad de Android (CTS). 1.4 "Google" se refiere a Google LLC, una corporación organizada según las leyes del estado de Delaware, EE.UU., que opera bajos las leyes de Estados Unidos y cuya ubicación principal se encuentra en 1600 Amphitheatre Parkway, Mountain View, CA 94043, EE.UU.

2. Aceptación de este Contrato de Licencia

2.1 Para usar el SDK, primero debe aceptar este Contrato de Licencia. Si no lo hace, no podrá usar el SDK. 2.2 Al hacer clic para aceptar o usar este SDK, acepta los términos del Contrato de Licencia. 2.3 Usted no podrá usar el SDK ni aceptar el Contrato de Licencia si tiene prohibido recibir el SDK conforme a las leyes de los Estados Unidos o de otros países, incluido el país en el que resida o desde el cual usará el SDK. 2.4 Si acepta quedar vinculado por este Contrato de Licencia en nombre de su empleador o de otra entidad, usted manifiesta y garantiza que posee la capacidad legal absoluta para vincular a su empleador o entidad correspondiente a este Contrato de Licencia. Si no posee la autoridad requerida, no podrá aceptar el Contrato de Licencia ni usar el SDK en representación de su empleador o de otra entidad.

3. Licencia del SDK de Google

3.1 Sujeto a las condiciones del Contrato de Licencia, Google le otorga una licencia limitada, mundial, libre de derechos de autor, no asignable, no exclusiva y no susceptible de someterse a otras licencias para usar el SDK con el único fin de desarrollar aplicaciones para implementaciones compatibles de Android. 3.2 No podrá usar este SDK a fin de desarrollar aplicaciones para otras plataformas (incluidas las implementaciones no compatibles de Android) o para desarrollar otro SDK. Si lo desea, podrá desarrollar aplicaciones para otras plataformas, incluidas las implementaciones no compatibles de Android, siempre y cuando no lo haga con este SDK. 3.3 Usted acepta que Google o terceros poseen el derecho legal, la propiedad y el interés totales relacionados con el SDK, incluidos los Derechos de Propiedad Intelectual que este tenga. "Derechos de Propiedad Intelectual" hace referencia a todos los derechos otorgados por las leyes de patentes, las leyes de derechos de autor, las leyes de secreto comercial, las leyes de marca comercial y cualquier otro derecho de propiedad. Google se reserva todos los derechos que no se le otorguen a usted expresamente. 3.4 No podrá usar el SDK para ningún fin que no esté permitido expresamente en este Contrato de Licencia. Salvo en la medida en que lo exijan las licencias aplicables de terceros, no podrá copiar (excepto con fines de copia de seguridad), modificar, adaptar, redistribuir, descompilar ni desmontar el SDK ni ninguna de sus partes. Tampoco podrá aplicar ingeniería inversa ni crear obras derivadas de este. 3.5 El uso, la reproducción y la distribución de componentes del SDK con licencia de software de código abierto se rigen exclusivamente por los términos de la licencia de ese software de código abierto y no por el Contrato de Licencia. 3.6 Usted acepta que la forma y la naturaleza del SDK que proporciona Google pueden cambiar sin previo aviso, y que sus futuras versiones pueden ser incompatibles con las aplicaciones desarrolladas en versiones anteriores. Acepta que Google, a su entera discreción y sin previo aviso, puede dejar de brindarles a usted o a los usuarios en general (de forma permanente o temporal) el SDK (o cualquiera de sus funciones). 3.7 Nada de lo expresado en el Contrato de Licencia le otorga el derecho de usar alguno de los nombres comerciales, marcas comerciales, marcas de servicio, logotipos, nombres de dominio ni otras características distintivas de marca de Google. 3.8 Usted acepta que no eliminará, disimulará ni alterará ninguno de los avisos de derechos de propiedad (incluidos avisos de marca comercial y derechos de autor) que pudieran anexarse o incluirse en el SDK.

4. Uso del SDK por su parte

4.1 Google acepta que mediante el Contrato de Licencia no obtendrá ningún derecho, título ni interés de parte de usted (o sus proveedores de licencias) con respecto a cualquier aplicación de software que usted desarrolle usando el SDK, incluidos los derechos de propiedad intelectual que existan en esas aplicaciones. 4.2 Usted acepta usar el SDK y desarrollar las aplicaciones únicamente conforme a lo permitido por (a) el Contrato de Licencia y (b) las leyes, regulaciones o prácticas o pautas generalmente aceptadas aplicables en las jurisdicciones correspondientes (incluidas las leyes sobre la exportación de datos o software hacia y desde los Estados Unidos u otros países correspondientes). 4.3 Usted acepta que, si usa el SDK para desarrollar aplicaciones para usuarios del público en general, protegerá la privacidad y los derechos legales de esos usuarios. Si los usuarios le proporcionan sus nombres de usuario, contraseñas y otra información personal o de acceso, debe comunicarles que la información estará disponible para su aplicación, y debe proporcionar un aviso de privacidad con validez legal y protección para esos usuarios. Si en su aplicación se almacena información sensible o personal proporcionada por los usuarios, deberá hacerse de forma segura. Si el usuario le proporciona a su aplicación información de la Cuenta de Google, su aplicación solo podrá usarla para acceder a la Cuenta de Google del usuario únicamente cuando este le haya otorgado permiso y con los propósitos para los cuales se lo haya brindado. 4.4 Usted acepta que no participará en ninguna actividad con el SDK, incluido el desarrollo o la distribución de una aplicación, que interfiera, interrumpa, dañe o acceda sin autorización a los servidores, las redes u otras propiedades o servicios de un tercero, incluidos, sin limitaciones, Google o cualquier proveedor de comunicaciones móviles. 4.5 Usted acepta que es el único responsable (y que Google no asume responsabilidades con respecto a usted ni a terceros) de los datos, el contenido o los recursos que cree, transmita o muestre a través de Android o aplicaciones para Android, y de las consecuencias de sus acciones (incluidos los daños o las pérdidas que Google pudiera sufrir) al hacerlo. 4.6 Usted acepta que es el único responsable (y que Google no asume responsabilidades con respecto a usted ni a terceros) por incumplimientos de sus obligaciones conforme al Contrato de Licencia, contratos de terceros o Condiciones de Servicio aplicables, o bien leyes o normas aplicables, y por las consecuencias (incluidos los daños o las pérdidas que Google o cualquier tercero pudieran sufrir) debido a dicho incumplimiento.

5. Sus credenciales de desarrollador

5.1 Usted acepta que es responsable de mantener la confidencialidad de toda credencial de desarrollador que Google pudiera otorgarle o que pudiera escoger usted mismo, y que será el único responsable de todas las aplicaciones que se desarrollen con sus credenciales de desarrollador.

6. Información y privacidad

6.1 A fin de poder innovar y mejorar de forma continua el SDK, Google podría recopilar ciertas estadísticas de uso del software, lo que incluye, entre otros, un identificador único, la dirección IP asociada, el número de versión del software e información sobre las herramientas o los servicios del SDK que se usan y el modo en que estos se usan. Antes de recopilar esta información, el SDK se lo notificará y le solicitará su permiso. Sin su permiso, no se recopilará la información. 6.2 Los datos recopilados se examinan en conjunto para mejorar el SDK y se mantienen de acuerdo con la Política de Privacidad de Google, que se encuentra en la siguiente URL: https://policies.google.com/privacy. 6.3 Es posible que se compartan conjuntos de datos anónimos y agregados con los socios de Google para mejorar el SDK.

7. Aplicaciones de terceros

7.1 Si usa el SDK para ejecutar aplicaciones desarrolladas por un tercero o que acceden a datos, contenido o recursos proporcionados por un tercero, usted acepta que Google no es responsable por dichas aplicaciones, datos, contenido o recursos. Usted comprende que los datos, el contenido o los recursos a los que podría acceder a través de esas aplicaciones de terceros son exclusiva responsabilidad de la persona que los origina, y que Google no se responsabiliza por las pérdidas o los daños que usted pudiera experimentar como resultado del uso de cualquiera de tales aplicaciones, datos, contenido o recursos de terceros, o del acceso a estos. 7.2 Usted debe saber que los datos, el contenido y los recursos que le presentan a través de esa aplicación de un tercero pueden estar protegidos por derechos de propiedad intelectual que les pertenecen a sus proveedores (o a otras personas o empresas en representación de estos). No puede modificar, alquilar, arrendar, prestar, vender, distribuir ni crear trabajos derivados basados en estos datos, contenido o recursos (en su totalidad o en parte), a menos que los propietarios le hayan otorgado permiso específicamente para hacerlo. 7.3 Usted reconoce que el uso de dichos datos, contenido, recursos o aplicaciones de terceros puede estar sujeto a condiciones separadas entre usted y el tercero correspondiente. En ese caso, el Contrato de Licencia no afecta su relación legal con estos terceros.

8. Uso de las API de Android

8.1 API de datos de Google 8.1.1 Si usted usa una API para recuperar datos de Google, usted reconoce que los datos pueden estar protegidos por derechos de propiedad intelectual que le pertenecen a Google o a las partes que proporcionan los datos (o a otras personas o empresas en su nombre). El uso que realice de cualquiera de esas API puede estar sujeto a Condiciones de Servicio adicionales. No puede modificar, alquilar, arrendar, prestar, vender ni distribuir estos datos, ni crear obras derivadas sobre la base de ellos (en su totalidad o en parte), a menos que las Condiciones del Servicio correspondientes lo permitan. 8.1.2 Si usa una API para recuperar datos de un usuario de Google, usted reconoce y acepta que solo recuperará datos con el consentimiento explícito del usuario únicamente cuando este le haya otorgado permiso y con los propósitos para los cuales se lo haya otorgado. Si usa la API de Android Recognition Service (que se encuentra en https://developer.android.com/reference/android/speech/RecognitionService) y sus actualizaciones periódicas, reconoce que el uso de la API está sujeto al Anexo de Procesamiento de Datos para Productos en el que Google es un Procesador de Datos y que se encuentra en la siguiente URL: https://privacy.google.com/businesses/gdprprocessorterms/, según se actualice de manera periódica. Si hace clic en "Aceptar", acepta los términos del Anexo de Procesamiento de Datos para Productos en el que Google es un Procesador de Datos.

9. Rescisión de este Contrato de Licencia

9.1 El Contrato de Licencia continuará vigente hasta que lo rescinda usted o Google, tal como se indica a continuación. 9.2 Si desea resolver el Contrato de Licencia, puede hacerlo interrumpiendo el uso del SDK y de las credenciales de desarrollador pertinentes. 9.3 En los siguientes casos, Google podrá resolver el Contrato de Licencia en cualquier momento: (A) Usted no cumplió con alguna disposición del Contrato de Licencia. (B) La ley exige que Google lo haga. (C) El socio con el que Google le ofreció algunas partes del SDK (como las API) resolvió su relación con Google o dejó de proporcionarle a usted determinadas partes del SDK. (D) Google decide dejar de proporcionar el SDK o determinadas partes del SDK a usuarios del país en el que usted reside o desde el que usa el servicio; o el aprovisionamiento del SDK o determinados servicios del SDK que Google le brinda ya no son comercialmente viables, según Google. 9.4 Cuando el Contrato de Licencia finalice, no se verán afectados por este cese los derechos, las obligaciones ni las responsabilidades legales de los que usted y Google se hayan beneficiado, a los que hayan estado sujetos (o que se hayan acumulado con el paso del tiempo durante la vigencia del Contrato de Licencia) o cuya duración se extienda indefinidamente, y las disposiciones del párrafo 14.7 se continuarán aplicando a esos derechos, estas obligaciones y estas responsabilidades de forma indefinida.

10. RENUNCIA DE GARANTÍAS

10.1 USTED COMPRENDE Y ACEPTA EXPRESAMENTE QUE UTILIZA EL SDK BAJO SU PROPIO RIESGO Y QUE EL SDK SE PROPORCIONA "TAL CUAL" Y "SEGÚN ESTÉ DISPONIBLE" SIN GARANTÍA DE NINGÚN TIPO DE GOOGLE. 10.2 EL USO QUE USTED REALICE DEL SDK Y DE TODO MATERIAL DESCARGADO U OBTENIDO DE OTRA MANERA MEDIANTE EL USO DEL SDK ES A SU ENTERO RIESGO Y DISCRECIÓN, Y USTED ES EL ÚNICO RESPONSABLE DE CUALQUIER DAÑO QUE PUDIERA SUFRIR SU SISTEMA INFORMÁTICO U OTRO DISPOSITIVO, O POR LA PÉRDIDA DE DATOS COMO CONSECUENCIA DE TAL USO. 10.3 GOOGLE TAMBIÉN DENIEGA EXPRESAMENTE TODAS LAS GARANTÍAS Y CONDICIONES DE CUALQUIER TIPO, EXPRESAS O IMPLÍCITAS, INCLUIDAS, ENTRE OTRAS, LAS GARANTÍAS Y CONDICIONES IMPLÍCITAS DE COMERCIABILIDAD, IDONEIDAD PARA UN FIN DETERMINADO Y NO VIOLACIÓN.

11. LIMITACIÓN DE RESPONSABILIDADES

11.1 USTED COMPRENDE Y ACEPTA EXPRESAMENTE QUE GOOGLE, SUS SUBSIDIARIAS Y AFILIADAS, Y SUS PROVEEDORES DE LICENCIAS NO SE RESPONSABILIZARÁN ANTE USTED BAJO NINGUNA TEORÍA DE RESPONSABILIDAD POR DAÑOS DIRECTOS, INDIRECTOS, IMPREVISTOS, ESPECIALES, DERIVADOS O EJEMPLARES EN LOS QUE PUEDA INCURRIR, INCLUIDA CUALQUIER PÉRDIDA DE DATOS, INDEPENDIENTEMENTE DE QUE SE HAYA ADVERTIDO O NO A GOOGLE O A SUS REPRESENTANTES DE LA POSIBILIDAD DE QUE SE PRODUZCAN DICHAS PÉRDIDAS.

12. Indemnización

12.1 Hasta el grado máximo que permita la ley, usted acepta defender, indemnizar y eximir de responsabilidad a Google, sus afiliados y sus respectivos directores, funcionarios, empleados y agentes de cualquier reclamo, acción, juicio o proceso judicial, así como también de toda pérdida, responsabilidad, daño, costo y gasto (incluidos honorarios legales razonables) que surjan o se acumulen a partir (a) de su uso del SDK, (b) de cualquier aplicación que usted desarrolle en el SDK que constituya una infracción de cualquier derecho de autor, marca comercial, secreto comercial, imagen comercial, patente u otro derecho de propiedad intelectual de cualquier persona, o la difamación a cualquier persona o la infracción de sus derechos de publicidad o privacidad, y (c) de cualquier incumplimiento de su parte con respecto al Acuerdo de licencia.

13. Cambios en el Contrato de Licencia

13.1 Google puede realizar cambios al contrato de licencia a medida que distribuye nuevas versiones del SDK. Cuando se realicen estos cambios, Google emitirá una nueva versión del contrato de licencia, que estará disponible en el sitio web donde se comercialice el SDK. 14.1 El Contrato de Licencia representa en su totalidad el contrato legal entre usted y Google, regula el uso que haga del SDK (se excluye cualquier servicio que Google pueda proporcionarle conforme a un contrato por escrito independiente) y reemplaza por completo cualquier contrato anterior entre usted y Google en relación con el SDK. 14.2 Usted acepta que, si Google no ejerce ni impone un derecho o solución legal especificado en el Contrato de Licencia (o del que Google sea beneficiario conforme a cualquier ley aplicable), esto no se considerará como una renuncia a los derechos de Google y se entenderá que Google seguirá siendo beneficiario de esos derechos o soluciones legales. 14.3 Si un tribunal que tenga jurisdicción para decidir sobre este asunto dictamina que alguna disposición de este Contrato de Licencia no es válida, se quitará esa disposición sin afectar al resto del Contrato de Licencia. Las disposiciones restantes del Contrato de Licencia continuarán siendo válidas y aplicables. 14.4 Reconoce y acepta que cada uno de los miembros del grupo de empresas de las que Google es la casa matriz serán beneficiarios terceros del Contrato de Licencia y que esas otras empresas tendrán derecho a imponer directamente cualquier disposición del Contrato de Licencia que les confiera un beneficio (o que tengan derechos a su favor) y que podrán ampararse en ella. Además de lo mencionado, nadie más ni ninguna empresa serán beneficiarios terceros del Contrato de Licencia. 14.5 RESTRICCIONES SOBRE LA EXPORTACIÓN. EL SDK ESTÁ SUJETO A LAS LEYES Y NORMATIVAS DE EXPORTACIÓN DE ESTADOS UNIDOS. USTED DEBE CUMPLIR CON TODAS LAS LEYES Y NORMATIVAS INTERNACIONALES Y NACIONALES DE EXPORTACIÓN QUE SE APLICAN AL SDK. ESTAS LEYES INCLUYEN RESTRICCIONES SOBRE LOS DESTINOS, LOS USUARIOS FINALES Y LA FINALIDAD. 14.6 Ni usted ni Google podrán asignar ni transferir los derechos que se otorgan en el Contrato de Licencia sin la aprobación previa por escrito de la otra parte. Ni usted ni Google podrán delegar sus responsabilidades u obligaciones del Contrato de Licencia sin la aprobación previa por escrito de la otra parte. 14.7 El Contrato de Licencia y la relación con Google que surge del Contrato de Licencia se regirán por las leyes del estado de California, independientemente de su conflicto con las disposiciones legales. Usted y Google aceptan someterse a la jurisdicción exclusiva de los tribunales ubicados en el condado de Santa Clara, California, para que resuelvan todo problema legal que surja de este Contrato de Licencia o esté relacionado con él. No obstante, usted acepta que Google aún podrá solicitar recursos judiciales (o una clase equivalente de compensación legal urgente) en cualquier jurisdicción. 27 de julio de 2021
Descargar

verify_app_multiplatform_public_20250602.apk