您可以根據預設解析器實作您自己的內容解析器。
當TVSDK產生新商機時,它會透過註冊的內容解析器重複,尋找能夠解決該商機的內容解析器。 選擇返回true
的第一個以解決該機會。 如果沒有內容解析器,則會略過該機會。 由於內容解析程式通常是非同步的,因此當程式完成時,內容解析程式負責通知TVSDK。
透過延伸ContentFactory
介面並覆寫retrieveResolvers
,實作您自己的自訂ContentFactory
。
例如:
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;
}
...
}
將ContentFactory
註冊到MediaPlayer
。
例如:
//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);
將AdvertisingMetadata
物件傳遞至TVSDK,如下所示:
建立AdvertisingMetadata
對象。
將AdvertisingMetadata
對象保存到MediaPlayerItemConfig
。
AdvertisingMetadata advertisingMetadata = new AdvertisingMetadata();
advertisingMetadata.setDelayAdLoading(true);
...
mediaPlayerItemConfig.setAdvertisingMetadata(advertisingMetadata);
建立可擴充ContentResolver
類別的自訂廣告解析程式類別。
在自訂廣告解析程式中,覆寫doConfigure
、doCanResolve
、doResolve
、doCleanup
:
void doConfigure(MediaPlayerItem item);
boolean doCanResolve(Opportunity opportunity);
void doResolve(Opportunity opportunity);
void doCleanup();
從傳入doConfigure
的項目取得advertisingMetadata
:
MediaPlayerItemConfig itemConfig = item.getConfig();
AdvertisingMetadata advertisingMetadata =
mediaPlayerItemConfig.getAdvertisingMetadata();
對於每個職位安排機會,建立一個List<TimelineOperation>
。
此範例TimelineOperation
提供AdBreakPlacement
的結構:
AdBreakPlacement(
new AdBreak( ads, // Vector<Ad>
tracker // Content Tracker
),
placementInformation // Retrieved from Opportunity
);
解決廣告後,請呼叫下列其中一個函式:
如果廣告解析成功,請在ContentResolverClient
上呼叫process(List<TimelineOperation> proposals)
和notifyCompleted(Opportunity opportunity)
_client.process(timelineOperations);
_client.notifyCompleted(opportunity);
如果廣告解析失敗,請在ContentResolverClient
上呼叫notifyResolveError
_client.notifyFailed(Opportunity opportunity, PSDKErrorCode error);
例如:
_client.notifyFailed(opportunity, UNSUPPORTED_OPERATION);
此範例自訂廣告解析程式可解決商機並提供簡單廣告:
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() {}
}