네이티브 광고 고급형

NativeAd 표시

네이티브 광고가 로드되면 Google 모바일 광고 SDK가 해당 광고 형식의 리스너를 호출합니다. 그런 다음 앱이 광고를 표시해야 하는데, 즉시 표시할 필요는 없습니다. 시스템 정의 광고 형식을 보다 쉽게 표시할 수 있도록 SDK에서 아래와 같은 유용한 리소스를 제공합니다.

NativeAdView 클래스

NativeAd 형식의 경우 이에 상응하는 NativeAdView 클래스가 있습니다. 이 클래스는 게시자가 NativeAd의 루트로 사용해야 하는 ViewGroup입니다. NativeAdView 하나가 네이티브 광고 하나에 해당합니다. 광고의 애셋 (예: 스크린샷 애셋을 표시하는 ImageView)을 표시하는 데 사용되는 각 보기는 NativeAdView 객체의 하위 요소여야 합니다.

다음은 LinearLayout를 사용하여 애셋 보기를 표시하는 네이티브 광고의 보기 계층 구조에 대한 예입니다.

<com.google.android.gms.ads.nativead.NativeAdView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <LinearLayout
    android:orientation="vertical"
    ... >
        <LinearLayout
        android:orientation="horizontal"
        ... >
          <ImageView
           android:id="@+id/ad_app_icon"
           ... />
          <TextView
            android:id="@+id/ad_headline"
            ... />
         </LinearLayout>


         // Other assets such as image or media view, call to action, etc follow.
         ...
    </LinearLayout>
</com.google.android.gms.ads.nativead.NativeAdView>

다음은 NativeAdView를 만들고 NativeAd로 채우는 예입니다.

Java

AdLoader.Builder builder = new AdLoader.Builder(this, "AD_UNIT_ID")
    .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
        @Override
        public void onNativeAdLoaded(NativeAd nativeAd) {
            // Assumes you have a placeholder FrameLayout in your View layout
            // (with id fl_adplaceholder) where the ad is to be placed.
            FrameLayout frameLayout =
                findViewById(R.id.fl_adplaceholder);
            // Assumes that your ad layout is in a file call native_ad_layout.xml
            // in the res/layout folder
            NativeAdView adView = (NativeAdView) getLayoutInflater()
                .inflate(R.layout.native_ad_layout, null);
            // This method sets the text, images and the native ad, etc into the ad
            // view.
            populateNativeAdView(nativeAd, adView);
            frameLayout.removeAllViews();
            frameLayout.addView(adView);
        }
});

Kotlin

val builder = AdLoader.Builder(this, "AD_UNIT_ID")
    .forNativeAd { nativeAd ->
        // Assumes that your ad layout is in a file call native_ad_layout.xml
        // in the res/layout folder
        val adView = layoutInflater
                .inflate(R.layout.native_ad_layout, null) as NativeAdView
        // This method sets the text, images and the native ad, etc into the ad
        // view.
        populateNativeAdView(nativeAd, adView)
        // Assumes you have a placeholder FrameLayout in your View layout
        // (with id ad_frame) where the ad is to be placed.
        ad_frame.removeAllViews()
        ad_frame.addView(adView)
    }

특정 네이티브 광고의 모든 애셋은 NativeAdView 레이아웃 내에서 렌더링되어야 합니다. 네이티브 애셋이 네이티브 광고 보기 레이아웃 외부에서 렌더링되면 Google 모바일 광고 SDK에서 경고 기록을 시도합니다.

광고 보기 클래스에서도 개별 애셋에 사용되는 보기를 등록하는 데 사용되는 메서드와 NativeAd 객체 자체를 등록하는 메서드 하나를 제공합니다. 이 방법으로 뷰를 등록하면 SDK가 다음과 같은 작업을 자동으로 처리할 수 있습니다.

  • 클릭수 기록
  • 첫 픽셀이 화면에 표시될 때의 노출수 기록
  • 네이티브 백업 광고 소재의 AdChoices 오버레이 표시 (현재는 일부 게시자만 가능)

AdChoices 오버레이

백업 광고가 반환될 때 SDK가 AdChoices 오버레이를 광고 보기로 추가합니다. 앱에서 네이티브 광고 백업 광고를 사용하는 경우 네이티브 광고 보기에서 선호하는 모서리에 AdChoices 로고가 자동으로 삽입될 공간을 남겨두세요. 또한 AdChoices 오버레이가 눈에 잘 띄도록 배경색과 이미지를 적절히 선택하세요. 오버레이의 모양과 기능에 대해 자세히 알아보려면 프로그래매틱 네이티브 광고 구현 가이드라인을 참고하세요.

프로그래매틱 네이티브 광고의 광고 표시

프로그래매틱 네이티브 광고를 표시할 때 이 보기가 광고임을 나타내는 광고 표시를 표시해야 합니다. 정책 가이드라인에서 자세히 알아보세요.

코드 예시

네이티브 광고를 표시하는 단계는 다음과 같습니다.

  1. NativeAdView 클래스의 인스턴스를 만듭니다.
  2. 표시될 광고 애셋마다 다음과 같이 합니다.
    1. 애셋 보기를 광고 객체의 애셋으로 채웁니다.
    2. ViewGroup 클래스와 함께 애셋 보기를 등록합니다.
  3. 네이티브 광고 레이아웃에 대용량 미디어 애셋이 포함되어 있으면 MediaView를 등록합니다.
  4. 광고 객체를 ViewGroup 클래스와 함께 등록합니다.

다음은 NativeAd를 표시하는 함수의 예입니다.

Java

private void displayNativeAd(ViewGroup parent, NativeAd ad) {

    // Inflate a layout and add it to the parent ViewGroup.
    LayoutInflater inflater = (LayoutInflater) parent.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    NativeAdView adView = (NativeAdView) inflater
            .inflate(R.layout.ad_layout_file, parent);

    // Locate the view that will hold the headline, set its text, and call the
    // NativeAdView's setHeadlineView method to register it.
    TextView headlineView = adView.findViewById<TextView>(R.id.ad_headline);
    headlineView.setText(ad.getHeadline());
    adView.setHeadlineView(headlineView);

    ...
    // Repeat the above process for the other assets in the NativeAd
    // using additional view objects (Buttons, ImageViews, etc).
    ...

    // If the app is using a MediaView, it should be
    // instantiated and passed to setMediaView. This view is a little different
    // in that the asset is populated automatically, so there's one less step.
    MediaView mediaView = (MediaView) adView.findViewById(R.id.ad_media);
    adView.setMediaView(mediaView);

    // Call the NativeAdView's setNativeAd method to register the
    // NativeAdObject.
    adView.setNativeAd(ad);

    // Ensure that the parent view doesn't already contain an ad view.
    parent.removeAllViews();

    // Place the AdView into the parent.
    parent.addView(adView);
}

Kotlin

fun displayNativeAd(parent: ViewGroup, ad: NativeAd) {

    // Inflate a layout and add it to the parent ViewGroup.
    val inflater = parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)
            as LayoutInflater
    val adView = inflater.inflate(R.layout.ad_layout_file, parent) as NativeAdView

    // Locate the view that will hold the headline, set its text, and use the
    // NativeAdView's headlineView property to register it.
    val headlineView = adView.findViewById<TextView>(R.id.ad_headline)
    headlineView.text = ad.headline
    adView.headlineView = headlineView

    ...
    // Repeat the above process for the other assets in the NativeAd using
    // additional view objects (Buttons, ImageViews, etc).
    ...

    val mediaView = adView.findViewById<MediaView>(R.id.ad_media)
    adView.mediaView = mediaView

    // Call the NativeAdView's setNativeAd method to register the
    // NativeAdObject.
    adView.setNativeAd(ad)

    // Ensure that the parent view doesn't already contain an ad view.
    parent.removeAllViews()

    // Place the AdView into the parent.
    parent.addView(adView)
}

개별 작업은 다음과 같습니다.

  1. 레이아웃 확장

    Java

    LayoutInflater inflater = (LayoutInflater) parent.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    NativeAdView adView = (NativeAdView) inflater
            .inflate(R.layout.ad_layout_file, parent);
    

    Kotlin

    val inflater = parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)
            as LayoutInflater
    val adView = inflater.inflate(R.layout.ad_layout_file, parent) as NativeAdView
    

    이 코드는 네이티브 광고를 표시한 다음 NativeAdView에 대한 참조의 위치를 찾는 보기가 포함된 XML 레이아웃을 확장합니다. 프래그먼트나 활동에 기존 NativeAdView이 있는 경우 이를 재사용하거나 레이아웃 파일을 사용하지 않고 인스턴스를 동적으로 만들 수도 있습니다.

  2. 애셋 뷰 채우기 및 등록

    이 샘플 코드에서는 광고 제목을 표시하는 데 사용되는 보기의 위치를 찾고, 광고 객체가 제공하는 문자열 애셋을 이용해 문구를 설정하며, 이를 NativeAdView 객체와 함께 등록합니다.

    Java

    TextView headlineView = adView.findViewById<TextView>(R.id.ad_headline);
    headlineView.setText(ad.getHeadline());
    adView.setHeadlineView(headlineView);
    

    Kotlin

    val headlineView = adView.findViewById<TextView>(R.id.ad_headline)
    headlineView.text = ad.headline
    adView.headlineView = headlineView
    

    앱에서 표시하는 네이티브 광고 객체가 제공하는 애셋마다 보기의 위치를 찾고, 값을 설정하며, 이를 광고 보기 클래스와 함께 등록하는 과정을 반복해야 합니다.

  3. 클릭 처리하기

    네이티브 광고 보기를 통해 또는 네이티브 광고 보기 내에서 맞춤 클릭 핸들러를 구현하지 마세요. 클릭 이벤트를 직접 관찰하려면 광고 리스너를 사용하세요.

    이전 섹션에서 설명한 대로 애셋 보기를 올바르게 채우고 등록하면 SDK가 광고 보기 애셋의 클릭을 처리합니다.

    다음은 클릭 이벤트를 관찰하기 위해 광고 리스너를 사용하는 예입니다.

    Java

    AdLoader adLoader = new AdLoader.Builder(context, "/6499/example/native")
        ...
        .withAdListener(new AdListener() {
            @Override
            public void onAdFailedToLoad(LoadAdError adError) {
                // Handle the failure by logging, altering the UI, and so on.
            }
            @Override
            public void onAdClicked() {
                // Log the click event or other custom behavior.
            }
        })
        .build();
    

    Kotlin

    val adLoader = AdLoader.Builder(this, "/6499/example/native")
        ...
        .withAdListener(object : AdListener() {
            override fun onAdFailedToLoad(adError: LoadAdError) {
                // Handle the failure by logging, altering the UI, and so on.
            }
        })
        .build()
    
  4. MediaView 등록

    네이티브 광고의 레이아웃에 기본 이미지 애셋을 포함하려면 ImageView 애셋 대신 MediaView 애셋을 사용해야 합니다.

    MediaView는 기본 미디어 애셋(동영상 또는 이미지)을 표시하도록 설계된 특수 View입니다.

    MediaView는 XML 레이아웃에서 정의하거나 동적으로 생성할 수 있습니다. 다른 애셋 보기와 마찬가지로 NativeAdView의 보기 계층 구조 내에 배치되어야 합니다. MediaView를 사용하는 앱은 NativeAdView에 등록해야 합니다.

    Java

    MediaView mediaView = adView.findViewById(R.id.ad_media);
    adView.setMediaView(mediaView);
    

    Kotlin

    adView.mediaView = adView.findViewById<MediaView>(R.id.ad_media)
    

    모든 애셋 보기와 마찬가지로 미디어 보기에는 콘텐츠를 채워야 합니다. 이 작업은 getMediaContent() 메서드를 사용하여 MediaView에 전달할 수 있는 미디어 콘텐츠를 검색합니다. 다음은 미디어 뷰의 미디어 콘텐츠를 설정하는 코드 스니펫입니다.

    Java

    mediaView.setMediaContent(nativeAd.getMediaContent());
    

    Kotlin

    mediaView.mediaContent = nativeAd.mediaContent
    

    ImageScaleType

    이미지를 표시할 때 MediaView 클래스에는 ImageScaleType 속성이 있습니다. MediaView에서 이미지의 크기가 조정되는 방식을 변경하려면 MediaViewsetImageScaleType() 메서드를 사용하여 상응하는 ImageView.ScaleType를 설정하세요.

    Java

    mediaView.setImageScaleType(ImageView.ScaleType.CENTER_CROP);
    

    Kotlin

    mediaView.imageScaleType = ImageView.ScaleType.CENTER_CROP
    

    MediaContent

    MediaContent 클래스에는 MediaView 클래스를 사용하여 표시되는 네이티브 광고의 미디어 콘텐츠와 관련된 데이터가 포함됩니다. MediaView mediaContent 속성이 MediaContent 인스턴스와 함께 설정된 경우:

    • 동영상 애셋을 사용할 수 있으면 버퍼링 후 MediaView 안에서 재생되기 시작합니다. hasVideoContent()를 확인하면 동영상 애셋을 사용할 수 있는지 알 수 있습니다.

    • 광고에 동영상 애셋이 없으면 mainImage 애셋이 대신 다운로드되어 MediaView에 배치됩니다.

    기본적으로 mainImage가 처음 다운로드한 이미지 애셋입니다. setReturnUrlsForImageAssets(true)를 사용하면 mainImagenull이며 mainImage 속성을 수동으로 다운로드한 이미지에 설정해야 합니다. 사용 가능한 동영상 애셋이 없는 경우에만 이 이미지를 사용합니다.

  5. 네이티브 광고 객체 등록

    마지막 단계로, 네이티브 광고 객체를 표시하는 보기에 네이티브 광고 객체를 등록합니다.

    Java

    adView.setNativeAd(ad);
    

    Kotlin

    adView.setNativeAd(ad)
    

광고 삭제

네이티브 광고 게재가 끝나면 광고가 올바르게 폐기되도록 광고를 삭제해야 합니다.

Java

nativeAd.destroy();
        .inflate(R.layout.ad_layout_file, parent);

Kotlin

nativeAd.destroy()

네이티브 광고 코드 테스트

직접 판매 광고

직접 판매된 네이티브 광고가 어떤 광고인지 테스트하려면 다음과 같은 Ad Manager 광고 단위 ID를 사용해 보세요.

/6499/example/native

이 ID는 샘플 앱 설치 및 콘텐츠 광고는 물론 다음 애셋이 포함된 맞춤 네이티브 광고 형식을 게재하도록 구성되어 있습니다.

  • 광고 제목 (텍스트)
  • 기본 이미지 (이미지)
  • 캡션 (텍스트)

맞춤 네이티브 광고 형식의 템플릿 ID는 10063170입니다.

네이티브 백업 광고

현재 Ad Exchange 백업 광고는 일부 게시자에게만 제공되고 있습니다. 네이티브 백업 광고의 동작을 테스트하려면 다음 Ad Manager 광고 단위를 사용하세요.

/6499/example/native-backfill

이 광고 단위에서는 AdChoices 오버레이가 적용된 샘플 앱 설치 및 콘텐츠 광고를 게재합니다.

광고 단위를 게시하기 전에 실제 광고 단위 및 템플릿 ID를 참조하도록 코드를 업데이트해야 합니다.

GitHub의 예

네이티브 광고의 전체 구현 예:

자바 Kotlin

다음 단계

다음 주제를 살펴보세요.