Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

목차

개요

여기에서는 BuzzAd Android용 SDK의 Feed 지면에서 구현하는 기능을 설명하고 각 기능을 변경하는 방법을 설명합니다.

지면 상의 기능을 변경하거나 구현하려면 SDK에서 제공하는 기본 UI를 사용하거나 직접 클래스를 구현할 수 있습니다. 직접 클래스를 구현하려면 아래의 조건을 충족해야 하며, 아래 조건을 충족하지 않는 경우 자체 구현이 적용되지 않습니다.

  • 구현 클래스는 내부 클래스가 아니어야 합니다.

  • 내부 클래스로 생성해야 할 경우, public static 클래스로 구현해야 합니다.

프래그먼트로 Feed 연동하기

더 다양한 연동 방식을 제공하기 위해 BuzzAd Android용 SDK는 Feed 지면을 제공하는 기본 방식인 액티비티 외에도 프래그먼트를 통한 연동을 지원합니다.

프래그먼트로 Feed 지면을 연동하려면, 액티비티에 프래그먼트를 추가하고 해당 액티비티의 onCreate()에서 프래그먼트를 초기하세요.

다음은 FeedFragment를 연동하는 예시입니다.

class YourActivity extends Actvity {

  @Override
  public void onCreate() {
    super.onCreate();
    
    // 광고를 새로 할당 받기 위해 필요한 부분입니다.
    final BuzzAdFeed buzzAdFeed = new BuzzAdFeed.Builder().build();
    
    final FeedFragment feedFragment = buzzAdFeed.getFragment();
    getSupportFragmentManager()
      .beginTransaction()
      .replace(android.R.id.content, feedFragment)
      .commitAllowingStateLoss();
  }
}

FeedFragment의 UI를 변경하려면 Feed 디자인 커스터마이징 토픽을 참고하세요.

개인 정보 수집 동의 UI

개인 정보 보호법과 구글 정책에 따라, 개인 정보 수집 및 사용에 대한 사용자의 동의가 필요합니다. BuzzAd Andorid용 SDK는 동의를 얻기 위한 UI를 제공하며, 사용자가 개인 정보 수집에 동의하지 않으면, Feed 지면에 광고가 할당되지 않습니다. Feed 지면에 처음 진입한 사용자에게는 아래와 같은 UI가 표시됩니다.

BuzzAd Andorid용 SDK의 개인 정보 수집 동의 UI를 사용하지 않거나 다시 표시하고 싶은 경우 아래 표를 참고하세요.

Class

API

설명

BuzzAdBenefit

getPrivacyPolicyManager()(정적 메소드)

PrivacyPolicyManager 인스턴스를 반환합니다.

PrivacyPolicyManager

showConsentUI(context, new PrivacyPolicyEventListener())

개인 정보 수집 동의 UI를 표시합니다.

grantConsent()

개인 정보 수집에 동의합니다.
사용자가 처음 Feed 지면에 진입하기 전에 호출하면 사용자에게 개인 정보 수집 동의 UI가 보이지 않습니다.

revokeConsent()

개인 정보 수집 동의를 철회합니다.
사용자가 동의를 철회하고 Feed 지면에 진입하는 경우, 개인 정보 수집 동의 UI가 다시 표시됩니다.

isConsentGranted()

개인 정보 수집 동의 여부를 확인합니다.

PrivacyPolicyEventListener

onUpdated(accepted: Boolean)

showConsentUI를 호출하면 보여지는 UI에서 사용자가 동의하면 accepted가 True 로 호출됩니다. 미동의 시에는 accepted가False로 호출됩니다.

광고 분류 기능

Feed 광고 분류 기능은 탭과 필터 UI를 사용하여 유형 별로 분류된 광고를 사용자에게 보여주는 기능입니다. 탭과 필터 기능을 사용하면 사용자가 참여하고 싶은 유형의 광고만 볼 수 있어 사용자의 광고 참여 경험과 광고 효율을 높일 수 있습니다.

광고 분류 기능에 대한 설정은 앱에서 코드를 수정하거나 재배포 하지 않고 변경할 수 있습니다. 설정을 변경하려면 버즈빌 담당자에게 연락하세요.

광고 분류 탭과 필터

탭의 갯수, 탭의 이름, 탭으로 모아서 게재할 광고 유형을 설정할 수 있습니다. 탭은 최대 3개까지 설정할 수 있으며, 초기에는 광고 적립, 쇼핑 적립 탭이 설정됩니다. 이 중에서 광고 적립 탭에는 쇼핑 광고를 제외한 나머지 유형의 광고가 노출되며, 쇼핑 적립 탭에는 쇼핑 광고가 노출됩니다.

탭으로 분류할 수 있는 광고의 유형은 노출형 광고, 참여형 광고, 비디오 광고, 소셜미디어 광고, 쇼핑 광고입니다. 각 탭은 한 개 이상의 광고 유형으로 구성할 수 있습니다. 단, 쇼핑 광고의 경우 다른 광고 유형과 함께 탭으로 구성할 수 없습니다. 탭이 여러 개의 광고 유형으로 구성되면 ‘클릭하기’, ‘참여하기’ 등 광고 유형을 세분화하는 필터 UI가 노출됩니다.

무한 스크롤 기능

Feed 무한 스크롤 기능은 사용자가 Feed에 진입해 할당된 광고 목록을 끝까지 스크롤 해 더 이상 볼 수 있는 광고가 없으면 자동으로 추가 광고를 할당해 기능입니다. 이 기능은 기본적으로 활성화 되어 있으며, 앱에서 코드를 수정하거나 재배포를 하지 않고 무한 스크롤 기능의 활성화 여부를 설정할 수 있습니다. 설정을 변경하려면 버즈빌 담당자에게 연락하세요.

툴바 자체 구현하기

Feed 툴바의 디자인을 변경할 수 있습니다. 툴바 영역의 UI를 변경하는 방법은 2가지입니다. 아래 2가지 방법 중 하나를 선택하여 연동하세요.

프래그먼트(FeedFragment)로 Feed 지면을 연동한 경우에는 툴바를 자체 구현할 수 없습니다.

SDK 기본 UI 사용하기

BuzzAd Android용 SDK에서 제공하는 기본 UI를 수정하여 타이틀 혹은 배경색을 변경할 수 있습니다.

다음은 기본 UI를 수정하여 툴바를 변경하는 예시입니다.이 예시에서는 DefaultFeedToolbarHolder를 상속받은 클래스를 구현하고, 기본 UI인 FeedToolbar를 사용하여 타이틀 혹은 배경색을 변경합니다. 그리고 FeedConfig에 구현한 클래스를 추가합니다.

public class YourFeedToolbarHolder extends DefaultFeedToolbarHolder {

    @Override
    public View getView(Activity activity, @NonNull final String unitId) {
        toolbar = new FeedToolbar(activity); // FeedToolbar 에서 제공하는 기본 템플릿을 사용합니다.
        toolbar.setTitle("YourFeedToolbarHolder");
        toolbar.setIconResource(R.drawable.your_icon);
        toolbar.setBackgroundColor(Color.parseColor("#123456"));

        addInquiryMenuItemView(activity); // 문의하기 버튼은 이 함수를 통해 추가할 수 있습니다.
        addSettingsMenuItemView(activity); // 세팅 버튼은 이 함수를 통해 추가할 수 있습니다.
        addRightMenuItemView1(activity); // 커스터마이징한 버튼 추가할 수 있습니다.
        return toolbar;
    }

    // 커스터마이징한 버튼을 추가하려면 DefaultMenuLayout 를 사용하여 View 를 생성하고
    // toolbar.addRightMenuButton 를 사용하여 toolbar 에 추가합니다.
    private void addRightMenuItemView1(@NonNull final Activity activity) {
        MenuLayout menuLayout = new DefaultMenuLayout(activity, R.mipmap.ic_launcher);
        menuLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showInquiry(); // showInquiry 를 호출하여 문의하기 페이지로 연결합니다.
            }
        });
        toolbar.addRightMenuButton(menuLayout);
    }
}
final FeedConfig feedConfig = new FeedConfig.Builder("YOUR_FEED_UNIT_ID")
        .feedToolbarHolderClass(YourFeedToolbarHolder.class)
        .build();

직접 구현한 Custom View 사용하기

BuzzAd Android용 SDK에서 제공하는 UI를 사용하지 않고 직접 Custom View를 구현하여 툴바를 변경할 수 있습니다.

Custom View를 직접 생성하여 툴바를 변경하려면 아래에 순서에 따라 구현하세요.

  1. DefaultFeedToolbarHolder의 서브클래스를 생성하세요.

  2. 툴바 Custsom View를 your_toolbar_header_layout.xml에 구현하세요.

  3. FeedConfig 객체를 생성하고, feedToolbarHolderClass()DefaultFeedToolbarHolder 서브클래스를 추가하세요.

public class YourFeedToolbarHolder extends DefaultFeedToolbarHolder {

    @Override
    public View getView(final Activity activity, @NonNull final String unitId) {
        final LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        return inflater.inflate(R.layout.your_toolbar_header_layout, null);
    }

    @Override
    public void onTotalRewardUpdated(int totalReward) {
        // 적립 가능한 리워드를 UI에 적용할 수 있습니다.
    }
}
final FeedConfig feedConfig = new FeedConfig.Builder("YOUR_FEED_UNIT_ID")
        .feedToolbarHolderClass(YourFeedToolbarHolder.class)
        .build();

직접 구현한 툴바 높이 값 수정하기

Custom View의 높이가 안드로이드 액티비티의 기본 액션바 높이와 다를 경우, 직접 구현한 View가 정상적으로 보이지 않을 수 있습니다. 이 경우에는 BuzzAdFeedTheme 객체의 toolbarHeight() 속성에 툴바의 높이 값을 수정하세요.

final BuzzAdFeedTheme buzzAdFeedTheme = 
        BuzzAdFeedTheme.getDefault()
            .toolbarHeight(R.dimen.YOUR_TOOL_BAR_HEIGHT);
BuzzAdFeed.setDefaultTheme(buzzAdFeedTheme);

헤더 영역 자체 구현하기

Feed 헤더 영역을 자유롭게 활용할 수 있습니다. 예를 들어, Feed 영역을 설명하는 공간으로 활용하거나 적립 가능한 금액을 표시할 수도 있습니다.

다음은 헤더 영역을 변경하는 예시입니다.

FeedHeaderViewAdapter 인터페이스를 구현하는 클래스를 생성하고 Custom View(your_feed_header_layout)를 헤더 영역에 구현합니다. 그리고 FeedConfigfeedHeaderViewAdapterClass() 속성에 구현한 클래스를 추가합니다.

public class CustomFeedHeaderViewAdapter implements FeedHeaderViewAdapter {

    @Override
    public View onCreateView(final Context context, final ViewGroup parent) {
        final LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        return inflater.inflate(R.layout.your_feed_header_layout, parent, false);
    }

    @Override
    public void onBindView(final View view, final int reward) {
        // Display total reward on the header if needed.
        val textView: TextView = view.findViewById(R.id.your_textview)
        textView.text = String.format("리워드 %d원", reward)
    }
    
    @Override 
    public void onDestroyView() {
        // Use this this callback for clearing memory 
    }
}
final FeedConfig feedConfig = new FeedConfig.Builder("YOUR_FEED_UNIT_ID")
        .feedHeaderViewAdapterClass(CustomFeedHeaderViewAdapter.class)
        .build();

기본 적립 포인트 알림 팝업 자체 구현하기

사용자가 Feed 지면에 접근하면 일정 주기로 광고에 참여하지 않아도 기본 포인트를 지급합니다. 기본 적립 포인트 지급 알림 팝업을 직접 구현하고 디자인을 변경하여 사용자 경험을 개선할 수 있습니다.

다음은 기본 적립 포인트 지급 알림 팝업을 직접 구현하는 예시입니다.

  1. BaseRewardNotificationAdapter 인터페이스를 구현하는 클래스를 생성하세요.

    public class CustomBaseRewardNotificationAdapter implements BaseRewardNotificationAdapter {
        
        @NonNull
        @Override
        public View onCreateView(@NonNull Context context, @NonNull ViewGroup viewGroup) {
            return LayoutInflater.from(context).inflate(R.layout.YOUR_LAYOUT, viewGroup, false);
        }
    
        @Override
        public void onBindView(@NonNull View view, int reward) {
            TextView textView = view.findViewById(R.id.YOUR_TEXT_ID);
            textView.setText(reward + " 포인트가 적립되었습니다.");
        }
    }
  2. FeedConfig에서 이전 단계에서 생성한 CustomBaseRewardNotificationAdapter를 설정하세요.

    final FeedConfig feedConfig = new FeedConfig.Builder("YOUR_FEED_UNIT_ID")
          .baseRewardNotificationAdapterClass(CustomBaseRewardNotificationAdapter.class)
          .build();

광고 디자인 자체 구현하기

BuzzAd Android SDK에서 제공하는 광고는 일반 광고와 쇼핑 적립 광고가 있습니다. 쇼핑 적립형 광고는 사용자가 광고를 통해 물건 구매를 달성하는 경우 사용자에게 구매 금액의 일정 비율을 포인트로 돌려주는 광고입니다. 일반 광고는 쇼핑 적립형 광고를 제외한 나머지 유형의 광고입니다.

일반 광고와 쇼핑 적립 광고는 광고를 표현할 수 있는 다양한 정보로 구성됩니다. 일반 광고와 쇼핑 적립 광고를 구성하는 정보와 UI에 대해서는 아래의 표를 참고하세요.

광고 유형

항목

설명

공통(일반, 쇼핑 적립)

필수 광고 제목

광고의 제목입니다. 최대 10자까지 권장하며, 필요에 따라 글자 수에 상관 없이 일정 부분은 생략 부호도 대체할 수 있습니다.

필수 광고 소재

이미지, 동영상 등 광고 소재입니다. 광고 소재의 종횡비는 반드시 유지해야 합니다.

  • com.buzzvil.buzzad.benefit.presentation.media.MediaView를 사용해서 표시해야 합니다.

  • 사이즈: 1,200 x 627 (px)

  • 여백을 추가할 수 있습니다. 자세한 내용은 버즈빌 매니저에게 문의하세요.

필수 광고 설명

광고에 대한 상세 설명입니다. 최대 40자까지 권장하며, 필요에 따라 글자 수에 상관 없이 일정 부분은 생략 부호도 대체할 수 있습니다.

필수 광고주 아이콘

광고주 아이콘 이미지입니다. 아이콘의 종횡비는 반드시 유지해야 합니다.

  • 사이즈: 80 x 80 (px)

필수 CTA 버튼

광고의 참여를 유도하는 버튼입니다. 최대 7자까지 권장하며, 필요에 따라 글자 수에 상관 없이 일정 부분은 생략 부호도 대체할 수 있습니다.

  • com.buzzvil.buzzad.benefit.presentation.media.DefaultCtaView를 사용해서 표시해야 합니다.

CTA 버튼의 디자인을 변경하려면 CTA 버튼 커스터마이징 토픽을 참고하세요.

권장 광고 알림 문구

광고임을 명시하는 문구입니다. (예: 광고, ad, 스폰서, Sponsored)

쇼핑 적립

권장 OriginalPrice View

상품의 원가를 표시합니다.

권장 Price View

상품의 할인된 가격을 표시합니다.

권장 DiscountRate View

상품 가격의 할인율을 표시합니다. 할인율은 원가와 할인가로 비교하여 산출해서 표시해야 합니다.

일반 광고 디자인 자체 구현하기

일반 광고의 디자인을 변경하려면 다음의 절차를 따르세요.

  1. 일반 광고용 NativeAdView의 규격에 맞는 레이아웃(your_feed_ad.xml)을 구현하세요.

    <!-- your_feed_ad.xml -->
    
    <com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView
        android:id="@+id/native_ad_view" ...>
        
        <!-- MediaView와 DefaultCtaView는 NativeAdView의 하위 컴포넌트로 구현해야 합니다. -->
        
        <LinearLayout ... >
            <com.buzzvil.buzzad.benefit.presentation.media.MediaView
                android:id="@+id/mediaView" ... />
            <TextView
                android:id="@+id/textTitle" ... />
            <TextView
                android:id="@+id/textDescription" ... />
            <ImageView
                android:id="@+id/imageIcon" ... />
            <com.buzzvil.buzzad.benefit.presentation.media.DefaultCtaView
                android:id="@+id/ctaView" ... />
        </LinearLayout>
        
    </com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView>

  2. AdsAdapter의 상속 클래스를 구현하세요.

    • onCreateViewHolder에서 your_feed_ad.xml을 사용하여 NativeAdView를 생성하세요.

    • onBindViewHolder에서 NativeAdViewBinder를 이용하여 광고 데이터(NativeAd)를 앞서 생성한 NativeAdView에 바인딩하세요.

      public class CustomAdsAdapter extends AdsAdapter<AdsAdapter.NativeAdViewHolder> {
      
          @NonNull
          @Override
          public NativeAdViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
              final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
              final NativeAdView feedNativeAdView = (NativeAdView) inflater.inflate(R.layout.your_feed_ad, parent, false);
              return new NativeAdViewHolder(feedNativeAdView);
          }
      
          @Override
          public void onBindViewHolder(NativeAdViewHolder holder, NativeAd nativeAd) {
              super.onBindViewHolder(holder, nativeAd);
              final NativeAdView view = (NativeAdView) holder.itemView;
              
              // 광고 레이아웃 컴포넌트를 생성합니다.
              final MediaView mediaView = view.findViewById(R.id.mediaView);
              final LinearLayout titleLayout = view.findViewById(R.id.titleLayout);
              final TextView titleView = view.findViewById(R.id.textTitle);
              final ImageView iconView = view.findViewById(R.id.imageIcon);
              final TextView descriptionView = view.findViewById(R.id.textDescription);
              final DefaultCtaView ctaView = view.findViewById(R.id.ctaView);
      
              // 광고 데이터(NativeAd)를 바인딩합니다.
              final NativeAdViewBinder viewBinder = new NativeAdViewBinder.Builder(view, mediaView)
                  .titleTextView(titleView)
                  .descriptionTextView(descriptionView)
                  .iconImageView(iconView)
                  .ctaView(ctaView)
                  .build();
              viewBinder.bind(nativeAd);
          }
      }
    • NativeAdEventListener 를 통해 광고 콜백 이벤트 수신 기능을 부가적으로 추가할 수도 있습니다.

      public class CustomAdsAdapter extends AdsAdapter<AdsAdapter.NativeAdViewHolder> {
          private NativeAdEventListener listener;
              
          // 부가 기능: 광고 콜백 이벤트 수신 기능을 추가합니다.
          
          @Override
          public void onBindViewHolder(NativeAdViewHolder holder, NativeAd nativeAd) {
              ...생략...
              
              viewBinder.bind(nativeAd);
          
              if (listener != null) {
                  nativeAd.removeNativeAdEventListener(listener);
              }
              listener = buildNativeAdEventListener(holder.itemView);
              nativeAd.addNativeAdEventListener(listener);
          } 
            
            
          
          private NativeAdEventListener buildNativeAdEventListener(@NonNull View view) {
              return new NativeAdEventListener() {
                  @Override
                  public void onImpressed(final @NonNull NativeAd nativeAd) {
          
                  }
          
                  @Override
                  public void onClicked(@NonNull NativeAd nativeAd) {
          
                  }
          
                  @Override
                  public void onRewardRequested(@NonNull NativeAd nativeAd) {
          
                  }
          
                  @Override
                  public void onRewarded(@NonNull NativeAd nativeAd, @Nullable RewardResult nativeAdRewardResult) {
                      Toast.makeText(view.getContext(), "onRewarded: " + nativeAdRewardResult, Toast.LENGTH_SHORT).show();
                  }
          
                  @Override
                  public void onParticipated(final @NonNull NativeAd nativeAd) {
          
                  }
              };
          }
      }
  3. FeedConfig에 위에서 작성한 CustomAdsAdapter를 광고 어댑터 클래스로 설정하세요.

    final FeedConfig feedConfig = new FeedConfig.Builder(context, "YOUR_FEED_UNIT_ID")
            .adsAdapterClass(CustomAdsAdapter.class)
            .build();

쇼핑 적립 광고 디자인 자체 구현하기

쇼핑 적립 광고의 디자인을 변경하려면 다음의 절차를 따르세요.

  1. 쇼핑 적립 광고용 NativeAdView의 규격에 맞는 레이아웃(your_feed_ad_cps.xml)을 구현하세요.

    • 일반 광고용 레이아웃에서 priceText, originalPriceText, discountPercentageText를 추가해야 합니다.

      <!-- your_feed_ad_cps.xml -->
      
      <?xml version="1.0" encoding="utf-8"?>
      <com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView
          android:id="@+id/native_ad_view">
          <LinearLayout>
              <!-- MediaView와 DefaultCtaView는 NativeAdView의 하위 컴포넌트로 구현합니다. -->        
              <com.buzzvil.buzzad.benefit.presentation.media.MediaView
                  android:id="@+id/mediaView"
                  ...생략... />
              <TextView
                  android:id="@+id/priceText"
                  ...생략... />
              <TextView
                  android:id="@+id/originalPriceText"
                  ...생략... />
              <TextView
                  android:id="@+id/discountPercentageText"
                  ...생략... />
          </LinearLayout>
      </com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView>

  2. 일반 광고 디자인 자체 구현하기 토픽을 참고해 AdsAdapter의 상속 클래스를 구현하세요.
    다음의 예시 코드를 참고하세요.

    public class CustomCPSAdsAdapter extends AdsAdapter<AdsAdapter.NativeAdViewHolder> {
    
        @NonNull
        @Override
        public NativeAdViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            final NativeAdView feedNativeAdView = (NativeAdView) inflater.inflate(R.layout.your_feed_ad_cps, parent, false);
            return new NativeAdViewHolder(feedNativeAdView);
        }
    
        @Override
        public void onBindViewHolder(NativeAdViewHolder holder, NativeAd nativeAd) {
            super.onBindViewHolder(holder, nativeAd);
            final NativeAdView view = (NativeAdView) holder.itemView;
            
            // 광고 레이아웃 컴포넌트를 생성합니다.
            ...생략...
            final TextView priceText = view.findViewById(R.id.discountedPriceText);
            final TextView originalPriceText = view.findViewById(R.id.originalPriceText);
            final TextView discountPercentageText = view.findViewById(R.id.discountPercentageText);
    
            // 광고 데이터(NativeAd)를 바인딩합니다. 
            ...생략...
            final Product product = nativeAd.getShoppingProduct();
            if (product != null) {
                if (product.getDiscountedPrice() != null) {
                    // 할인이 있는 쇼핑 광고
                    originalPriceText.setPaintFlags(originalPriceText.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
                    int percentage = 0;
                    if (product.getPrice() > product.getDiscountedPrice()) {
                        percentage = Math.round(((product.getPrice() - product.getDiscountedPrice()) / product.getPrice() * 100));
                    }
                    if (percentage > 0) {
                        priceText.setText(getCommaSeparatedPrice(product.getDiscountedPrice().longValue()));
                        originalPriceText.setText(getCommaSeparatedPrice((long) product.getPrice()));
                        discountPercentageText.setText(String.format(Locale.ROOT, "%d%%", percentage));
                        discountPercentageText.setVisibility(View.VISIBLE);
                    } else {
                        priceText.setText(getCommaSeparatedPrice((long) product.getPrice()));
                        originalPriceText.setText("");
                        discountPercentageText.setVisibility(View.GONE);
                    }
                } else {
                    // 할인이 없는 쇼핑 광고
                    priceText.setText(getCommaSeparatedPrice((long) product.getPrice()));
                    originalPriceText.setText("");
                    discountPercentageText.setVisibility(View.GONE);
                }
            }
            
            final NativeAdViewBinder viewBinder = new NativeAdViewBinder.Builder(view, mediaView)
                .descriptionTextView(descriptionView)
                .ctaView(ctaView)
                // 부가 기능: 텍스트를 클릭할 수 있도록 설정합니다.
                .addClickableView(discountPercentageText)
                .addClickableView(priceText)
                .addClickableView(originalPriceText)
                .build()
            viewBinder.bind(nativeAd)
            
            ...생략...
        }
    
        private String getCommaSeparatedPrice (long price){
            return String.format(Locale.getDefault(), "₩%,d", price);
        }
    }

  3. FeedConfig에 위에서 작성한 CustomCPSAdsAdapter를 쇼핑 적립형 광고 어댑터 클래스로 설정하세요.

    final FeedConfig feedConfig = new FeedConfig.Builder("YOUR_FEED_UNIT_ID")
            .cpsAdsAdapterClass(YourCPSAdsAdapter.class)
            .build();

CTA 버튼 자체 구현하기

BuzzAd Android용 SDK에서 기본으로 제공하는 UI를 사용하지 않고 직접 구현할 수 있습니다.

CTA 버튼을 직접 구현하려면 다음의 절차를 따르세요.

  1. 뷰 레이아웃(view_customized_cta.xml)을 구현하세요.
    다음은 레이아웃 리소스로 뷰 레이아웃을 구현한 예시입니다.

    <!-- view_customized_cta.xml -->
    
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimaryDark">
        <!-- CTA 버튼의 텍스트 -->    
        <TextView
            android:id="@+id/textCta">
            
        <!-- CTA 버튼의 아이콘 이미지 -->
        <ImageView
            android:id="@+id/imageReward"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:src="아이콘 이미지 리소스" />
    
        <!-- CTA 버튼의 리워드 텍스트 -->
        <TextView
            android:id="@+id/textReward">
    </LinearLayout>
  2. CtaView 클래스를 상속하는 서브클래스인 CustomCtaView를 생성하세요.

  3. CtaView 클래스에서 사용하던 CTA View 레이아웃을 inflate하도록 구현하세요.

  4. 사용자의 광고 참여 상태에 따라 호출되는 아래의 오버라이딩 메소드에서 CTA 버튼의 아이콘 이미지, 텍스트, 리워드 값을 구현하세요.

    • renderViewParticipatingState : 사용자가 광고에 참여 중인 상태 (예: 액션형 광고의 랜딩 페이지에 진입한 상태)

    • renderViewParticipatedState : 사용자가 광고 참여를 완료한 상태

    • renderViewRewardAvailableState : 사용자가 아직 광고에 참여하지 않은 상태

    • renderViewRewardNotAvailableState : 사용자가 획득할 리워드가 없는 광고

      public class CustomCtaView extends CtaView {
          private final ImageView rewardImageView;
          private final TextView rewardTextView;
          private final TextView ctaTextView;
          
          public CustomCtaView(@NonNull Context context) {
              this(context, null);
          }
      
          public CustomCtaView(@NonNull Context context, @Nullable AttributeSet attrs) {
              this(context, attrs, 0);
          }
      
          public CustomCtaView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
              super(context, attrs, defStyleAttr);
              // TODO:  기존에 사용하던 CTA View 레이아웃을 inflate 하도록 구현하세요.
              inflate(getContext(), R.layout.view_customized_cta, this);
              this.rewardImageView = findViewById(R.id.imageReward);
              this.rewardTextView = findViewById(R.id.textReward);
              this.ctaTextView = findViewById(R.id.textCta);        
          }
      
          // CTA 텍스트 설정
          public void setCtaText(String ctaText) {
              ctaTextView.setText(ctaText);
          }
          // CTA 리워드 값 설정
          public void setRewardText(String rewardText) {
              rewardTextView.setText(rewardText);
          }
          // CTA 아이콘 설정
          public void setRewardIcon(@DrawableRes int iconResId) {
              rewardImageView.setImageResource(iconResId);
              rewardImageView.setVisibility(View.VISIBLE);
          }
          // CTA 아이콘 숨기기 처리
          public void hideRewardIcon() {
              rewardImageView.setVisibility(View.GONE);
          }   
          
          // 사용자가 광고에 참여 중인 상태
          @Override
          public void renderViewParticipatingState(@NonNull String callToAction) {
              setCtaText("참여 확인 중");
              hideRewardIcon();
              setRewardText("");
          }
          // 사용자가 광고 참여를 완료한 상태
          @Override
          public void renderViewParticipatedState(@NonNull String callToAction) {
              setRewardIcon(R.drawable.my_participated_icon);
              setRewardText("");
              setCtaText("참여 완료");
          }
          // 사용자가 아직 광고에 참여하지 않은 상태
          @Override
          public void renderViewRewardAvailableState(@NonNull String callToAction, int reward) {
              setRewardIcon(R.drawable.my_reward_icon);
              setRewardText(String.format(Locale.US, "+%,d", reward));
              setCtaText(callToAction);
          }
          // 사용자가 획득할 리워드가 없는 광고
          @Override
          public void renderViewRewardNotAvailableState(@NonNull String callToAction) {
              hideRewardIcon();
              setRewardText("");
              setCtaText(callToAction);
          }
      }
  5. 새로 생성한 CustomCtaView 클래스의 경로를 Feed 광고 레이아웃에 설정하세요.
    다음은 Feed 광고의 레이아웃 예시입니다.

    <com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView
        android:id="@+id/native_ad_view">
        <com.buzzvil.buzzad.benefit.presentation.media.MediaView
            android:id="@+id/mediaView"/>
        <TextView
            android:id="@+id/textTitle"/>
        <TextView
            android:id="@+id/textDescription"/>    
        <ImageView
            android:id="@+id/imageIcon"/>        
        <!-- TODO: 새로 생성한 CustomCtaView 클래스 경로를 설정합니다. -->
        <com.your.packagename.CustomCtaView
            android:id="@+id/customCtaView"/>
    </com.buzzvil.buzzad.benefit.presentation.nativead.NativeAdView> 
  6. 다음 순서에 따라 직접 구현한 CTA 버튼을 Feed 광고에 반영하세요.

    1. Feed 광고 레이아웃에서 NativeAdView와 커스텀 CTA 버튼인 CustomCtaView를 가져오세요.

    2. loadAd()메소드를 호출한 후 Feed 광고가 성공적으로 할당되어 onAdLoaded 콜백 메소드가 호출되면, NativeAdViewBinderctaView 속성을 customCtaView로 설정하세요.

    3. bind()를 호출하여 광고 레이아웃에 광고 데이터를 바인딩하세요.

      // TODO: Feed 광고 레이아웃에서 NatieAdView와 구성 요소를 가져옵니다.  
      final NativeAdView nativeAdView = findViewById(R.id.your_native_ad_view);
      //... 생략 ...
      // TODO: Feed 광고 레이아웃에서 CustomCtaView를 가져옵니다. 
      final CustomCtaView customCtaView = nativeAdView.findViewById(R.id.customCtaView); 
      
      final NativeAdRequest nativeAdRequest = new NativeAdRequest.Builder().build();
      final BuzzAdNative buzzAdNative = new BuzzAdNative("YOUR_NATIVE_UNIT_ID");
      
      buzzAdNative.loadAd(nativeAdRequest, new BuzzAdNative.AdLoadListener() {
          @Override
          public void onAdLoaded(@NotNull NativeAd nativeAd) {
              // 할당된 광고가 있으면 호출됩니다. 
              // TODO: 광고 데이터를 바인딩할 때, ctaView 속성을 customCtaView로 설정합니다.
              final NativeAdViewBinder viewBinder = new NativeAdViewBinder.Builder(nativeAdView, mediaView)
                  .titleTextView(titleTextView)
                  .descriptionTextView(descriptionTextView)
                  .iconImageView(iconImageView)
                  .ctaView(customCtaView)
                  .build();
              viewBinder.bind(nativeAd);
          }
          // ... 생략 ...
      });

SDK에서 제공하는 DefaultCtaView로 구현한 CTA 버튼의 디자인을 변경하려면 CTA 버튼 커스터마이징하기 토픽을 참고하세요.

사용자 프로필 입력 배너 노출 여부 설정하기

사용자가 출생연도 또는 성별 정보를 제공하지 않으면 헤더 영역에 프로필 정보를 입력하는 배너가 기본적으로 노출됩니다. FeedConfig를 수정하여 프로필 정보 입력 배너의 노출 여부를 설정할 수 있습니다. 다음은 프로필 입력 배너를 표시하지 않는 예시입니다.

final FeedConfig feedConfig = new FeedConfig.Builder("YOUR_FEED_UNIT_ID")
        .profileBannerEnabled(false) // 프로필 배너 미노출
        .build(); 

FeedConfig.feedHeaderViewAdapterClass를 맞춤 구현하고 있다면 프로필 입력 배너 노출 여부를 설정할 수 없습니다.

  • No labels