기본 통합(ExoPlayer AdsLoader API)

YandexAdsLoader는 Media3 및 ExoPlayer를 통해 InStream 광고를 통합하기 위한 간소화된 API입니다. YandexAdsLoader는 Pre-roll, Mid-roll, Post-roll 유형의 광고 삽입 재생을 지원합니다.

이 통합 유형은 고급 InStream API 기능이 필요하지 않은 앱에 적합합니다.

Gradle을 사용한 통합

build.gradle 파일의 앱 수준에서 다음 종속성을 추가하세요.

dependencies {
          ...
          implementation 'com.yandex.android:mobileads:7.13.0'
          implementation 'androidx.media3:media3-exoplayer:1.4.1'
          implementation 'androidx.media3:media3-ui:1.4.1'
}
dependencies {
          ...
          implementation 'com.yandex.android:mobileads:7.13.0'
          implementation 'com.google.android.exoplayer:exoplayer-core:2.18.1'
}

광고 렌더링

  1. 앱의 레이아웃에 PlayerView를 추가하세요.

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <androidx.media3.ui.PlayerView
            android:id="@+id/player_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
    
    </FrameLayout>
    
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <com.google.android.exoplayer2.ui.PlayerView
            android:id="@+id/player_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
    
    </FrameLayout>
    
  2. InstreamAdRequestConfiguration.Builder 클래스를 사용하여 instreamAdRequestConfiguration 요청 구성을 생성합니다. 요청 매개변수에서 Yandex Advertising Network 인터페이스에서 가져온 페이지 ID(PAGE_ID)를 전달하세요.

    val configuration = InstreamAdRequestConfiguration
                .Builder(PAGE_ID)
                .build()
    
    InstreamAdRequestConfiguration configuration = new InstreamAdRequestConfiguration
                .Builder(PAGE_ID)
                .build();
    
  3. Activity 주기의 onCreate() 메서드를 사용하여 YandexAdsLoader 인스턴스를 생성하고 InStream 광고를 로드합니다.

    Примечание

    Media3과 함께 YandexAdsLoader를 사용하려면 com.yandex.mobile.ads.instream.media3 패키지에서 가져옵니다. ExoPlayer2와 함께 사용하려면 com.yandex.mobile.ads.instream.exoplayer 패키지에서 가져옵니다.

    yandexAdsLoader = YandexAdsLoader(context, configuration)
    
    yandexAdsLoader = new YandexAdsLoader(context, configuration);
    
  4. ExoPlayer를 생성하기 위한 함수를 추가합니다. 함수 내부에서 DefaultMediaSourceFactory 인스턴스를 생성하고 YandexAdsLoaderPlayerView 인스턴스에 추가합니다.

    private fun createPlayer(): Player {
        val mediaSourceFactory = DefaultMediaSourceFactory(context)
            .setLocalAdInsertionComponents({ yandexAdsLoader }, playerView)
    
        val player = ExoPlayer.Builder(context)
            .setMediaSourceFactory(mediaSourceFactory)
            .build()
    
        return player
    }
    
    private YandexAdsLoader yandexAdsLoader;
    
    ...
    
    private class YandexAdsLoaderProvider implements AdsLoader.Provider {
        @Nullable
        @Override
        public AdsLoader getAdsLoader(@NonNull MediaItem.AdsConfiguration adsConfiguration) {
            return yandexAdsLoader;
        }
    }
    
    private Player createPlayer() {
        AdsLoader.Provider yandexAdsLoaderProvider = new YandexAdsLoaderProvider();
        DefaultMediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(context)
                .setLocalAdInsertionComponents(yandexAdsLoaderProvider, playerView);
    
        Player player = new ExoPlayer.Builder(context)
                .setMediaSourceFactory(mediaSourceFactory)
                .build();
    
        return player;
    }
    
  5. MediaItem을 생성하기 위한 함수를 추가합니다.

    private fun getMediaItem(): MediaItem {
        val contentVideoUrl = CONTENT_URL
        val adTagUri = Uri.parse(YandexAdsLoader.AD_TAG_URI)
        val mediaItem = MediaItem.Builder()
            .setUri(contentVideoUrl)
            .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
            .build()
        return mediaItem
    }
    
    private MediaItem getMediaItem() {
        String contentVideoUrl = CONTENT_URL;
        Uri adTagUri = Uri.parse(YandexAdsLoader.AD_TAG_URI);
        MediaItem mediaItem = new MediaItem.Builder()
                .setUri(contentVideoUrl)
                .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
                .build();
        return mediaItem;
    }
    
  6. ExoPlayer초기화 및 상태 복구를 위한 함수를 추가합니다.

    private var rememberedPlayerPosition = 0L
    private var rememberedPlayWhenReady = false
    private var player: Player? = null
    
    ...
    
    private fun initPlayer() {
        val mediaItem = getMediaItem()
        player = createPlayer().also {
            playerView.player = it
            yandexAdsLoader.setPlayer(it)
            it.setMediaItem(mediaItem)
            it.playWhenReady = rememberedPlayWhenReady
            it.seekTo(rememberedPlayerPosition)
            it.prepare()
        }
    }
    
    private Long rememberedPlayerPosition = 0L;
    private Boolean rememberedPlayWhenReady = false;
    private Player player = null;
    
    ...
    
    private void initPlayer() {
        MediaItem mediaItem = getMediaItem();
        Player player = createPlayer();
        playerView.setPlayer(player);
        yandexAdsLoader.setPlayer(player);
        player.setMediaItem(mediaItem);
        player.setPlayWhenReady(rememberedPlayWhenReady);
        player.seekTo(rememberedPlayerPosition);
        player.prepare();
        this.player = player;
    }
    
  7. release() 메서드를 호출하고 ExoPlayer 상태를 저장하기 위한 함수를 추가합니다.

    private var rememberedPlayerPosition = 0L
    private var rememberedPlayWhenReady = false
    private var player: Player? = null
    
    ...
    
    private fun releasePlayer() {
        yandexAdsLoader.setPlayer(null)
        playerView.player = null
        player?.also {
            rememberedPlayerPosition = it.contentPosition
            rememberedPlayWhenReady = it.playWhenReady
            it.release()
        }
        player = null
    }
    
    private Long rememberedPlayerPosition = 0L;
    private Boolean rememberedPlayWhenReady = false;
    private Player player = null;
    
    ...
    
    private void releasePlayer() {
        yandexAdsLoader.setPlayer(null);
        playerView.setPlayer(null);
        Player player = this.player;
        if (player != null) {
            rememberedPlayerPosition = player.getContentPosition();
            rememberedPlayWhenReady = player.getPlayWhenReady();
           player.release();
        }
        this.player = null;
    }
    
  8. 생성한 함수를 사용하여 onStart(), onResume(), onPause()onStop() 메서드를 다시 작성합니다. API 버전 23 이하에서는 onPause()onResume() 메서드에서 생성한 함수를 호출하세요. 최신 API 버전에서는 onStop()onStart() 메서드에서 호출하세요.

    override fun onStart() {
        super.onStart()
        if (Build.VERSION.SDK_INT > 23) {
            initPlayer()
            playerView.onResume()
        }
    }
    
    override fun onStop() {
        super.onStop()
        if (Build.VERSION.SDK_INT > 23) {
            playerView.onPause()
            releasePlayer()
        }
    }
    
    override fun onResume() {
        super.onResume()
        if (Build.VERSION.SDK_INT <= 23) {
            initPlayer()
            playerView.onResume()
        }
    }
    
    override fun onPause() {
        super.onPause()
        if (Build.VERSION.SDK_INT <= 23) {
            playerView.onPause()
            releasePlayer()
        }
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        if (Build.VERSION.SDK_INT > 23) {
            initPlayer();
            playerView.onResume();
        }
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        if (Build.VERSION.SDK_INT > 23) {
            playerView.onPause();
            releasePlayer();
        }
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        if (Build.VERSION.SDK_INT <= 23) {
            initPlayer();
            playerView.onResume();
        }
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        if (Build.VERSION.SDK_INT <= 23) {
            playerView.onPause();
            releasePlayer();
        }
    }
    
  9. release() 메서드가 더 이상 필요하지 않을 때 YandexAdsLoader에서 를 호출합니다.

    override fun onDestroy() {
        releasePlayer()
        yandexAdsLoader.release()
        super.onDestroy()
    }
    
    @Override
    protected void onDestroy() {
        releasePlayer();
        yandexAdsLoader.release();
        super.onDestroy();
    }