2016-11-10 1 views
0

Ich versuche, VAST-Video-Pre-Roll-Anzeigen zur SThree sample Roku SDK project (die "Simple Grid mit Video und Details Seite (. Zip)" - Version) hinzuzufügen.Probleme beim Abspielen von Vid-Pre-Roll-Anzeigen in Roku

kann ich es auf app Start arbeiten, indem Sie den folgenden Code in main.brs: will

library "Roku_Ads.brs" 
... 
Sub RunUserInterface() 
    ... 
    raf = Roku_Ads() 
    raf.setAdPrefs(false)  'disable back-filled ads 
    raf.setDebugOutput(true) 
    raf.setAdUrl("http://pubads.g.doubleclick.net/gampad/ads?slotname=/82114269/Video/fallbacktest&sz=1920x1080&url=[http://roku.com&unviewed_position_start=1&output=vast&impl=s&env=vp&gdfp_req=1&ad_rule=0&description_url=http%3A%2F%2Fapps.roku.com&vad_type=linear&sdkv=roku&min_ad_duration=0&max_ad_duration=60000&rdid=ROKU_ADS_TRACKING_ID&is_lat=ROKU_ADS_LIMIT_TRACKING&idtype=rida&correlator=ROKU_ADS_TIMESTAMP&scor=ROKU_ADS_TIMESTAMP&pod=POD_NUM&ppos=POD_POSITION&cust_params=genre%3DROKU_ADS_CONTENT_GENRE%26ua%3DROKU_ADS_USER_AGENT%26ai%3DROKU_ADS_APP_ID]http://roku.com&unviewed_position_start=1&output=vast&impl=s&env=vp&gdfp_req=1&ad_rule=0&description_url=http%3A%2F%2Fapps.roku.com&vad_type=linear&sdkv=roku&min_ad_duration=0&max_ad_duration=60000&rdid=ROKU_ADS_TRACKING_ID&is_lat=ROKU_ADS_LIMIT_TRACKING&idtype=rida&correlator=ROKU_ADS_TIMESTAMP&scor=ROKU_ADS_TIMESTAMP&pod=POD_NUM&ppos=POD_POSITION&cust_params=genre%3DROKU_ADS_CONTENT_GENRE%26ua%3DROKU_ADS_USER_AGENT%26ai%3DROKU_ADS_APP_ID") 
    adPods = raf.getAds() 
    shouldPlayContent = raf.showAds(adPods) 

ich aber keine Anzeige beim Start spielen, möchte ich vor einem Video eine Anzeige spielen abspielen. Also Ich denke, ich kann nur die oben genannten Zeilen oben components/screens/DetailsScreen/DetailsScreen.brs:

' on Button press handler 
Sub onItemSelected() 
    ' first button is Play 
    if m.top.itemSelected = 0 
     'START ADDING FOR PRE-ROLL 
     raf = Roku_Ads() 
     raf.setAdPrefs(false)  'disable back-filled ads 
     raf.setDebugOutput(true) 
     raf.setAdUrl("http://pubads.g.doubleclick.net/gampad/ads?slotname=/82114269/Video/fallbacktest&sz=1920x1080&url=[http://roku.com&unviewed_position_start=1&output=vast&impl=s&env=vp&gdfp_req=1&ad_rule=0&description_url=http%3A%2F%2Fapps.roku.com&vad_type=linear&sdkv=roku&min_ad_duration=0&max_ad_duration=60000&rdid=ROKU_ADS_TRACKING_ID&is_lat=ROKU_ADS_LIMIT_TRACKING&idtype=rida&correlator=ROKU_ADS_TIMESTAMP&scor=ROKU_ADS_TIMESTAMP&pod=POD_NUM&ppos=POD_POSITION&cust_params=genre%3DROKU_ADS_CONTENT_GENRE%26ua%3DROKU_ADS_USER_AGENT%26ai%3DROKU_ADS_APP_ID]http://roku.com&unviewed_position_start=1&output=vast&impl=s&env=vp&gdfp_req=1&ad_rule=0&description_url=http%3A%2F%2Fapps.roku.com&vad_type=linear&sdkv=roku&min_ad_duration=0&max_ad_duration=60000&rdid=ROKU_ADS_TRACKING_ID&is_lat=ROKU_ADS_LIMIT_TRACKING&idtype=rida&correlator=ROKU_ADS_TIMESTAMP&scor=ROKU_ADS_TIMESTAMP&pod=POD_NUM&ppos=POD_POSITION&cust_params=genre%3DROKU_ADS_CONTENT_GENRE%26ua%3DROKU_ADS_USER_AGENT%26ai%3DROKU_ADS_APP_ID") 
     adPods = raf.getAds() 
     shouldPlayContent = raf.showAds(adPods) 
     'END ADDING FOR PRE-ROLL 

     if shouldPlayContent 
      m.videoPlayer.visible = true 
      m.videoPlayer.setFocus(true) 
      m.videoPlayer.control = "play" 
      m.videoPlayer.observeField("state", "OnVideoPlayerStateChange") 
     end if 
    end if 
End Sub 

Als ich dies betreibe ich eine Fehlermeldung erhalten:

Roku_Ads Framework version 1.8 
BRIGHTSCRIPT: ERROR: roAppInfo: class PLUGIN|MARKUP on thread RENDER: roku_ads_lib:/Roku_Ads.brs(527) 
'Dot' Operator attempted with invalid BrightScript Component or interface reference. (runtime error &hec) in roku_ads_lib:/Roku_Ads.brs(528) 
528: ?? 
Backtrace: 
#4 Function roku_ads_util_getappid(key_ As String) As String 
    file/line: roku_ads_lib:/Roku_Ads.brs(528) 
#3 Function roku_ads_checkallowedfeature(keytype_ As String, util_ As Object) As Boolean 
    file/line: roku_ads_lib:/Roku_Ads.brs(1287) 
#2 Function roku_ads_constructor() As Object 
    file/line: roku_ads_lib:/Roku_Ads.brs(264) 
#1 Function roku_ads() As Object 
    file/line: roku_ads_lib:/Roku_Ads.brs(32) 
#0 Function onitemselected() As Void 
    file/line: pkg:/components/screens/DetailsScreen/DetailsScreen.brs(75) 

Was mache ich falsch hier? Kann eine Anzeige nicht geschaltet werden, wenn eine Methode von einer onChange="onItemSelected" in der Datei component.xml aufgerufen wird?

aktualisieren: Eugens answer below korrekt ist, ist hier, wie ich das Problem gelöst:

Lesen Sie mehr über scene graph threads, events und handling application events. Sobald das erledigt ist, lesen Sie this post beim Übergeben von Daten zwischen dem Render-Thread und dem Haupt-Thread. Sie müssen scene graph data scoping verstehen.

Im Wesentlichen beobachten Sie das itemSelected Feld in components/screens/DetailsScreen/DetailsScreen.xml:

m.DetailsScreen = scene.findNode("DetailsScreen") 
m.DetailsScreen.observeField("itemSelected", m.port) 

Dann in dem Haupt Themen Ereignisschleife behandeln Sie die roSGNodeEvent:

while true 
    msg = wait(0, m.port)   
    msgType = type(msg) 

    ? ">>>Main Thread Msg: ";msgType 

    if msgType = "roSGScreenEvent" 
     if msg.isScreenClosed() then return 
    else if msgType = "roSGNodeEvent" 
     fieldName = msg.getField() 
     fieldData = msg.getData() 
     ? "> node: "; msg.getNode() 
     ? "> field name: "; fieldName 
     ? "> data: "; fieldData 

     if (fieldName = "itemSelected" and fieldData = 0) 'User pressed play 
      'wait for 0.5 second before proceeding to RAF 
      sleep(500) 
      PlayAd() 
     endif 
    end if 
end while 

PlayAd() Sets m.DetailsScreen.videoPlayerVisible = true Wenn es keine Anzeige war oder ob ad fertig spielen. Dies führt dazu, onVideoVisibleChange aufgerufen werden in components/screens/DetailsScreen/DetailsScreen.brs

Antwort

1

Sie können nicht RAF in Render-Thread verwenden. Sie müssen ein Ereignis an den Hauptthread senden und dort Anzeigen schalten. Sie können Samples der RAF-Integration im Szenendiagramm here finden. Weitere Informationen zu Threads in Scene Graph finden Sie unter here.

+0

Dank @ eugene-smoliy, das macht Sinn und so auch die High-Level-Dokumente auf Threads, die Sie verknüpft haben. Wo finde ich die Dokumente zur Nachrichtenübergabe? Wenn man sich den FullRAFSceneGraphSample ansieht, sieht es so aus, als würde der Haupt-Thread auf sie in der Ereignisschleife warten. Ich kann prob herausfinden, über Versuch und Irrtum aber lieber lesen Sie Dokumente über Thema - die ich habe Probleme zu finden ... – rynop

+0

Ich fand es, https://sdkdocs.roku.com/display/sdkdoc/Handling+Application+ Ereignisse Ich aktualisiere dieses SO mit dem, was zum SThree-Beispiel hinzugefügt werden muss, damit die Anzeigen geschaltet werden, sobald ich es funktioniert habe – rynop