Guida all'integrazione dell'SDK Engage per la TV

Continua a guardare sfrutta il cluster Continua per mostrare i video non terminati e gli episodi successivi da guardare della stessa stagione TV, da più app in un unico raggruppamento dell'interfaccia utente. Puoi mettere in evidenza le loro entità in questo cluster di continuazione. Segui questa guida per scoprire come migliorare il coinvolgimento degli utenti tramite l'esperienza Continua a guardare utilizzando l'SDK Engage.

Preparazione

Prima di iniziare, completa i seguenti passaggi:

  1. aggiornamento all'API target 19 o versioni successive

  2. Aggiungi la libreria com.google.android.engage alla tua app:

    Esistono SDK separati da utilizzare nell'integrazione: uno per le app mobile e uno per le app TV.

    Dispositivo mobile

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

    TV

    
      dependencies {
        implementation 'com.google.android.engage:engage-tv:1.0.2
      }
    
  3. Imposta l'ambiente di servizio Engage su produzione nel file AndroidManifest.xml.

    Dispositivo mobile

    
    <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. Aggiungi l'autorizzazione per WRITE_EPG_DATA per l'APK della TV

    <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" />
    
  5. Verifica la pubblicazione di contenuti affidabili utilizzando un servizio in background, come androidx.work, per la pianificazione.

  6. Per offrire un'esperienza di visualizzazione senza interruzioni, pubblica i dati di Continua a guardare quando si verificano questi eventi:

    1. Primo accesso: quando un utente accede per la prima volta, pubblica i dati per assicurarti che la cronologia delle visualizzazioni sia disponibile immediatamente.
    2. Creazione o cambio di profilo (app multi-profilo): se la tua app supporta più profili, pubblica i dati quando un utente crea o cambia profilo.
    3. Interruzione della riproduzione video: per aiutare gli utenti a riprendere la riproduzione da dove l'avevano interrotta, pubblica i dati quando mettono in pausa o interrompono un video oppure quando l'app viene chiusa durante la riproduzione.
    4. Aggiornamenti della sezione Continua a guardare (se supportata): quando un utente rimuove un elemento dalla sezione Continua a guardare, rifletti la modifica pubblicando dati aggiornati.
    5. Completamento video:
      1. Per i film, rimuovi il film completato dalla sezione Continua a guardare. Se il film fa parte di una serie, aggiungi il film successivo per mantenere alto il coinvolgimento dell'utente.
      2. Per le puntate, rimuovi quella completata e aggiungi la successiva della serie, se disponibile, per incoraggiare la visione continuativa.

Codice di esempio

Questa app di esempio mostra come gli sviluppatori possono integrarsi con le API di rilevamento dei video per inviare dati utente personalizzati a Google. L'app di esempio mostra anche come creare un modulo comune che può essere importato nelle app mobile e TV, quando richiamare le API di pubblicazione ed eliminazione e come utilizzare i worker per richiamare le API di pubblicazione ed eliminazione.

Integrazione

AccountProfile

Per consentire un'esperienza personalizzata di "Continua a guardare" su Google TV, fornisci le informazioni dell'account e del profilo. Utilizza AccountProfile per fornire:

  1. ID account: un identificatore univoco che rappresenta l'account dell'utente all'interno della tua applicazione. Può trattarsi dell'ID account effettivo o di una versione offuscata in modo appropriato.

  2. ID profilo (facoltativo): se la tua applicazione supporta più profili all'interno di un singolo account, fornisci un identificatore univoco per il profilo utente specifico (di nuovo, reale o offuscato).

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

L'SDK ha definito entità diverse per rappresentare ogni tipo di elemento. Il cluster di continuazione supporta le seguenti entità:

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

Specifica gli URI e le immagini di copertina specifici della piattaforma per queste entità.

Inoltre, crea URI di riproduzione per ogni piattaforma, ad esempio Android TV, Android o iOS, se non l'hai ancora fatto. Pertanto, quando un utente continua a guardare su ogni piattaforma, l'app utilizza un URI di riproduzione mirato per riprodurre i contenuti 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)

Le immagini di copertina richiedono un URI e le dimensioni in pixel (altezza e larghezza). Prendi di mira diversi fattori di forma fornendo più immagini del poster, ma verifica che tutte le immagini mantengano proporzioni 16:9 e un'altezza minima di 200 pixel per la corretta visualizzazione dell'entità "Continua a guardare", in particolare all'interno di Entertainment Space di Google. Le immagini con un'altezza inferiore a 200 pixel potrebbero non essere mostrate.

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

Questo esempio mostra come creare un MovieEntity con tutti i campi obbligatori:

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

Fornire dettagli come generi e classificazioni dei contenuti consente a Google TV di mostrare i tuoi contenuti in modo più dinamico e di metterli in contatto con gli spettatori giusti.

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

Le entità rimangono disponibili automaticamente per 60 giorni, a meno che tu non specifichi un periodo di scadenza più breve. Imposta una scadenza personalizzata solo se vuoi che l'entità venga rimossa prima di questo periodo predefinito.

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

Questo esempio mostra come creare un TvEpisodeEntity con tutti i campi obbligatori:

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 stringa del numero di episodio (ad esempio "2") e la stringa del numero di stagione (ad esempio "1") verranno espanse nel formato corretto prima di essere visualizzate nella scheda Continua a guardare. Tieni presente che deve essere una stringa numerica, non inserire "e2", o "episodio 2", o "s1" o "stagione 1".

Se un determinato programma TV ha una sola stagione, imposta il numero della stagione su 1.

Per massimizzare le possibilità che gli spettatori trovino i tuoi contenuti su Google TV, valuta la possibilità di fornire dati aggiuntivi come generi, classificazioni dei contenuti e finestre temporali di disponibilità, in quanto questi dettagli possono migliorare le opzioni di visualizzazione e filtro.

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

Ecco un esempio di creazione di un VideoClipEntity con tutti i campi obbligatori.

VideoClipEntity rappresenta un clip generato dagli utenti, ad esempio un video di 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()

Puoi impostare facoltativamente il creatore, l'immagine del creatore, l'ora di creazione in millisecondi o la finestra temporale di disponibilità .

LiveStreamingVideoEntity

Ecco un esempio di creazione di un LiveStreamingVideoEntity con tutti i campi obbligatori.

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 vuoi, puoi impostare l'ora di inizio, l'emittente, l'icona dell'emittente o la finestra temporale di disponibilità per l'entità live streaming.

Per informazioni dettagliate su attributi e requisiti, consulta il Riferimento API.

Fornisci i dati del cluster di continuazione

AppEngagePublishClient è responsabile della pubblicazione del cluster Continua. Utilizzi il metodo publishContinuationCluster() per pubblicare un oggetto ContinuationCluster.

Innanzitutto, devi utilizzare isServiceAvailable() per verificare se il servizio è disponibile per l'integrazione.

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

Quando il servizio riceve la richiesta, vengono eseguite le seguenti azioni in una transazione:

  • I dati ContinuationCluster esistenti del partner sviluppatore vengono rimossi.
  • I dati della richiesta vengono analizzati e archiviati nel ContinuationCluster aggiornato.

In caso di errore, l'intera richiesta viene rifiutata e lo stato esistente viene mantenuto.

Le API di pubblicazione sono API upsert, ovvero sostituiscono i contenuti esistenti. Se devi aggiornare una specifica entità in ContinuationCluster, dovrai pubblicare di nuovo tutte le entità.

I dati ContinuationCluster devono essere forniti solo per gli account per adulti. Pubblica solo quando AccountProfile appartiene a un adulto.

Sincronizzazione cross-device

Il flag SyncAcrossDevices controlla se i dati ContinuationCluster di un utente vengono sincronizzati su dispositivi come TV, smartphone, tablet e così via. La sincronizzazione tra dispositivi è disattivata per impostazione predefinita.

Valori:

  • true: i dati ContinuationCluster vengono condivisi su tutti i dispositivi dell'utente per un'esperienza di visualizzazione senza interruzioni. Consigliamo vivamente questa opzione per la migliore esperienza cross-device.
  • false: I dati di ContinuationCluster sono limitati al dispositivo corrente.

L'applicazione multimediale deve fornire un'impostazione chiara per attivare/disattivare la sincronizzazione cross-device. Spiega i vantaggi per l'utente e memorizza la sua preferenza una sola volta e applicala di conseguenza in publishContinuationCluster.

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

Per sfruttare al meglio la nostra funzionalità cross-device, verifica che l'app ottenga il consenso dell'utente e attiva SyncAcrossDevices per true. Ciò consente ai contenuti di sincronizzarsi senza problemi su tutti i dispositivi, migliorando l'esperienza utente e aumentando il coinvolgimento. Ad esempio, un partner che ha implementato questa funzionalità ha registrato un aumento del 40% dei clic su "Continua a guardare" perché i suoi contenuti sono stati visualizzati su più dispositivi.

Eliminare i dati di Video discovery

Per eliminare manualmente i dati di un utente dal server Google TV prima del periodo di conservazione standard di 60 giorni, utilizza il metodo client.deleteClusters(). Una volta ricevuta la richiesta, il servizio eliminerà tutti i dati esistenti di scoperta dei video per il profilo dell'account o per l'intero account.

L'enumerazione DeleteReason definisce il motivo dell'eliminazione dei dati. Il seguente codice rimuove i dati di Continua a guardare al momento della disconnessione.


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

Test

Utilizza l'app di verifica per verificare che l'integrazione dell'SDK Engage funzioni correttamente. L'app di verifica fornisce strumenti per aiutarti a verificare i tuoi dati e confermare che gli intent di trasmissione vengano gestiti correttamente.

Dopo aver richiamato l'API di pubblicazione, verifica che i dati vengano pubblicati correttamente controllando l'app di verifica. Il cluster di continuazione deve essere visualizzato come riga distinta nell'interfaccia dell'app.

  • Imposta Engage Service Flag solo per le build non di produzione nel file manifest Android della tua app.
  • Installa e apri l'app Engage Verify.
  • Se isServiceAvailable è false, fai clic sul pulsante "Attiva/Disattiva" per attivarlo.
  • Inserisci il nome del pacchetto della tua app per visualizzare automaticamente i dati pubblicati una volta che inizi la pubblicazione.
  • Testa queste azioni nella tua app:
    • Accedi.
    • Passa da un profilo all'altro(se applicabile).
    • Avvia, metti in pausa un video o torna alla home page.
    • Chiudi l'app durante la riproduzione del video.
    • Rimuovere un elemento dalla riga "Continua a guardare" (se supportata).
  • Dopo ogni azione, verifica che la tua app abbia richiamato l'API publishContinuationClusters e che i dati vengano visualizzati correttamente nell'app di verifica.
  • L'app di verifica mostrerà un segno di spunta verde "Tutto a posto" per le entità implementate correttamente.

    Screenshot della verifica riuscita dell&#39;app
    Figura 1. Verifica app riuscita
  • L'app di verifica segnalerà eventuali entità problematiche.

    Screenshot dell&#39;errore dell&#39;app di verifica
    Figura 2. Errore dell'app di verifica
  • Per risolvere i problemi relativi alle entità con errori, utilizza il telecomando della TV per selezionare e fare clic sull'entità nell'app di verifica. I problemi specifici verranno visualizzati ed evidenziati in rosso per la tua revisione (vedi l'esempio di seguito).

    Dettagli sull&#39;errore dell&#39;app di verifica
    Figura 3. Dettagli errore app di verifica

API REST

L'SDK Engage offre un'API REST per fornire un'esperienza coerente di continua visione su piattaforme non Android come iOS e Roku TV. L'API consente agli sviluppatori di aggiornare lo stato "Continua a guardare" per gli utenti che hanno attivato le piattaforme non Android.

Prerequisiti

  • Devi prima completare l'integrazione basata sull'SDK Engage on-device. Questo passaggio fondamentale stabilisce l'associazione necessaria tra l'ID utente di Google e il AccountProfile della tua app.
  • Accesso e autenticazione API: per visualizzare e abilitare l'API nel tuo progetto Google Cloud, devi superare un processo di allowlist. Tutte le richieste API richiedono l'autenticazione.

Ottenere l'accesso

Per ottenere l'accesso per visualizzare e attivare l'API nella console Google Cloud, il tuo account deve essere registrato.

  1. L'ID cliente Google Workspace deve essere disponibile. Se non è disponibile, potresti dover configurare Google Workspace e tutti gli Account Google che vuoi utilizzare per chiamare l'API.
  2. Configura un account con Google Cloud Console utilizzando un indirizzo email associato a Google Workspace.
  3. Creare un nuovo progetto
  4. Crea un service account per l'autenticazione API. Una volta creato il service account, avrai due elementi:
    • Un ID service account.
    • Un file JSON con la chiave dell'account di servizio. Conserva questo file in modo sicuro, ti servirà in un secondo momento per autenticare il client nell'API.
  5. Workspace e gli Account Google associati ora possono utilizzare le API REST. Una volta propagata la modifica, riceverai una notifica che ti comunicherà se l'API è pronta per essere chiamata dai tuoi service account.
  6. Segui questi passaggi per prepararti a effettuare una chiamata API delegata.

Pubblica cluster di continuazione

Per pubblicare i dati di scoperta dei video, esegui una richiesta POST all'API publishContinuationCluster utilizzando la seguente sintassi.

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

Dove:

  • package_name: Il nome del pacchetto del fornitore di contenuti multimediali
  • accountId: l'ID univoco dell'account dell'utente nel tuo sistema. Deve corrispondere a accountId utilizzato nel percorso sul dispositivo.
  • profileId: l'ID univoco del profilo dell'utente all'interno dell'account nel tuo sistema. Deve corrispondere a profileId utilizzato nel percorso sul dispositivo.

L'URL dell'account senza profilo è:

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

Il payload della richiesta è rappresentato nel campo entities. entities rappresenta un elenco di entità di contenuti che possono essere MovieEntity o TVEpisodeEntity. Questo campo è obbligatorio.

Corpo della richiesta

Field

Tipo

Obbligatorio

Descrizione

entità

Elenco di oggetti MediaEntity

Elenco delle entità di contenuti (max. 5), verranno conservate solo le prime cinque e le altre verranno eliminate. È consentito un elenco vuoto per indicare che l'utente ha terminato di guardare tutte le entità.

Il campo entities contiene movieEntity e tvEpisodeEntity individuali.

Field

Tipo

Obbligatorio

Descrizione

movieEntity

MovieEntity

Un oggetto che rappresenta un film all'interno di ContinuationCluster.

tvEpisodeEntity

TvEpisodeEntity

Un oggetto che rappresenta una puntata di una serie TV all'interno di ContinuationCluster.

Ogni oggetto nell'array di entità deve essere uno dei tipi MediaEntity disponibili, ovvero MovieEntity e TvEpisodeEntity, insieme ai campi comuni e specifici per il tipo.

Lo snippet di codice riportato di seguito mostra il payload del corpo della richiesta per l'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"
      }
    }
  ]
}

Eliminare i dati degli annunci video discovery

Utilizza l'API clearClusters per rimuovere i dati di rilevamento dei video.

Utilizza l'URL POST per rimuovere le entità dai dati di scoperta dei video. Per eliminare i dati del cluster di continuazione, esegui una richiesta POST all'API clearClusters utilizzando la seguente sintassi.

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

Dove:

  • package_name: il nome del pacchetto del fornitore di contenuti multimediali.
  • accountId: l'ID univoco dell'account dell'utente nel tuo sistema. Deve corrispondere a accountId utilizzato nel percorso sul dispositivo.
  • profileId: l'ID univoco del profilo dell'utente all'interno dell'account nel tuo sistema. Deve corrispondere a profileId utilizzato nel percorso sul dispositivo.

Il payload dell'API clearClusters contiene un solo campo, reason, che contiene un DeleteReason che specifica il motivo della rimozione dei dati.

{
  "reason": "DELETE_REASON_LOSS_OF_CONSENT"
}

Test

Dopo aver pubblicato correttamente i dati, utilizza un account di test utente per verificare che i contenuti previsti vengano visualizzati nella riga "Continua a guardare" sulle piattaforme Google di destinazione, come Google TV e le app mobile Google TV per Android e iOS.

Durante i test, consenti un ritardo di propagazione ragionevole di pochi minuti e rispetta i requisiti di visualizzazione, ad esempio la visione di una parte di un film o il completamento di un episodio. Per ulteriori dettagli, consulta le linee guida di Cosa guardare per gli sviluppatori di app.

Scarica

Prima di scaricare, devi accettare i seguenti Termini e condizioni.

Termini e condizioni

Questo è il Contratto di licenza del Software Development Kit di Android

1. Introduzione

1.1 Il Software Development Kit di Android (indicato nel Contratto di licenza come "SDK" e che include nello specifico i file di sistema Android, le API in pacchetto e i componenti aggiuntivi delle API di Google) è concesso in licenza all'utente in conformità ai termini del Contratto di licenza. Il Contratto di licenza costituisce un contratto legalmente vincolante tra te e Google in relazione al tuo utilizzo dell'SDK. 1.2 Per "Android" si intende lo stack software per dispositivi di Android, reso disponibile nell'ambito del Progetto open source Android, disponibile al seguente URL: https://source.android.com/, di volta in volta aggiornato. 1.3 Per "implementazione compatibile" si intende qualsiasi dispositivo Android (i) conforme al documento relativo alla Definizione di compatibilità Android, disponibile sul sito web per la compatibilità Android (https://source.android.com/compatibility) e che potrebbe essere aggiornato di tanto in tanto; e (ii) supera con successo il Compatibility Test Suite (CTS) Android. 1.4 Per "Google" si intende Google LLC, organizzata secondo le leggi dello Stato del Delaware, Stati Uniti, e opera ai sensi delle leggi degli Stati Uniti, con sede principale dell'attività all'indirizzo 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA.

2. Accettazione del presente Contratto di licenza

2.1 Per poter utilizzare l'SDK, deve accettare il Contratto di licenza. Se non accetti il Contratto di licenza, non potrai utilizzare l'SDK. 2.2 Facendo clic per accettare e/o utilizzare questo SDK, l'utente accetta i termini del Contratto di licenza. 2.3 L'utente non può utilizzare l'SDK e non può accettare il Contratto di licenza se gli è vietato ricevere l'SDK ai sensi delle leggi degli Stati Uniti o di altri paesi, compreso il paese in cui risiede o da cui utilizza l'SDK. 2.4 Se accetta di essere vincolato dal Contratto di licenza per conto del proprio datore di lavoro o altra persona giuridica, l'utente dichiara e garantisce di disporre della piena autorità legale per vincolare il proprio datore di lavoro o tale persona giuridica al Contratto di licenza. Qualora non disponga di tale autorità, non può accettare il Contratto di licenza o utilizzare l'SDK per conto del proprio datore di lavoro o altra persona giuridica.

3. Licenza SDK da Google

3.1 Ai sensi dei termini del Contratto di licenza, Google concede all'utente una licenza limitata, mondiale, esente da royalty, non cedibile, non esclusiva e non cedibile in sublicenza per utilizzare l'SDK esclusivamente per sviluppare applicazioni per implementazioni compatibili di Android. 3.2 Non può utilizzare questo SDK per sviluppare applicazioni per altre piattaforme (incluse implementazioni non compatibili di Android) o per sviluppare un altro SDK. L'utente è ovviamente libero di sviluppare applicazioni per altre piattaforme, comprese le implementazioni non compatibili di Android, purché l'SDK non venga utilizzato a tale scopo. 3.3 L'utente accetta che Google o terze parti possiedano tutti i diritti, i titoli e gli interessi legali relativi all'SDK, compresi i Diritti di proprietà intellettuale esistenti nell'SDK. Per "Diritti di proprietà intellettuale" si intendono tutti i diritti ai sensi delle norme sui brevetti, sul copyright, sui segreti industriali, sui marchi e qualsiasi altro diritto di proprietà. Google si riserva tutti i diritti non concessi esplicitamente all'utente. 3.4 L'utente non può utilizzare l'SDK per scopi non espressamente consentiti dal Contratto di licenza. Salvo nella misura richiesta dalle licenze di terze parti applicabili, l'utente non può copiare (tranne per scopi di backup), modificare, adattare, ridistribuire, decompilare, decodificare, disassemblare o creare opere derivate dell'SDK o di qualsiasi parte dell'SDK. 3.5 L'utilizzo, la riproduzione e la distribuzione di componenti dell'SDK concessi ai sensi di una licenza software open source sono regolati unicamente dai termini di tale licenza software open source e non dal Contratto di licenza. 3.6 L'utente accetta che la forma e la natura dell'SDK fornito da Google possano cambiare senza preavviso e che le versioni future dell'SDK possano essere incompatibili con applicazioni sviluppate in versioni precedenti dell'SDK. Accetti che Google possa interrompere (definitivamente o temporaneamente) la fornitura dell'SDK (o di qualsiasi funzionalità all'interno dell'SDK) a te o agli utenti in generale a esclusiva discrezione di Google e senza preavviso. 3.7 Nulla nel Contratto di licenza concede all'utente il diritto di utilizzare i nomi commerciali, i marchi, i marchi di servizio, i loghi, i nomi di dominio e altri elementi distintivi del brand di Google. 3.8 L'utente accetta di non rimuovere, oscurare o alterare qualsiasi informazione sui diritti proprietari (incluse quelle su copyright e marchi) che potrebbe essere applicata o contenuta nell'SDK.

4. Utilizzo dell'SDK da parte dello Sviluppatore

4.1 Google accetta di non ottenere alcun diritto, titolo o interesse dall'utente (o dai suoi concessori di licenza) ai sensi del Contratto di licenza in o in qualsiasi applicazione software che lei sviluppa utilizzando l'SDK, compresi eventuali diritti di proprietà intellettuale su tali applicazioni. 4.2 L'utente accetta di utilizzare l'SDK e di scrivere applicazioni solo per le finalità consentite (a) dal Contratto di licenza e (b) da qualsiasi legge o regolamento vigente, nonché da qualsiasi pratica o linea guida generalmente accettata nelle giurisdizioni di competenza (incluse le leggi relative all'esportazione di dati o software da e verso gli Stati Uniti o altri paesi pertinenti). 4.3 L'utente accetta di proteggere la privacy e i diritti legali di tali utenti se utilizza l'SDK per sviluppare applicazioni per utenti pubblici. Se gli utenti forniscono nomi utente, password o altre informazioni di accesso o di tipo privato, l'utente è tenuto a informarli che tali informazioni saranno disponibili nella sua applicazione; egli è inoltre tenuto a fornire a tali utenti un'informativa sulla privacy legalmente valida e una protezione appropriata. Se la sua applicazione memorizza informazioni personali o sensibili fornite dagli utenti, deve farlo in modo sicuro. Se l'utente fornisce all'applicazione i dati dell'account Google, quest'ultima potrà utilizzare tali informazioni per accedere all'account Google solo quando e per gli scopi limitati per i quali l'utente ha concesso l'autorizzazione a farlo. 4.4 L'utente accetta di non intraprendere alcuna attività con l'SDK, compreso lo sviluppo o la distribuzione di un'applicazione, che interferisca, disturbi, danneggi o acceda in alcun modo non autorizzato a proprietà di terze parti, a server, reti o ad altre comunicazioni mobili, compresi server, reti o altri operatori, ma non intraprenderà alcuna attività con l'SDK, compreso lo sviluppo o la distribuzione di un'applicazione. 4.5 L'utente accetta di essere l'unico responsabile (ed esonera Google da qualsiasi responsabilità nei suoi confronti o nei confronti di terze parti) di qualsiasi dato, contenuto o risorsa creata, trasmessa o visualizzata tramite Android e/o applicazioni per Android, nonché delle conseguenze delle proprie azioni (compresi eventuali danni o perdite subiti da Google) in questo modo. 4.6 L'utente accetta di essere l'unico soggetto responsabile (e che Google non ha alcuna responsabilità nei suoi confronti o nei suoi confronti)

5. Credenziali dello Sviluppatore

5.1 L'utente accetta di essere responsabile di mantenere la riservatezza delle credenziali dello sviluppatore che possono essergli fornite da Google o che possono scegliere personalmente, nonché di essere l'unico responsabile di tutte le applicazioni sviluppate con le credenziali dello sviluppatore.

6. Privacy e informazioni

6.1 Per poter continuare a innovare e migliorare l'SDK, Google potrebbe raccogliere dal software alcune statistiche sull'utilizzo, inclusi, a titolo esemplificativo, identificatore univoco, indirizzo IP associato, numero di versione del software e informazioni sugli strumenti e/o servizi utilizzati nell'SDK e sulla relativa modalità di utilizzo. Prima che una qualsiasi di queste informazioni venga raccolta, l'SDK ti invierà una notifica e richiederà il tuo consenso. Se neghi il consenso, le informazioni non verranno raccolte. 6.2 I dati raccolti vengono esaminati nel complesso per migliorare l'SDK e vengono gestiti nel rispetto delle Norme sulla privacy di Google, consultabili al seguente URL: https://policies.google.com/privacy 6.3 Set di dati anonimizzati e aggregati di dati possono essere condivisi con i partner di Google per migliorare l'SDK.

7. Applicazioni di terze parti

7.1 Se l'utente utilizza l'SDK per eseguire applicazioni sviluppate da una terza parte o che accedono a dati, contenuti o risorse forniti da una terza parte, accetta che Google non sia responsabile di tali applicazioni, dati, contenuti o risorse. L'utente accetta che per tutti i dati, i contenuti o le risorse a cui può accedere tramite applicazioni di terze parti, il solo responsabile è la persona da cui tali contenuti hanno avuto origine e che Google non si assume alcuna responsabilità in caso di perdite o danni che potrebbero verificarsi a seguito dell'utilizzo di uno di questi dati, contenuti, applicazioni o risorse di terze parti o dell'accesso agli stessi. 7.2 L'utente deve sapere che i dati, i contenuti e le risorse presentati tramite un'applicazione di terze parti potrebbero essere protetti da diritti di proprietà intellettuale detenuti dai fornitori (o da altre persone o azienda per loro conto). L'utente non può modificare, noleggiare, cedere in leasing, prestare, vendere, distribuire o creare opere derivate sulla base di questi dati, contenuti o risorse (in parte o per intero) a meno che l'utente sia stato espressamente autorizzato a farlo da parte dei proprietari interessati. 7.3 L'utente riconosce che l'utilizzo di applicazioni, dati, contenuti o risorse di terze parti potrebbe essere soggetto ad altri termini e condizioni che regolano il rapporto tra l'utente e la terza parte in questione. In tal caso, il Contratto di licenza non influirà sul rapporto giuridico dell'utente con tali terze parti.

8. Utilizzo delle API Android

8.1 API di dati di Google 8.1.1 Se l'utente utilizza un'API per recuperare i dati da Google, riconosce che i dati possono essere protetti da diritti di proprietà intellettuale di proprietà di Google o dei soggetti che li forniscono (o di altre persone o aziende per loro conto). L'utilizzo di tali API potrebbe essere soggetto a Termini di servizio aggiuntivi. L'utente non può modificare, noleggiare, cedere in leasing, prestare, vendere, distribuire o creare opere derivate sulla base di questi dati (in parte o per intero) a meno che l'utente sia stato espressamente autorizzato a farlo dai relativi termini di servizio. 8.1.2 Se l'utente utilizza un'API per recuperare i dati di un utente da Google, riconosce e accetta che potrà recuperare i dati solo con il consenso esplicito dell'utente e solo quando e per le finalità limitate per cui l'utente ha concesso l'autorizzazione a farlo. Se l'utente utilizza l'API Android Recognition Service, documentata al seguente URL: https://developer.android.com/reference/data responsabile, che è stato aggiornato all'app Google Cloud, come Se fai clic per accettare, accetti i termini dell'Addendum per il trattamento dei dati per i Prodotti per i quali Google è un Responsabile del trattamento dei dati.

9. Risoluzione del Contratto di licenza

9.1 Il Contratto di licenza continuerà a essere valido fino alla risoluzione da parte tua o di Google come indicato di seguito. 9.2 L'utente può risolvere il Contratto di licenza interrompendo l'utilizzo dell'SDK e di tutte le credenziali dello sviluppatore pertinenti. 9.3 Google può risolvere in qualsiasi momento il Contratto di licenza con l'utente se: (A) l'utente ha violato una qualsiasi disposizione del Contratto di licenza; o (B) Google è tenuta a farlo per legge; o (C) il partner con cui Google ha offerto determinate parti dell'SDK (come le API) all'utente ha terminato il suo rapporto con Google o se ha cessato di offrire a sua esclusiva parti dell'SDK determinate parti dell'SDK o di cui l'utente decide a sua discrezione di non utilizzare più a sua discrezione determinate parti dell'SDK o di non 9.4 Al termine del Contratto di licenza, tutti i diritti, le obbligazioni e le responsabilità legali di cui tu e Google avete beneficiato, a cui siete stati soggetti (o che sono maturati nel tempo durante il periodo di validità del Contratto di licenza) o che sono stati espressamente dichiarati per durare a tempo indeterminato, non saranno interessati da questa cessazione e le disposizioni del paragrafo 14.7 continueranno a essere applicate a tali diritti, obbligazioni e responsabilità a tempo indeterminato.

10. ESCLUSIONE DI GARANZIE

10.1 L'UTENTE RICONOSCE E ACCETTA ESPRESSAMENTE CHE L'UTILIZZO DELL'SDK È A SUO ESCLUSIVO RISCHIO E CHE L'SDK VIENE FORNITO "COSÌ COM'È" E "COME DISPONIBILE", SENZA ALCUNA GARANZIA DI ALCUN TIPO DA GOOGLE. 10.2 L'UTILIZZO DELL'SDK E DI QUALSIASI MATERIALE SCARICATO O IN ALTRO TIPO OTTENUTO ATTRAVERSO L'UTILIZZO DELL'SDK È A PROPRIA DISCREZIONE E RISCHIO E L'UTENTE È L'UNICO RESPONSABILE DI QUALSIASI DANNO AL SISTEMA DEL COMPUTER O DA ALTRO DISPOSITIVO O DELLA PERDITA DI DATI. 10.3 GOOGLE LIMITA INOLTRE ESPRESSAMENTE OGNI GARANZIA E CONDIZIONE ESPLICITA O IMPLICITA COMPRESE, A TITOLO ESEMPLIFICATIVO, LE GARANZIE E LE CONDIZIONI IMPLICITE DI COMMERCIABILITÀ, IDONEITÀ PER UN FINE PARTICOLARE E NON VIOLAZIONE DI DIRITTI ALTRUI.

11. LIMITAZIONE DI RESPONSABILITÀ

11.1 L'UTENTE RICONOSCE E ACCETTA CHE GOOGLE, LE PROPRIE CONSOCIATE E AFFILIATE E I SUOI LICENZIATARI NON SARANNO RESPONSABILI NEI CONFRONTI DELL'UTENTE AI SENSI DI QUALSIASI TEORIA DI RESPONSABILITÀ PER DANNI DIRETTI, INDIRETTI, INCIDENTALI, SPECIALI, CONSEQUENZIALI O ESEMPLARI

12. Indennizzo

12.1 Nella misura massima consentita dalla legge, l'utente accetta di difendere, indennizzare e tenere indenne Google, le sue società consociate e i rispettivi dirigenti, funzionari, dipendenti e agenti da e contro qualsiasi reclamo, azione, causa o procedimento, nonché qualsiasi perdita, responsabilità, danno, costo e spesa (inclusi eventuali diritti d'autore o spese legali derivanti da qualsiasi altro patto di copyright o applicazione del copyright da parte dell'utente, da qualsiasi altro diritto commerciale o da parte dell'utente che violi o accumuli diritti di copyright o commercializzati da parte dell'utente;

13. Modifiche al Contratto di licenza

13.1 Google potrebbe apportare modifiche al Contratto di licenza durante la distribuzione di nuove versioni dell'SDK. Qualora vengano apportate tali modifiche, Google renderà disponibile una nuova versione del Contratto di licenza sul sito web in cui viene reso disponibile l'SDK. 14.1 Il Contratto di licenza costituisce l'intero contratto legale tra l'utente e Google, regola il suo utilizzo dell'SDK (esclusi eventuali servizi che Google potrebbe fornire all'utente ai sensi di un accordo scritto separato) e sostituisce completamente qualsiasi precedente contratto stipulato tra l'utente e Google in relazione all'SDK. 14.2 L'utente accetta che qualora Google non eserciti o faccia valere alcun diritto legale o rimedio contenuto nel Contratto di licenza (o di cui Google ha il beneficio ai sensi di qualsiasi legge vigente), questo non sarà considerato una rinuncia formale dei diritti di Google e che quei diritti o rimedi saranno ancora disponibili per Google. 14.3 Se qualsiasi tribunale di competente giurisdizione su questa materia stabilisce che una disposizione del Contratto di licenza non è valida, tale disposizione verrà rimossa dal Contratto di licenza senza inficiare il resto del Contratto di licenza. Le restanti disposizioni del Contratto di licenza continueranno a essere valide e applicabili. 14.4 L'utente riconosce e accetta che ciascun membro del gruppo di società di cui Google è la capogruppo sarà beneficiario terzo del Contratto di licenza e che tali altre società avranno diritto di applicare direttamente e fare affidamento su qualsiasi clausola del Contratto che conferisce un beneficio a (o diritti a favore di) queste. All'infuori di esse, nessun'altra persona o azienda sarà beneficiaria terza del Contratto di licenza. 14.5 LIMITAZIONI SULLE ESPORTAZIONI. L'SDK È SOGGETTO ALLE LEGGI E ALLE NORMATIVE DI ESPORTAZIONE DEGLI STATI UNITI. L'UTENTE È NECESSARIO RISPETTARE TUTTE LE LEGGI E LE NORMATIVE DI ESPORTAZIONE NAZIONALI E INTERNAZIONALI APPLICABILI ALL'SDK. QUESTE LEGGI COMPRENDONO LIMITAZIONI PER DESTINAZIONI, UTENTI FINALI E UTILIZZO FINALE. 14.6 I diritti concessi dal Contratto di licenza non possono essere assegnati o trasferiti da te o da Google senza previa approvazione scritta dell'altra parte. Né tu né Google sarete autorizzati a delegare i vostri obblighi o responsabilità ai sensi del Contratto di licenza senza previa approvazione scritta dell'altra parte. 14.7 Il Contratto di licenza e il rapporto tra l'utente e Google stabilito dal Contratto di licenza saranno regolati dalle leggi dello Stato della California, senza considerare le norme di diritto internazionale privato. Tu e Google accettate di sottoporvi all'esclusiva giurisdizione dei tribunali della contea di Santa Clara, California, per la risoluzione di qualsiasi questione legale derivante dal Contratto di licenza. Nonostante ciò, lei accetta che Google sia ancora autorizzata a richiedere provvedimenti ingiuntivi (o un tipo equivalente di provvedimento d'urgenza) in qualsiasi giurisdizione. 27 luglio 2021
Scarica

verify_app_multiplatform_public_20250602.apk