전면형 광고
전면형 광고는 자연스러운 앱 전환 중에 게재되는 광고로써 Full screen 형태의 광고입니다.
시작하기 앞서
-
광고 호출을 위해 Ad Unit ID가 필요합니다.
NAM Admin을 통해 광고 공급자 설정, Inventory 설정, 광고 유닛 등록 등의 과정을 마무리하여 주시기 바랍니다.
관련 내용은 NAM 관리자에게 문의 부탁드립니다.
-
광고 상위에 다른 View가 있다면 노출 측정이 제대로 되지 않아 성과 지표 측정에 불이익이 있을 수 있습니다.
[Step 1] NAM SDK 적용 완료
이하 내용은 NAM SDK 적용이 완료된 상태를 가정하고 진행합니다.
[Step 2] (샘플을 위한 옵션) 레이아웃 추가
배너 광고나 네이티브 광고 등은 로드 완료가 되면 광고가 노출되게 됩니다.
하지만 전면형 광고는 로드 이후 광고를 보여주는 메소드가 별도로 있습니다.
샘플에서는 load 와 show 각 단계를 구별하기 위해 show 버튼을 만들어 사용합니다.
또한 전면형 광고는 별도의 Ad Container
없이 activity context를 받아 광고를 보여줍니다.
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".InterstitialFragment">
<Button
android:id="@+id/show_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:text="SHOW" />
</androidx.constraintlayout.widget.ConstraintLayout>
[Step 3] 광고 객체(GfpInterstitialAdManager)와 요청 파라미터(AdParam) 생성
광고 요청 파라미터의 경우 Ad Unit ID
는 필수 값 입니다.
그 외의 값은 선택적이고 광고 요청 정보를 참고해 주시기 바랍니다.
전면형 광고는 별도의 Manager 객체를 생성하여 관리합니다.
이때 activity context
가 필요합니다. 일부 DSP 에서는 activity context
를 넘겨주지 않는 경우 오동작 할 수 있습니다.
- Kotlin
- Java
val adParam = AdParam.Builder().setAdUnitId(AD_UNIT_ID).build()
val interstitialAdManager = GfpInterstitialAdManager(requireActivity(), adParam)
AdParam adParam = new AdParam.Builder().setAdUnitId(AD_UNIT_ID).build();
GfpInterstitialAdManager interstitialAdManager = new GfpInterstitialAdManager(requireActivity(), adParam);
[Step 4] 광고 이벤트 수신
GfpInterstitialAdManager
instance 에 아래와 같이 InterstitialAdListener
를 설정하여 노출, 클릭 등 다양한 광고 이벤트를 수신할 수 있습니다.
- Kotlin
- Java
interstitialAdManager.setAdListener(object: InterstitialAdListener() {
override fun onAdLoaded(ad: GfpInterstitialAd) {
// 광고 로드 성공 시
}
override fun onAdStarted(ad: GfpInterstitialAd) {
// 광고가 정상적으로 보여지기 시작했을 때
}
override fun onAdClicked(ad: GfpInterstitialAd) {
// 광고가 클릭됐을 때
}
override fun onAdClosed(ad: GfpInterstitialAd) {
// 광고가 close(완료)됐을 때)
}
override fun onError(ad: GfpInterstitialAd, error: GfpError) {
// 광고 로드 실패 또는 렌더링 도중에 에러 발생 시
}
})
interstitialAdManager.setAdListener(new InterstitialAdListener() {
@Override
public void onAdLoaded(GfpInterstitialAd ad) {
// 광고 로드 성공 시
}
@Override
public void onAdStarted(GfpInterstitialAd ad) {
// 광고가 정상적으로 보여지기 시작했을 때
}
@Override
public void onAdClicked(GfpInterstitialAd ad) {
// 광고가 클 릭됐을 때
}
@Override
public void onAdClosed(GfpInterstitialAd ad) {
// 광고가 close(완료)됐을 때
}
@Override
public void onError(GfpInterstitialAd ad, GfpError error) {
// 광고 로드 실패 또는 렌더링 도중에 에러 발생 시
}
});
[Step 5] 광고 로드 및 게재 (Show)
GfpInterstitialAdManager
의 설정이 마무리 되었다면loadAd()
를 통해 광고를 로드할 수 있습니다.- 만약 광고가 성공적으로 로드 됐다면, 광고를 게재할 수 있습니다.
-
광고를 게재하기 전에 선택적으로
isAdInvalidated()
를 호출함으로써 광고 유효성을 체크할 수 있습니다.해당 메서드 결과가 true라면, 해당 광고는 유효하지 않은 상태이므로 광고 제공자에 따라서 광고는 보여지지만
정상적으로 과금이 발생하지 않는 상황이 발생 할 수 있습니다.
참고로 DSP 마다 광고의 유효 시간이 있을 수 있는데, DSP 마다 다르지만 로드 이후 시간이 오래 지나면 invalid 한 상태가 될 수 있습니다.
-
또한 한번
show
된 광고는 다시show
되지 않습니다.
-
- Kotlin
- Java
class InterstitialFragment : Fragment() {
private lateinit var interstitialAdManager: GfpInterstitialAdManager
private lateinit var showButton: Button
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_interstitial, container, false)
showButton = view.findViewById(R.id.show_button)
showButton.isEnabled = false
showButton.setOnClickListener {
// Check if ad is already expired or invalidated, and do not show ad if that is the case.
// You will not get paid to show an invalidated ad.
if (interstitialAdManager.isAdInvalidated) {
return@setOnClickListener
}
interstitialAdManager.showAd(requireActivity())
}
// 광고 파라미터 생성
val adParam = AdParam.Builder().setAdUnitId(AD_UNIT_ID).build()
// 광고 객체 생성
interstitialAdManager = GfpInterstitialAdManager(requireActivity(), adParam)
// 필요 시 타임아웃 셋팅
// interstitialAdManager.setTimeoutMillis(60_000L);
// 광고 이벤트 리스너 설정
interstitialAdManager.setAdListener(object: InterstitialAdListener() {
override fun onAdLoaded(ad: GfpInterstitialAd) {
// ready to show
Log.d("InterstitialFragment", "로드 완료. responseInfo[${ad.responseInfo}]")
showButton.isEnabled = true
}
override fun onAdStarted(ad: GfpInterstitialAd) {
Log.d("InterstitialFragment", "광고 시작.")
}
override fun onAdClicked(ad: GfpInterstitialAd) {
Log.d("InterstitialFragment", "클릭 발생")
}
override fun onAdClosed(ad: GfpInterstitialAd) {
Log.d("InterstitialFragment", "광고 종료")
showButton.isEnabled = false
}
override fun onError(ad: GfpInterstitialAd, error: GfpError) {
Log.e("InterstitialFragment", ad.responseInfo.toString())
showButton.isEnabled = false
}
})
// 광고 요청
interstitialAdManager.loadAd()
return view
}
companion object {
private const val AD_UNIT_ID = "YOUR_AD_UNIT_ID"
}
}
public class InterstitialFragment extends Fragment {
private static final String AD_UNIT_ID = "YOUR_AD_UNIT_ID";
private GfpInterstitialAdManager interstitialAdManager;
private Button showButton;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_interstitial, container, false);
showButton = view.findViewById(R.id.show_button);
showButton.setEnabled(false);
showButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Check if ad is already expired or invalidated, and do not show ad if that is the case.
// You will not get paid to show an invalidated ad.
if (interstitialAdManager.isAdInvalidated())) {
return;
}
interstitialAdManager.showAd(requireActivity());
}
});
// 광고 파라미터 생성
AdParam adParam = new AdParam.Builder().setAdUnitId(AD_UNIT_ID).build();
// 광고 객체 생성
interstitialAdManager = new GfpInterstitialAdManager(requireActivity(), adParam);
// 필요 시 타임아웃 셋팅
// interstitialAdManager.setTimeoutMillis(60_000L);
// 광고 이벤트 리스너 설정
interstitialAdManager.setAdListener(new InterstitialAdListener() {
@Override
public void onAdLoaded(GfpInterstitialAd ad) {
Log.d("InterstitialFragment", String.format("로드 완료. responseInfo[%s]",ad.getResponseInfo().toString()));
// ready to show
showButton.setEnabled(true);
}
@Override
public void onAdStarted(GfpInterstitialAd ad) {
Log.d("InterstitialFragment", "광고 시작.");
}
@Override
public void onAdClicked(GfpInterstitialAd ad) {
Log.d("InterstitialFragment", "클릭 발생");
}
@Override
public void onAdClosed(GfpInterstitialAd ad) {
Log.d("InterstitialFragment", "광고 종료");
showButton.setEnabled(false);
}
@Override
public void onError(GfpInterstitialAd ad, GfpError error) {
Log.e("InterstitialFragment", ad.getResponseInfo().toString());
showButton.setEnabled(false);
}
});
// 광고 요청
interstitialAdManager.loadAd();
}
}
[Step 6] 광고 삭제
전면형 광고의 게재가 끝나면 광고가 올바르게 폐기되도록 광고를 삭제해야 합니다.
광고 삭제는 아래와 같이 GfpInterstitialAdManager
가 제공하는 destroy()
를 호출하면 됩니다.
- Kotlin
- Java
override fun onDestroy() {
if (::interstitialAdManager.isInitialized) {
interstitialAdManager.destroy()
}
super.onDestroy()
}
@Override
public void onDestroy() {
if (interstitialAdManager != null) {
interstitialAdManager.destroy();
}
super.onDestroy();
}