Implementar una resolución de contenido personalizada

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

Cuando TVSDK genera una nueva oportunidad, se repite a través de los solucionadores de contenido registrados que buscan uno que sea capaz de resolver esa oportunidad. El primero que devuelve true está seleccionado 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, la resolución de contenido es responsable de notificar a TVSDK cuando el proceso ha finalizado.

  1. Implemente su propio ContentFactory personalizado, ampliando la interfaz ContentFactory y anulando retrieveResolvers.

    Por ejemplo:

    class MyContentFactory extends ContentFactory {
        @Override
        public List<ContentResolver> retrieveResolvers(MediaPlayerItem item) {
            List<ContentResolver> resolvers = new ArrayList<ContentResolver>();
            MediaPlayerItemConfig itemConfig = item.getConfig();
            if(itemConfig) {
                CustomRangeMetadata customRanges = itemConfig.getCustomRangeMetadata();
                if (customRanges) {
                    List<ReplaceTimeRange> timeRanges = customRanges.getTimeRangeList();
    
                    if (timeRanges && timeRanges.size() > 0)
                    {
                    // CustomRangeResolver is only activated by the presence of CustomRanges in configuration
                    resolvers.add(new CustomRangeResolver());
                    }
                }
                AdvertisingMetadata metadata = itemConfig.getAdvertisingMetadata();
                if (metadata) {
                    if (metadata instanceOf AuditudeSettings)
                        resolvers.add(new AuditudeResolver(getContext());
                    }
                }
            // add your custom resolver if any
            resolvers.add(MyOpportunityGenerator(item));
            return resolvers;
        }
        ...
    }
    
  2. Registre el ContentFactory en el MediaPlayer.

    Por ejemplo:

    //Register the custom content factory with the media player
    MediaPlayerItemConfig config = new MediaPlayerItemConfig();
    config.setAdvertisingFactory(new MyContentFactory());
    
    //Pass this config while loading the resource
    mediaPlayer.replaceCurrentResource(resource, config);
    
    // OR use MediaPlayerItemLoader to pre-load a resource
    id = 23;
    itemLoader.load(resource, id, config);
    
  3. Pase un objeto AdvertisingMetadata a TVSDK de la siguiente manera:

    1. Cree un objeto AdvertisingMetadata.

    2. Guarde el objeto AdvertisingMetadata en MediaPlayerItemConfig.

      AdvertisingMetadata advertisingMetadata = new AdvertisingMetadata();
      
      advertisingMetadata.setDelayAdLoading(true);
      ...
      
      mediaPlayerItemConfig.setAdvertisingMetadata(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 doConfigure, doCanResolve, doResolve, doCleanup:

      void doConfigure(MediaPlayerItem item);
      boolean doCanResolve(Opportunity opportunity);
      void doResolve(Opportunity opportunity);
      void doCleanup();
      

      Obtiene su advertisingMetadata del elemento pasado en doConfigure:

      MediaPlayerItemConfig itemConfig = item.getConfig();
      
      AdvertisingMetadata advertisingMetadata =
        mediaPlayerItemConfig.getAdvertisingMetadata();
      
    2. Para cada oportunidad de colocación, cree un List<TimelineOperation>.

      Este ejemplo TimelineOperation proporciona una estructura para AdBreakPlacement:

      AdBreakPlacement(
          new AdBreak( ads,    // Vector<Ad>
                       tracker // Content Tracker
          ),
          placementInformation // Retrieved from Opportunity
      );
      
    3. Una vez resueltos los anuncios, llame a una de las siguientes funciones:

      • Si la resolución del anuncio se realiza correctamente, llame a process(List<TimelineOperation> proposals) y notifyCompleted(Opportunity opportunity) en el ContentResolverClient

        _client.process(timelineOperations);
        _client.notifyCompleted(opportunity);
        
      • Si la resolución del anuncio falla, llame a notifyResolveError en el ContentResolverClient

        _client.notifyFailed(Opportunity opportunity, PSDKErrorCode error);
        

        Por ejemplo:

        _client.notifyFailed(opportunity, UNSUPPORTED_OPERATION);
        

Este solucionador de anuncios personalizado de ejemplo resuelve una oportunidad y proporciona un anuncio simple:

public class CustomContentResolver extends ContentResolver {
    protected void doConfigure(MediaPlayerItem item){}

    protected boolean doCanResolve(Opportunity opportunity) {
        return true;
    }

    protected void doResolve(Opportunity opportunity) {
        _client.process(createAdBreakPlacementsFor(opportunity.getPlacement()));
        _client.notifyCompleted(opportunity);
    }

    private List<TimelineOperation> createAdBreakPlacementsFor(Placement placementInformation) {
        List<Ad> ads = new ArrayList<Ad>();
        AdAsset adAsset = new AdAsset("101", 15000, new MediaResource(
          "https: . . ..m3u8", MediaResource.Type.HLS, null), null, null);

        Ad ad = Ad.linearFromAsset("101", adAsset, null, null, false);
        ads.add(ad);
        AdBreak adBreak = new AdBreak(ads, null, AdInsertionType.CLIENT_INSERTED);

        List<TimelineOperation> result = new ArrayList<TimelineOperation>();

        result.add(new AdBreakPlacement(placementInformation, adBreak));
        return result;
    }

    protected void doCleanup() {}
}

En esta página