Документация Android Интеграция

Android Integration

Руководство по интеграции рекламы для Android приложений

1 Обзор API

OMNIBOX предоставляет легкий метод интеграции без необходимости тяжелого SDK для Android приложений. Все запросы рекламы выполняются через простой HTTP GET запрос, а реклама рендерится с помощью стандартных WebView или нативных видеоплееров.

Базовый эндпоинт

HTTPS
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 Дисплейная реклама

Формат
HTML/JS based
Интеграция
WebView

Реализация (Kotlin)

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.

XML Layout Structure
FrameLayout (Parent)
├── WebView (Match Parent)
└── ImageButton (Close Button, Top-End aligned)

Реализация (Kotlin)

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-ом.

Kotlin
// 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> для аналитики.