È possibile implementare i propri risolutori di contenuti in base ai risolutori predefiniti.
Quando TVSDK genera una nuova opportunità, esegue un’iterazione attraverso i risolutori di contenuti registrati alla ricerca di una in grado di risolvere tale opportunità. Il primo che restituisce true
viene selezionato per risolvere l'opportunità. Se nessun risolutore di contenuti è in grado, tale opportunità viene ignorata. Poiché il processo di risoluzione dei contenuti è in genere asincrono, il risolutore dei contenuti è responsabile della notifica a TVSDK al termine del processo.
Implementa il tuo ContentFactory
personalizzato, estendendo l'interfaccia ContentFactory
e ignorando retrieveResolvers
.
Ad esempio:
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;
}
...
}
Registra il ContentFactory
nel MediaPlayer
.
Ad esempio:
//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);
Passa un oggetto AdvertisingMetadata
a TVSDK come segue:
Creare un oggetto AdvertisingMetadata
.
Salvare l’oggetto AdvertisingMetadata
su MediaPlayerItemConfig
.
AdvertisingMetadata advertisingMetadata = new AdvertisingMetadata();
advertisingMetadata.setDelayAdLoading(true);
...
mediaPlayerItemConfig.setAdvertisingMetadata(advertisingMetadata);
Crea una classe ad resolver personalizzata che estende la classe ContentResolver
.
Nel risolutore di annunci personalizzato, sovrascrivi doConfigure
, doCanResolve
, doResolve
, doCleanup
:
void doConfigure(MediaPlayerItem item);
boolean doCanResolve(Opportunity opportunity);
void doResolve(Opportunity opportunity);
void doCleanup();
Ottieni il tuo advertisingMetadata
dall'elemento trasmesso in doConfigure
:
MediaPlayerItemConfig itemConfig = item.getConfig();
AdvertisingMetadata advertisingMetadata =
mediaPlayerItemConfig.getAdvertisingMetadata();
Per ogni opportunità di posizionamento, crea un List<TimelineOperation>
.
Questo esempio TimelineOperation
fornisce una struttura per AdBreakPlacement
:
AdBreakPlacement(
new AdBreak( ads, // Vector<Ad>
tracker // Content Tracker
),
placementInformation // Retrieved from Opportunity
);
Una volta risolti gli annunci, chiama una delle seguenti funzioni:
Se la risoluzione dell'annuncio ha esito positivo, chiama process(List<TimelineOperation> proposals)
e notifyCompleted(Opportunity opportunity)
sulContentResolverClient
_client.process(timelineOperations);
_client.notifyCompleted(opportunity);
Se la risoluzione dell'annuncio non riesce, chiama notifyResolveError
su ContentResolverClient
_client.notifyFailed(Opportunity opportunity, PSDKErrorCode error);
Ad esempio:
_client.notifyFailed(opportunity, UNSUPPORTED_OPERATION);
Questo ad resolver personalizzato di esempio risolve un'opportunità e fornisce un annuncio semplice:
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() {}
}