1 Обзор API
OMNIBOX предоставляет легкий метод интеграции без необходимости тяжелого SDK для Android приложений. Все запросы рекламы выполняются через простой HTTP GET запрос, а реклама рендерится с помощью стандартных WebView или нативных видеоплееров.
Базовый эндпоинт
https://omnibox.digital/ads/direct
Параметры запроса
| Параметр | Тип | Статус | Описание |
|---|---|---|---|
plc |
String | Required | Placement ID. Уникальный идентификатор рекламного места. |
w |
Int | Required | Ширина слота в пикселях. |
h |
Int | Required | Высота слота в пикселях. |
cb |
Long | Required | Cache Buster (timestamp) для предотвращения кэширования. |
t |
String | Conditional |
Тип контента. • Опустить для WebView/HTML • app для VAST/MP4 (In-Stream)
|
2 Дисплейная реклама
Реализация (Kotlin)
val webView: WebView = findViewById(R.id.bannerWebView)
// 1. Создание URL
val placementId = "android_banner_300x250"
val url = "https://omnibox.digital/ads/direct?plc=$placementId&w=300&h=250&cb=${System.currentTimeMillis()}"
// 2. Настройка WebView
webView.settings.apply {
javaScriptEnabled = true
domStorageEnabled = true
mediaPlaybackRequiresUserGesture = false
}
webView.setBackgroundColor(0)
// 3. Обработка кликов (Открытие во внешнем браузере)
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
val link = request?.url.toString()
if (!link.contains("omnibox.digital")) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(link))
view?.context?.startActivity(intent)
return true
}
return false
}
}
webView.loadUrl(url)
3 Interstitial Реклама
Важно: Кнопка закрытия
HTML код не может закрыть нативную Android Activity. Необходимо реализовать нативную кнопку «Закрыть» (X) поверх WebView.
FrameLayout (Parent)
├── WebView (Match Parent)
└── ImageButton (Close Button, Top-End aligned)
Реализация (Kotlin)
class InterstitialActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_interstitial)
val webView: WebView = findViewById(R.id.interstitialWebView)
val closeBtn: View = findViewById(R.id.btnClose)
// Расчет размеров экрана
val displayMetrics = resources.displayMetrics
val w = (displayMetrics.widthPixels / displayMetrics.density).toInt()
val h = (displayMetrics.heightPixels / displayMetrics.density).toInt()
val url = "https://omnibox.digital/ads/direct?plc=INTERSTITIAL_PLC&w=$w&h=$h&cb=${System.currentTimeMillis()}"
closeBtn.setOnClickListener {
finish()
}
// Аналогичные настройки как для банеров
webView.settings.javaScriptEnabled = true
webView.settings.mediaPlaybackRequiresUserGesture = false
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
val link = request?.url.toString()
if (!link.contains("omnibox.digital")) {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(link)))
return true
}
return false
}
}
webView.loadUrl(url)
}
}
4 In-Stream Видео (ExoPlayer + IMA)
Обязательный параметр t=app
Добавьте &t=app к URL. Это вернет чистый VAST Wrapper (MP4), обходя
VPAID JS, который не поддерживается ExoPlayer-ом.
// 1. Создание URL тега (t=app ОБЯЗАТЕЛЕН)
val adTagUrl = "https://omnibox.digital/ads/direct?plc=video_preroll&w=1920&h=1080&t=app&cb=${System.currentTimeMillis()}"
// 2. Настройка MediaItem
val mediaItem = MediaItem.Builder()
.setUri(Uri.parse("https://content.com/movie.mp4"))
.setAdsConfiguration(
MediaItem.AdsConfiguration.Builder(Uri.parse(adTagUrl)).build()
)
.build()
// 3. Инициализация ExoPlayer
val player = ExoPlayer.Builder(context)
.setMediaSourceFactory(
DefaultMediaSourceFactory(context)
.setLocalAdInsertionComponents({ _ -> imaAdsLoader }, playerView)
)
.build()
player.setMediaItem(mediaItem)
player.prepare()
player.play()
5 In-Stream Видео (Кастомные плееры)
Для плееров без поддержки IMA SDK, действуйте как VAST Client: парсите XML и воспроизводите видео вручную.
1 Логика Парсинга
-
•
Wrapper: Если корневой тег
<Wrapper>, извлеките URL из<VASTAdTagURI>и сделайте новый запрос. -
•
InLine (Финал): В этом теге ищите
<MediaFile>(MP4) для воспроизведения и<TrackingEvents>для аналитики.