Puede implementar sus propias resoluciones de contenido en función de las resoluciones predeterminadas.
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
se selecciona para resolver la oportunidad. Si no hay ningún solucionador de contenido capaz, se omite esa oportunidad. Dado que el proceso de resolución de contenido suele ser asincrónico, el gestor de contenido es responsable de notificar a TVSDK cuando el proceso se haya completado.
Implemente su propia aplicación personalizada ContentFactory
, ampliando el ContentFactory
interfaz y anulación 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;
}
...
}
Registre el ContentFactory
a la 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);
Pase un AdvertisingMetadata
para TVSDK como se indica a continuación:
Crear un AdvertisingMetadata
objeto.
Guarde el AdvertisingMetadata
objeto a MediaPlayerItemConfig
.
AdvertisingMetadata advertisingMetadata = new AdvertisingMetadata();
advertisingMetadata.setDelayAdLoading(true);
...
mediaPlayerItemConfig.setAdvertisingMetadata(advertisingMetadata);
Cree una clase personalizada de resolución de anuncios que extienda el ContentResolver
clase.
En la resolución de anuncios personalizada, omita doConfigure
, doCanResolve
, doResolve
, doCleanup
:
void doConfigure(MediaPlayerItem item);
boolean doCanResolve(Opportunity opportunity);
void doResolve(Opportunity opportunity);
void doCleanup();
Usted recibe su advertisingMetadata
del elemento transferido doConfigure
:
MediaPlayerItemConfig itemConfig = item.getConfig();
AdvertisingMetadata advertisingMetadata =
mediaPlayerItemConfig.getAdvertisingMetadata();
Para cada oportunidad de ubicación, cree un List<TimelineOperation>
.
Esta muestra TimelineOperation
proporciona una estructura para AdBreakPlacement
:
AdBreakPlacement(
new AdBreak( ads, // Vector<Ad>
tracker // Content Tracker
),
placementInformation // Retrieved from Opportunity
);
Una vez resueltos los anuncios, invoque una de las siguientes funciones:
Si la resolución del anuncio se realiza correctamente, invoque process(List<TimelineOperation> proposals)
y notifyCompleted(Opportunity opportunity)
en el ContentResolverClient
_client.process(timelineOperations);
_client.notifyCompleted(opportunity);
Si la resolución del anuncio falla, invoque notifyResolveError
en el ContentResolverClient
_client.notifyFailed(Opportunity opportunity, PSDKErrorCode error);
Por ejemplo:
_client.notifyFailed(opportunity, UNSUPPORTED_OPERATION);
Este solucionador de anuncios personalizado de muestra resuelve una oportunidad y proporciona un anuncio sencillo:
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() {}
}