Samsung Galaxy S10e: nový král kompaktních smartphonů (recenze)

6. 5. 2019

Sdílet

Z trojice vlajkových lodí řady S10 je Galaxy S10e ten nejmenší a zároveň nejzajímavější. Samsung se navíc díky němu vrací do úzké společnosti kompaktních smartphonů, a ty máme moc rádi. Hned na začátku můžu napsat, že jde o nejlepší kompaktní telefon, který (sic je o nějaký ten milimetr větší) zadupává Xperie Compact do země.

Samsung Galaxy S10e 10 Samsung Galaxy S10e vs. Sony Xperia XZ1 Compact

Ve srovnání s Galaxy S10+ a S10 je sice nejlevnější a nejméně vybavený, ale ty rozdíly nejsou tak velké. Pořád jde o telefon za necelých dvacet tisíc, což je ale i zárukou toho, že nepůjde o žádný osekaný model. V balení dostanete nabíječku a sluchátka značky AKG. Sice hrají kvalitně, ale já už bych drátová nechtěl…

Tip: Česko je kompaktová velmoc. Jedině u nás prodá Sony více Xperií Compact než velkých smartphonů

S10e nabídne stejný výkon jako nejvyšší model S10+ a jen o něco nižší výdrž (byť akumulátor má podstatně nižší kapacitu). V Antutu se pohybuje okolo 330 000 bodů a výdrž má nadprůměrnou. Samsung použil procesor Exynos 9820, 8 GB operační paměti a 3100mAh akumulátor. Úložiště má velikost 128 GB, takže paměťová karta nebude pro většinu uživatelů potřeba.

Samsung Galaxy S10e 1 Samsung Galaxy S10e vs. Galaxy S10+
model Samsung Galaxy S10e Samsung Galaxy S10+ Samsung Galaxy S10
displej 5,8" (19:9) AMOLED, 1080 x 2280 px 6,4" (19:9) AMOLED, 1440 x 3040 px 6,1" (19:9) AMOLED, 1440 x 3040 px
rozměry a hmotnost 142,2 × 69,9 × 7,9 mm / 150 g 157,6 × 74,1 × 7,8 mm / 175 g 149,9 × 70,4 × 7,8 mm / 157 g
úložiště (+microSD) 256/128 GB + microSD 128 GB + microSD 128 GB + microSD
akumulátor 3100 mAh, Qi 4100 mAh, Qi 3400 mAh, Qi
zadní foťák 12 Mpx f/1.5-2.4 Dual Pixel, pDAF, OIS
16 MPx ulraširoký f/2.2
16 Mpx f/2.2 ultraširoký
12 MPx Dual Pixel AF f/1.5/f/2.4 OIS
12 MPx telephoto OIS 2× zoom
16 Mpx f/2.2 ultraširoký
12 MPx Dual Pixel AF f/1.5/f/2.4 OIS
12 MPx telephoto OIS 2× zoom
přední foťák 10 Mpx f/1.9 Dual Pixel PDAF 10 Mpx Dual Pixel + 8 Mpx depth 10 Mpx f/1.9 Dual Pixel PDAF
čtečka otisků prstů ano, na boku ano, v displeji ano, v displeji
doporučená cena 19 499 Kč 25 999 Kč 23 499 Kč

Z výbavy nechybí prakticky nic. Moderní nabíjecí port USB-C 3.1 doplňuje podpora bezdrátového nabíjení Qi a nechybí ani sluchátkový jack. Telefon podporuje nový standard Wi-Fi 6 i Bluetooth 5.0. Dvojici SIM můžete nahradit jednou SIM a microSD kartou. Displej chrání sklo Gorilla Glass a telefon splňuje standard IP68. Chybí něco? Snad jen infraport…

Po dlouhé době mám v ruce telefon, který se do ní nejen vejde, ale také jde ovládat jedním prstem, aniž bych musel výrazněji přehmatávat. A vejde se i do kapsy od košile. Dokonce i vcelku kompaktní telefony Honor 10 či Google Pixel 2 jsou o něco větší. Jen Samsung Galaxy A3 byl menší, ovšem taky s jen 4,7" displejem. To Galaxy S10e má 5,8".

Samsung Galaxy S10e 3 Samsung Galaxy S10e

Na rozdíl od S10+ a S10 má S10e rovný displej. Podle Samsungu je to zřejmě ústupek, podle mě jasný bonus. Zakřivené displeje jsou módní trend, rovné displeje se lépe používají. Rámečky nejsou nijak extrémně tenké, ale tak akorát a po všech stranách stejné. V displej je díra pro jeden fotoaparát. U nás se prodává v barvě zelené, bílé, černé a žluté. Ve světě existují ještě růžová a modrá, osobně mi nejlepší přijde zelená.

Samsung Galaxy S10e 0 Samsung Galaxy S10e - barevné varianty

Na skleněných zádech jsou dvě čočky fotoaparátu v jen mírně vystouplé kapličce. Ovladač hlasitosti je vlevo spolu s tlačítkem pro Bixby, což může trochu mást, ale jde o standard Samsungu. Tlačítko lze naštěstí přemapovat, takže místo u nás nepoužitelného Bixby tam můžete mít třeba Mapy.

Samsung Galaxy S10e 7 Samsung Galaxy S10e - čtečka otisků a zapínací tlačítko v jednom

Zapínací tlačítko ve formě čtečky otisků prstů je umístěné napravo. Samsung ušetřil tím, že nedal čtečku pod displej, ale podle mě udělal dobře. Čtečka je přesná a rychlá, což u těch pod displejem nebývá vždy pravda (i když ultrasonické čtečky Samsungu jsou dobré i pod displejem).

Samsung Galaxy S10e 4 Samsung Galaxy S10e

Displej

Úhlopříčka 5,8" sice nezní nic moc, iPhone přeci míval 4", kompaktní Xperie 4,3", ale díky tenkým rámečkům máte v ruce téměř ideální jednoruční telefon. Sice mohl být ještě o kousek menší, ale stejně nemáte téměř na výběr.

Každopádně jde o velmi kvalitní AMOLED s poměrem stran 19:9. Rozsah jasu je od minimálních 1,8 až po 372 nitů. Můžete si vybrat mezi živými a nepřesnými barvami a přirozenými barvami, které splňují standard sRGB. Vyvážení bílé je dobré v obou případech. Samsung u těchto modelů má i kvalitní filtr modrého světla pro večerní používání.

Samsung Galaxy S10e displej prirozene barvy Samsung Galaxy S10e displej prirozene barvy
Samsung Galaxy S10e displej zive barvy Samsung Galaxy S10e displej zive barvy

Výkon a výdrž

výkon
Antutu 6 327 261 bodů
PCMark (Work 2.0) 7 741 bodů
PCMark (Storage)
3DMark Sling Shot ES 3.1 (1440p) Extreme 4 374 bodů
výdrž
akumulátor 3100 mAh
PCMark (Battery 2) 9:02 h (343 mA za hodinu)
výdrž při přehrávání videa 1080p HEVC 17:40 h (175 mA za hodinu)
rychlost nabíjení za 60 minut 86 %

 

Fotoaparát

Dvojice kamer na zádech je sice méně než trojice u S10+, ale telefon pořád fotí výborně. Hlavní 12Mpx kamera má proměnlivou clonu f/1.5 až 2.4 a optickou stabilizaci. Druhý snímač ultraširoký má 16 Mpx. Přední kamera má 10 Mpx se světelností f/1.9.

Samsung Galaxy S10e 6 Samsung Galaxy S10e

Hodnocení

Tohle se zkrátka Samsungu povedlo a Galaxy S10e je taková menší bomba. S Galaxy S10e se trefil do vkusu dlouho jindy opomíjených uživatelů kompaktních smartphonů, kterých je zrovna v Česku (podle statistik od Sony) docela dost.

U většiny ostatních výrobců by takový telefon byl rovnou vlajkovou lodí. Samsung má však v nabídce ještě pár vyšších modelů, byť už standardně velkých.

zabbix_tip

Nejde tak o další pádlo, které s dalšími pádly soupeří o titul nejlepšího telefonu. Galaxy S10e může soupeřit s iPhonem XR, který je ale dražší a větší, nebo s lehce menší a výrazně levnější Xperií XZ Compact. Ze všech těchto konkurentů vychází ovšem nejlépe právě Samsung.

model Samsung Galaxy S10e
označení konfigurace SM-G970F
představení / zahájení prodeje v Česku únor 2019 (San Francisco), březen 2019
displej 5,8" (19:9) AMOLED, 1080 x 2280 px
rozměry a hmotnost 142,2 × 69,9 × 7,9 mm / 150 g
SoC  + RAM Exynos 9820 (osmijádro 8 nm + Mali G76 MP12) + 8 GB RAM
úložiště (+microSD) 256/128 GB + microSD
akumulátor 3100 mAh, Qi
zadní foťák 12 Mpx f/1.5-2.4 Dual Pixel, pDAF, OIS
16 MPx ulraširoký f/2.2
přední foťák 10 Mpx f/1.9 Dual Pixel PDAF
konektory USB-C 3.1, jack
sluchátka jack
bezdrátové sítě (Wi-Fi, BT, GPS, LTE, NFC, infraport) Wi-Fi (802.11ac/ax), Bluetooth (5.0), GPS (Glonass, BDS, Galileo), LTE (ano), NFC (ano), infraport (ne)
čtečka otisků prstů ano, na boku
barevné varianty Prism White, Prism Black, Prism Green, Prism Blue, Canary Yellow, Flamingo Pink
Single SIM / Dual SIM 2× nanoSIM
zvýšená odolnost IP68, Gorilla Glass 6
operační systém Android 9
doporučená cena 19 499 Kč

Autor článku

Nadšenec do notebooků a příznivce kompaktních smartphonů. Najdete mě na Twitteru nebo LinkedInu.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »