Puoi implementare dei resolver di contenuto personalizzati in base ai resolver predefiniti.
Quando TVSDK genera una nuova opportunità, scorre attraverso i risolutori di contenuti registrati alla ricerca di una che sia in grado di risolvere tale opportunità. Il primo che restituisce true
è selezionato per risolvere l’opportunità. Se non è in grado di risolvere i contenuti, tale opportunità viene saltata. Poiché il processo di risoluzione dei contenuti è in genere asincrono, il resolver dei contenuti è responsabile della notifica a TVSDK al termine del processo.
Implementare ContentFactory
, estendendo la ContentFactory
interfaccia e sostituzione 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
al 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 AdvertisingMetadata
a TVSDK come segue:
Creare un AdvertisingMetadata
oggetto.
Salva il AdvertisingMetadata
oggetto a MediaPlayerItemConfig
.
AdvertisingMetadata advertisingMetadata = new AdvertisingMetadata();
advertisingMetadata.setDelayAdLoading(true);
...
mediaPlayerItemConfig.setAdvertisingMetadata(advertisingMetadata);
Creare una classe ad resolver personalizzata che estenda ContentResolver
classe.
Nel resolver dell’annuncio personalizzato, sostituisci doConfigure
, doCanResolve
, doResolve
, doCleanup
:
void doConfigure(MediaPlayerItem item);
boolean doCanResolve(Opportunity opportunity);
void doResolve(Opportunity opportunity);
void doCleanup();
Ottieni il tuo advertisingMetadata
dall'elemento passato 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
);
Dopo la risoluzione degli annunci, chiama una delle seguenti funzioni:
Se la risoluzione dell’annuncio ha esito positivo, chiama process(List<TimelineOperation> proposals)
e notifyCompleted(Opportunity opportunity)
il ContentResolverClient
_client.process(timelineOperations);
_client.notifyCompleted(opportunity);
Se la risoluzione dell’annuncio non riesce, chiama notifyResolveError
il ContentResolverClient
_client.notifyFailed(Opportunity opportunity, PSDKErrorCode error);
Ad esempio:
_client.notifyFailed(opportunity, UNSUPPORTED_OPERATION);
Questo esempio di risolutore di annunci personalizzato 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() {}
}