您可以根據預設解析器來實作您自己的內容解析器。
當TVSDK產生新的商機時,它會逐一檢視註冊的內容解析器,尋找能夠解析該商機的內容。 第一個傳回的 true
已選取以解決商機。 如果沒有任何內容解析程式能夠解析內容,則會略過該機會。 由於內容解析程式通常是非同步的,內容解析程式負責在程式完成時通知TVSDK。
實作您自己的自訂 ContentFactory
,方式為擴充 ContentFactory
介面和覆寫 retrieveResolvers
.
例如:
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();
您將您的 advertisingMetadata
從傳入的專案 doConfigure
:
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
);
解析廣告後,請呼叫下列其中一個函式:
如果廣告解析成功,請呼叫 process(List<TimelineOperation> proposals)
和 notifyCompleted(Opportunity opportunity)
於 ContentResolverClient
_client.process(timelineOperations);
_client.notifyCompleted(opportunity);
如果廣告解析失敗,請呼叫 notifyResolveError
於 ContentResolverClient
_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() {}
}