Puoi implementare dei resolver di contenuto personalizzati in base ai resolver predefiniti.
Quando TVSDK rileva una nuova opportunità, scorre attraverso i risolutori di contenuti registrati alla ricerca di una che sia in grado di risolverla. Il primo che restituisce true viene selezionato per la risoluzione dell'opportunità. Se non è possibile utilizzare alcun risolutore contenuti, tale opportunità viene ignorata. Poiché il processo di risoluzione dei contenuti è in genere asincrono, il resolver dei contenuti è responsabile della notifica al termine del processo.
Creare un AdvertisingFactory
istanza e sostituzione createContentResolver
.
Ad esempio:
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;
}
...
}
Registra la factory dell’ad client su MediaPlayer
.
Ad esempio:
// register the custom advertising factory with media player
advertisingFactory = createCustomAdvertisingFactory();
mediaPlayer.registerAdClientFactory(advertisingFactory);
Passa un AdvertisingMetadata
a TVSDK come segue:
AdvertisingMetadata
oggetto e MetadataNode
oggetto.AdvertisingMetadata
oggetto a MetadataNode
.MetadataNode result = new MetadataNode();
result.setNode(DefaultMetadataKeys.ADVERTISING_METADATA.getValue(),
advertisingMetadata);
Creare una classe ad resolver personalizzata che estenda ContentResolver
classe.
Nel resolver dell’annuncio personalizzato, sovrascrivi questa funzione protetta:
void doResolveAds(Metadata metadata,
PlacementOpportunity placementOpportunity)
I metadati contengono AdvertisingMetada
. Utilizzala per i seguenti elementi TimelineOperation
generazione vettoriale.
Per ogni opportunità di posizionamento, crea un Vector<TimelineOperation>
.
Il vettore può essere vuoto, ma non nullo.
Questo esempio TimelineOperation
fornisce una struttura per 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
)
Dopo la risoluzione degli annunci, chiama una delle seguenti funzioni:
notifyResolveComplete(Vector<TimelineOperation> proposals)
notifyResolveError(Error error)
Ad esempio, se non riesce:
Metadata metadata = new MetadataNode();
metadata.setValue("NATIVE_ERROR_CODE", exception.getCause().toString());
error.setMetadata(metadata);
Questo ad resolver personalizzato di esempio effettua una richiesta HTTP al server di annunci e riceve una risposta 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);
}
}
...
}
Esempio di risposta JSON ad server per un flusso live:
{
"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": {
}
} ]
} ]
}
}
Esempio di risposta JSON ad server per 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": {
}
} ]
} ]
}
}