Implementar una resolución de contenido personalizada

Puede implementar sus propios resolvedores de contenido en función de los resolvedores predeterminados.

Cuando TVSDK detecta una nueva oportunidad, se repite a través de los solucionadores de contenido registrados buscando una que sea capaz de resolver esa oportunidad. El primero que devuelve true se selecciona para resolver la oportunidad. Si no se puede resolver ningún contenido, se omite esa oportunidad. Dado que el proceso de resolución de contenido suele ser asíncrono, el gestor de contenido es responsable de notificar cuándo se ha completado el proceso.

  1. Cree una instancia personalizada AdvertisingFactory y reemplace createContentResolver.

    Por ejemplo:

    new AdvertisingFactory() {
        ...
        @Override
        public ContentResolver createContentResolver(MediaPlayerItem item) {
            Metadata metadata = _mediaPlayer.getCurrentItem().getResource().getMetadata();
            if (metadata != null) {
                if (metadata.containsKey(DefaultMetadataKeys.AUDITUDE_METADATA_KEY.getValue())) {
                    return new AuditudeResolver(getActivity().getApplicationContext());
                } else if (metadata.containsKey(DefaultMetadataKeys.JSON_METADATA_KEY.getValue())) {
                    return new MetadataResolver();
                } else if (metadata.containsKey(DefaultMetadataKeys.TIME_RANGES_METADATA_KEY.getValue())) {
                    return new CustomAdMarkersContentResolver();
                } else if (metadata.containsKey(CustomAdResolver.CUSTOM_METADATA_KEY)) {
                    return new CustomAdResolver();
                }
            }
            return null;
        }
        ...
    }
    
  2. Registre la fábrica del cliente de publicidad en MediaPlayer.

    Por ejemplo:

    // register the custom advertising factory with media player
    advertisingFactory = createCustomAdvertisingFactory();
    mediaPlayer.registerAdClientFactory(advertisingFactory);
    
  3. Pase un objeto AdvertisingMetadata a TVSDK de la siguiente manera:

    1. Cree un objeto AdvertisingMetadata y un objeto MetadataNode.
    2. Guarde el objeto AdvertisingMetadata en MetadataNode.
    MetadataNode result = new MetadataNode();
    result.setNode(DefaultMetadataKeys.ADVERTISING_METADATA.getValue(),
                   advertisingMetadata);
    
  4. Cree una clase de resolución de anuncios personalizada que amplíe la clase ContentResolver.

    1. En la resolución de anuncios personalizada, anule esta función protegida:

      void doResolveAds(Metadata metadata,
                        PlacementOpportunity placementOpportunity)
      

      Los metadatos contienen su AdvertisingMetada. Utilícelo para la siguiente generación de vectores TimelineOperation.

    2. Para cada oportunidad de colocación, cree un Vector<TimelineOperation>.

      El vector puede estar vacío, pero no nulo.

      Este ejemplo TimelineOperation proporciona una estructura para AdBreakPlacement:

      AdBreakPlacement(AdBreak.createAdBreak(
                                ads,       // Vector<Ad>
                                time,      // Ad Break start time. Note: local time on the timeline
                                duration,  // Ad Break duration
                                tag()      // An arbitrary string value that can be attached to
                                           // the AdBreak object.
                               ), placementInformation  // Retrieved from PlacementOpportunity
      )
      
    3. Una vez resueltos los anuncios, llame a una de las siguientes funciones:

      • Si la resolución del anuncio se realiza correctamente: notifyResolveComplete(Vector<TimelineOperation> proposals)
      • Si la resolución del anuncio falla: notifyResolveError(Error error)

      Por ejemplo, si falla:

      Metadata metadata = new MetadataNode();
      metadata.setValue("NATIVE_ERROR_CODE", exception.getCause().toString());
      error.setMetadata(metadata);
      

Este solucionador de anuncios personalizado de ejemplo realiza una solicitud HTTP al servidor de publicidad y recibe una respuesta JSON.

public class CustomAdResolver extends ContentResolver {
    ...
    @Override
    protected void doResolveAds(Metadata metadata, PlacementOpportunity placementOpportunity) {
        ...
        if (resolveSuccess == true) {
            notifyResolveComplete(Vector<TimelineOperation> proposals);
        }
        else {
            notifyResolveError(Error error);
        }
    }
    ...
}

Ejemplo de respuesta del servidor de publicidad JSON para un flujo en directo:

{
    "response": {
        "breaks": [ {
            "start": 0,
            "ads": [ {
                "id": 1001,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/geico/playlist.m3u8",
                    "duration": 30000,
                    "id": "asset1",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            }
        ] },
        {
            "start": -1,
            "ads": [ {
                "id": 1003,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/priceline/playlist.m3u8",
                    "duration": 30000,
                    "id": "asset3",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            } ]
        } ]
    }
}

Ejemplo de respuesta de servidor de publicidad JSON para VOD:

{
    "response": {
        "breaks": [ {
            "start": 0,
            "ads": [ {
                "id": 1001,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/geico/playlist.m3u8",
                    "duration": 30000,
                    "id": "asset1",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            },
            {
                "id": 1002,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/crescent/playlist.m3u8",
                    "duration": 15000,
                    "id": "asset2",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            } ]
        },
        {
            "start": 50000,
            "ads": [ {
                "id": 1003,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/priceline/playlist.m3u8",
                    "duration": 30000,
                    "id": "asset3",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            } ]
        },
        {
            "start": 100000000,
            "ads": [ {
                "id": 1004,
                "primary_asset": {
                    "url": "https://venkat-test.s3.amazonaws.com/ads/camry/playlist.m3u8",
                    "duration": 15000,
                    "id": "asset4",
                    "resource_type": ""
                },
                "companion_assets": {
                }
            } ]
        } ]
    }
}

En esta página