通過實施OpportunityGenerator類,您可以實施自己的機會生成器。
實施您的自定義 ContentFactory
通過執行 ContentFactory
介面和覆蓋 retrieveGenerators
。
例如:
class MyContentFactory extends ContentFactory {
@Override
public List<OpportunityGenerator> retrieveGenerators(MediaPlayerItem item) {
List<OpportunityGenerator> generators = new ArrayList<OpportunityGenerator>();
generators.add(MyOpportunityGenerator(item));
return generators;
}
...
}
註冊 ContentFactory
到 MediaPlayer
。
例如:
// register the custom content factory with media player
MediaPlayerItemConfig config = new MediaPlayerItemConfig();
config.setAdvertisingFactory(new MyContentFactory());
// this config will should be later passed while loading the resource
mediaPlayer.replaceCurrentResource(resource, config);
// OR use MediaPlayerItemLoader to pre-load a resource
id = 23;
itemLoader.load(resource, id, config);
建立一個自定義機會生成器類,用於實現 OpportunityGenerator
類。
public class CustomOpportunityGenerator implements OpportunityGenerator
{...}
在自定義業務機會生成器中,覆蓋 doConfigure
。 doUpdate
和 doCleanup
:
@Override
public void configure(MediaPlayerItem item, Context context,
OpportunityGeneratorClient client, AdSignalingMode mode, long playhead, TimeRange playbackRange) {
}
protected void update(long playhead, TimeRange playbackRange){
}
protected void cleanup(){
}
要獲取定時元資料,請執行以下操作:
List<TimedMetadata> tList = getItem().getTimedMetadata();
每個 TimedMetadata
或組 TimedMetadata
,建立具有以下屬性的商機:
Opportunity(
String id, // Can be id from timedMetadata
Placement placementInformation, // Placement object containing Type, time, duration
Metadata metadataSettings, // Ad metadata with targeting params sent to the ad provider
Metadata customParams // Metadata for customizing resolving and/or tracking process.
);
對於建立的每個機會,請撥打 resolve
的 OpportunityGeneratorClient:getClient().resolve(opportunity);
。
這是一個示例自定義放置機會檢測器:
public class MyOpportunityGenerator implements OpportunityGenerator {
@Override
public void configure(MediaPlayerItem item, Context context,
OpportunityGeneratorClient client, AdSignalingMode mode, long playhead, TimeRange playbackRange) {
}
MediaPlayerItem item = getItem();
MediaPlayerItemConfig itemConfig = item.getConfig();
if (itemConfig == null || itemConfig.getAdvertisingMetadata() == null) {
// no ad metadata, no ads
return;
}
AdvertisingMetadata metadata = item.getConfig().getAdvertisingMetadata();
AdSignalingMode mode = itemConfig.getAdSignalingMode();
if (mode == AdSignalingMode.CUSTOM_RANGES)
{
// don't override custom ad ranges
return;
}
Placement.Type pType = (mode == AdSignalingMode.MANIFEST_CUES) ?
Placement.Type.PRE_ROLL : Placement.Type.SERVER_MAP;
Placement.Mode pMode = Placement.Mode.DEFAULT;
Placement placement = new Placement(pType, playhead,
Placement.UNKNOWN_DURATION, pMode);
Opportunity opportunity = new Opportunity("initialOpportunity", placement,
metadata, null);
OpportunityGeneratorClient client = getClient();
client.resolve(opportunity);
}
@Override
protected void update(long playhead, TimeRange playbackRange) {
...
timedMetadataList = getItem().getTimedMetadata();
for (TimedMetadata timedMetadata : timedMetadataList) {
if (isOpportunity(timedMetadata)) { // check if given timedMetadata should
// be considered as an opportunity
// create a PlacementOpportunity object and add it to the opportunities list
Opportunity opportunity = new Opportunity("id", placement, metadata, null);
client.resolve(opportunity)
}
}
}
@Override
protected void cleanup() {}
}