배너 광고는 앱 화면의 특정 영역에 표시되는 직사각형 광고입니다. 사용자가 앱을 사용하는 동안 지속적으로 노출되어 높은 노출 빈도를 제공합니다. ADwhale Mediation 배너 광고는 Programmatic 방식과 XML 방식 2가지 형태의 구현과 사용이 가능합니다.
1. 주요특징
다양한 사이즈 지원 (320x50, 320x100, 300x250, 250x250, ADAPTIVE_ANCHOR)
자동 로드 및 새로고침 기능
간단한 컴포넌트 기반 구현
Programmatic / XML 방식 모두 지원
이벤트 기반 콜백으로 광고 상태 추적
2. 기본 구현 샘플코드
AdWhaleMediationAdView 클래스를 사용하여 배너 광고를 로드하고 표시하는 기본적인 구현 방법입니다.
privateAdWhaleMediationAdViewadView;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){ // 1. 뷰 생성 adView =newAdWhaleMediationAdView(this); // 2. 설정adView.setPlacementUid("발급받은 placement uid 값");adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER320x50); // 3. 리스너 등록adView.setAdWhaleMediationAdViewListener(new AdWhaleMediationAdViewListener(){@Overridepublicvoid onAdLoaded(){/* 로드 성공 */}@Overridepublicvoid onAdLoadFailed(intstatusCode,Stringmessage){/* 로드 실패 */}@Overridepublicvoid onAdClicked(){/* 클릭 */}}); // 4. 레이아웃에 추가 후, SDK 초기화 완료 콜백에서 loadAd() 호출root.addView(adView, params);adView.loadAd();}// 5. Activity 라이프사이클에서 resume / pause / destroy 호출@OverrideprotectedvoidonResume(){super.onResume();if(adView !=null)adView.resume();}@OverrideprotectedvoidonPause(){super.onPause();if(adView !=null)adView.pause();}@OverrideprotectedvoidonDestroy(){if(adView !=null){adView.destroy(); adView =null;}super.onDestroy();}
3. API 설명
AdWhaleMediationAdView 클래스 API 설명
파라미터 타입
파라미터 값
android.content.Context
Android Main Activity 클래스
파라미터 타입
파라미터 값
String
placementUid 값(발급 필요)
파라미터 타입
파라미터 값
net.adwhale.sdk.mediation.ads.ADWHALE_AD_SIZE
배너 광고 사이즈(사이즈 종류: BANNER320x50, BANNER320x100, BANNER300x250, BANNER250x250, ADAPTIVE_ANCHOR)
파라미터 타입
파라미터 값
net.adwhale.sdk.mediation.ads.
AdWhaleMediationAdViewListener
배너 미디에이션 광고 호출 콜백 리스너
파라미터 타입
파라미터 값
int
디바이스 width 입력
0을 입력할 경우 디바이스 전체 가로 길이 적용됨
AdWhaleMediationAdViewListener 클래스 API 설명
파라미터 타입
파라미터 값
int
초기화 결과 코드
(200 또는 300)
String
초기화 결과 메시지
("Internal error occurred..." 또는 "Mediation network error occurred...")
AdWhaleMediationAdView 클래스 API 설명
파라미터 타입
파라미터 값
android.content.Context
Android Main Activity 클래스
파라미터 타입
파라미터 값
String
placementUid 값(발급 필요)
파라미터 타입
파라미터 값
net.adwhale.sdk.mediation.ads.ADWHALE_AD_SIZE
배너 광고 사이즈(사이즈 종류: BANNER320x50, BANNER320x100, BANNER300x250, BANNER250x250, ADAPTIVE_ANCHOR)
파라미터 타입
파라미터 값
Int
배너 미디에이션 광고 호출 콜백 리스너
파라미터 타입
파라미터 값
Int
디바이스 width 입력
0을 입력할 경우 디바이스 전체 가로 길이 적용됨
AdWhaleMediationAdViewListener 클래스 API 설명
파라미터 타입
파라미터 값
Int
초기화 결과 코드
(200 또는 300)
String
초기화 결과 메시지
("Internal error occurred..." 또는 "Mediation network error occurred...")
AdWhaleMediationAdView 클래스 API 설명
파라미터 타입
파라미터 값
android.content.Context
Android Main Activity 클래스
파라미터 타입
파라미터 값
String
placementUid 값(발급 필요)
파라미터 타입
파라미터 값
net.adwhale.sdk.mediation.ads.ADWHALE_AD_SIZE
배너 광고 사이즈(사이즈 종류: BANNER320x50, BANNER320x100, BANNER300x250, BANNER250x250, ADAPTIVE_ANCHOR)
파라미터 타입
파라미터 값
Int
배너 미디에이션 광고 호출 콜백 리스너
파라미터 타입
파라미터 값
Int
디바이스 width 입력
0을 입력할 경우 디바이스 전체 가로 길이 적용됨
AdWhaleMediationAdViewListener 클래스 API 설명
파라미터 타입
파라미터 값
Int
초기화 결과 코드
(200 또는 300)
String
초기화 결과 메시지
("Internal error occurred..." 또는 "Mediation network error occurred...")
4. 배너 사이즈
배너 광고는 다음 사이즈를 지원합니다:
사이즈
값
사이즈 별 높이
설명
320x50
ADWHALE_AD_SIZE.BANNER320x50
50
표준 배너 (Banner)
320x100
ADWHALE_AD_SIZE.BANNER320x100
100
큰 배너 (Large Banner)
300x250
ADWHALE_AD_SIZE.BANNER300x250
250
중간 직사각형 (Medium Rectangle)
250x250
ADWHALE_AD_SIZE.BANNER250x250
250
정사각형 (Square)
ADAPTIVE_ANCHOR
ADWHALE_AD_SIZE.ADAPTIVE_ANCHOR
60(대략적인 높이)
적응형 앵커 배너
사용예시
5. 옵션 설정
ADwhale 에서는 광고 지역 타게팅을 위해 지역정보(Region, Gcoder)를 선택적으로 입력받고 있습니다. setRegion() 과 setGcoder() 관련 자세한 구현 방법은 아래 링크를 참고하세요.
private var adView: AdWhaleMediationAdView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 예시: root는 실제 레이아웃의 컨테이너로 교체
val root: ViewGroup = findViewById(R.id.root)
val params = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
// 1. 뷰 생성
adView = AdWhaleMediationAdView(this)
// 2. 설정
adView?.setPlacementUid("발급받은 placement uid 값")
adView?.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER320x50)
// 3. 리스너 등록
adView?.setAdWhaleMediationAdViewListener(object : AdWhaleMediationAdViewListener {
override fun onAdLoaded() { /* 로드 성공 */ }
override fun onAdLoadFailed(statusCode: Int, message: String) { /* 로드 실패 */ }
override fun onAdClicked() { /* 클릭 */ }
})
// 4. 레이아웃에 추가 후, SDK 초기화 완료 콜백에서 loadAd() 호출
root.addView(adView, params)
adView?.loadAd()
}
// 5. Activity 라이프사이클에서 resume / pause / destroy 호출
override fun onResume() {
super.onResume()
adView?.resume()
}
override fun onPause() {
super.onPause()
adView?.pause()
}
override fun onDestroy() {
adView?.destroy()
adView = null
super.onDestroy()
}
@Composable
fun AdWhaleBannerAd(
modifier: Modifier = Modifier,
placementUid: String = "발급받은 placement uid 값",
adSize: ADWHALE_AD_SIZE = ADWHALE_AD_SIZE.BANNER320x50,
) {
val context = LocalContext.current
val lifecycleOwner = LocalLifecycleOwner.current
// (Compose) adView 인스턴스를 remember로 유지
val adView = remember {
// 1. 뷰 생성
AdWhaleMediationAdView(context).apply {
// 2. 설정
setPlacementUid(placementUid)
setAdwhaleAdSize(adSize)
// 3. 리스너 등록
setAdWhaleMediationAdViewListener(object : AdWhaleMediationAdViewListener {
override fun onAdLoaded() { /* 로드 성공 */ }
override fun onAdLoadFailed(statusCode: Int, message: String) { /* 로드 실패 */ }
override fun onAdClicked() { /* 클릭 */ }
})
}
}
// 4. 레이아웃에 추가 후, SDK 초기화 완료 콜백에서 loadAd() 호출
// Compose에서는 AndroidView에 붙는 시점에 로드를 걸어도 되고,
// "SDK 초기화 완료" 상태를 외부 state로 받아서 true일 때만 호출해도 됨.
var didLoad by remember { mutableStateOf(false) }
LaunchedEffect(adView) {
if (!didLoad) {
adView.loadAd()
didLoad = true
}
}
// 5. Activity 라이프사이클에서 resume / pause / destroy 호출
// Compose에서는 Lifecycle을 구독해서 내부적으로 처리 가능
DisposableEffect(lifecycleOwner, adView) {
val observer = LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_RESUME -> adView.resume()
Lifecycle.Event.ON_PAUSE -> adView.pause()
Lifecycle.Event.ON_DESTROY -> adView.destroy()
else -> Unit
}
}
lifecycleOwner.lifecycle.addObserver(observer)
onDispose {
lifecycleOwner.lifecycle.removeObserver(observer)
// 만약 화면 교체 등으로 Composable이 먼저 dispose되는 케이스까지 커버하려면 여기서도 안전하게 destroy
// (중복 destroy가 안전한지 보장되지 않으면, SDK 정책에 맞게 한쪽만 남겨도 됨)
adView.destroy()
}
}
AndroidView(
modifier = modifier,
factory = { adView }
)
}
public AdWhaleMediationAdView(Context context)
public void loadAd() // 미디에이션 배너광고로드
public void setPlacementUid(String placementUid) // 지면 등록
public void setAdwhaleAdSize(ADWHALE_AD_SIZE adWhaleAdSize) // 미디에이션 배너사이즈 설정
public void setAdWhaleMediationAdViewListener(AdWhaleMediationAdViewListener listener) // 리스너 등록
public void setAdaptiveAnchorWidth(int width) // 디바이스 width 입력. ADAPTIVE_ANCHOR 적응형 배너 적용시 사용.
public void resume() // resume 콜백 시 호출필요
public void pause() // pause 콜백 시 호출필요
public void destroy() // onDestroy 콜백 시 호출필요
public void onAdLoaded() // 배너 광고요청 성공 시
public void onAdLoadFailed(int statusCode, String message) // 미디에이션 배너광고요청 실패 시
public void onAdClicked() // 배너 클릭 시
AdWhaleMediationAdView(context : Context)
fun loadAd() : Unit // 미디에이션 배너광고 로드
fun setPlacementUid(placementUid : String) : Unit // 지면 등록
fun setAdwhaleAdSize(adWhaleAdSize : ADWHALE_AD_SIZE) : Unit // 미디에이션 배너사이즈 설정
fun setAdWhaleMediationAdViewListener(listener : Int) : Unit // 리스너 등
fun setAdaptiveAnchorWidth(width : Int) : Unit // 디바이스 width 입력. ADAPTIVE_ANCHOR 적응형 배너 적용시 사용.
fun resume() : Unit // resume 콜백 시 호출필요
fun pause() : Unit // pause 콜백 시 호출필요
fun destroy() : Unit // destroy 콜백 시 호출필요
fun onAdLoaded() : Unit // 배너 광고요청 성공 시
fun onAdLoadFailed(statusCode : Int, message : String) : Unit // 미디에이션 배너광고요청 실패 시
fun onAdClicked() : Unit // 배너 클릭 시
AdWhaleMediationAdView(context : Context)
fun loadAd() : Unit // 미디에이션 배너광고 로드
fun setPlacementUid(placementUid : String) : Unit // 지면 등록
fun setAdwhaleAdSize(adWhaleAdSize : ADWHALE_AD_SIZE) : Unit // 미디에이션 배너사이즈 설정
fun setAdWhaleMediationAdViewListener(listener : Int) : Unit // 리스너 등
fun setAdaptiveAnchorWidth(width : Int) : Unit // 디바이스 width 입력. ADAPTIVE_ANCHOR 적응형 배너 적용시 사용.
fun resume() : Unit // resume 콜백 시 호출필요
fun pause() : Unit // pause 콜백 시 호출필요
fun destroy() : Unit // destroy 콜백 시 호출필요
fun onAdLoaded() : Unit // 배너 광고요청 성공 시
fun onAdLoadFailed(statusCode : Int, message : String) : Unit // 미디에이션 배너광고요청 실패 시
fun onAdClicked() : Unit // 배너 클릭 시
// 320x50 (표준 배너) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER320x50);
// 320x100 (큰 배너) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER320x100);
// 300x250 (중간 직사각형) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER300x250);
// 250x250 (정사각형) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER250x250);
// ADAPTIVE_ANCHOR (적응형 배너 (너비 지정)) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.ADAPTIVE_ANCHOR);
adView.setAdaptiveAnchorWidth(360); // 디바이스 너비 값 예시
// ADAPTIVE_ANCHOR (적응형 배너 (디바이스 전체 너비)) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.ADAPTIVE_ANCHOR);
adView.setAdaptiveAnchorWidth(0); // 0을 주거나, 아예 호출하지 않으면 디바이스 전체 너비를 자동으로 감지
// 320x50 (표준 배너) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER320x50)
// 320x100 (큰 배너) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER320x100)
// 300x250 (중간 직사각형) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER300x250)
// 250x250 (정사각형) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER250x250)
// ADAPTIVE_ANCHOR (적응형 배너 (너비 지정)) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.ADAPTIVE_ANCHOR)
adView.setAdaptiveAnchorWidth(360) // 디바이스 너비 값 예시
// ADAPTIVE_ANCHOR (적응형 배너 (디바이스 전체 너비)) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.ADAPTIVE_ANCHOR)
adView.setAdaptiveAnchorWidth(0) // 0을 주거나, 아예 호출하지 않으면 디바이스 전체 너비를 자동으로 감지
// 320x50 (표준 배너) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER320x50)
// 320x100 (큰 배너) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER320x100)
// 300x250 (중간 직사각형) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER300x250)
// 250x250 (정사각형) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER250x250)
// ADAPTIVE_ANCHOR (적응형 배너 (너비 지정)) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.ADAPTIVE_ANCHOR)
adView.setAdaptiveAnchorWidth(360) // 디바이스 너비 값 예시
// ADAPTIVE_ANCHOR (적응형 배너 (디바이스 전체 너비)) 사용 예:
adView.setAdwhaleAdSize(ADWHALE_AD_SIZE.ADAPTIVE_ANCHOR)
adView.setAdaptiveAnchorWidth(0) // 0을 주거나, 아예 호출하지 않으면 디바이스 전체 너비를 자동으로 감지
adView.setRegion("서울시 강남구"); // 지역 타게팅 전용 API(옵션)
adView.setGcoder(37.5665, 126.9780); // 지역 타게팅 전용 API(옵션)
adView.setPlacementName("app_open_main"); // 레벨플레이 placement name 연동 전용 API (옵션)
adView.setRegion("서울시 강남구") // 지역 타게팅 전용 API(옵션)
adView.setGcoder(37.5665, 126.9780) // 지역 타게팅 전용 API(옵션)
adView.setPlacementName("app_open_main") // 레벨플레이 placement name 연동 전용 API (옵션)
adView.setRegion("서울시 강남구") // 지역 타게팅 전용 API(옵션)
adView.setGcoder(37.5665, 126.9780) // 지역 타게팅 전용 API(옵션)
adView.setPlacementName("app_open_main") // 레벨플레이 placement name 연동 전용 API (옵션)
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import net.adwhale.sdk.mediation.ads.ADWHALE_AD_SIZE;
import net.adwhale.sdk.mediation.ads.AdWhaleMediationAdView;
import net.adwhale.sdk.mediation.ads.AdWhaleMediationAdViewListener;
import net.adwhale.sdk.mediation.ads.AdWhaleMediationAds;
import net.adwhale.sdk.mediation.ads.AdWhaleMediationOnInitCompleteListener;
import net.adwhale.sdk.utils.AdWhaleLog;
public class MainActivity extends AppCompatActivity {
private ConstraintLayout root;
private AdWhaleMediationAdView adWhaleMediationAdView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
root = (ConstraintLayout) findViewById(R.id.root);
// 로거 설정
AdWhaleLog.setLogLevel(AdWhaleLog.LogLevel.None);
// 배너광고 뷰 생성
adWhaleMediationAdView = new AdWhaleMediationAdView(this);
adWhaleMediationAdView.setPlacementUid("발급받은 placement uid 값");
adWhaleMediationAdView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER320x50);
// 적응형 배너 뷰를 적용할 경우
// adWhaleMediationAdView.setAdwhaleAdSize(ADWHALE_AD_SIZE.ADAPTIVE_ANCHOR);
// adWhaleMediationAdView.setAdaptiveAnchorWidth(360); // 디바이스 width 입력. 0을 입력할 경우 디바이스 전체 가로 길이 적용됨.
// 배너광고 뷰 콜백 리스너 등록
adWhaleMediationAdView.setAdWhaleMediationAdViewListener(new AdWhaleMediationAdViewListener() {
@Override
public void onAdLoaded() {
Log.i(MainActivity.class.getSimpleName(), ".onAdLoaded();");
}
@Override
public void onAdLoadFailed(int statusCode, String message) {
Log.i(MainActivity.class.getSimpleName(), ".onAdLoadFailed(" + statusCode + ", " + message + ");");
}
@Override
public void onAdClicked() {
Log.i(MainActivity.class.getSimpleName(), ".onAdClicked();");
}
});
// LayoutParams 적용 및 root view에 add
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
params.addRule(RelativeLayout.CENTER_HORIZONTAL);
root.addView(adWhaleMediationAdView, params);
// 초기화 코드
AdWhaleMediationAds.init(this, new AdWhaleMediationOnInitCompleteListener() {
@Override
public void onInitComplete(int statusCode, String message) {
Log.i(MainActivity.class.getSimpleName(), ".onInitComplete(" + statusCode + ", " + message + ");");
if(adWhaleMediationAdView != null) {
// 배너광고 뷰 로드
new Handler(Looper.getMainLooper()).postDelayed(() -> {
adWhaleMediationAdView.loadAd();
},0);
}
}
});
}
// 라이프사이클 onResume 콜백 시 반드시 onResume 호출 필요(미호출 시 불이익 발생)
@Override
protected void onResume() {
super.onResume();
if(adWhaleMediationAdView != null) {
adWhaleMediationAdView.resume();
}
}
// 라이프사이클 onPause 콜백 시 반드시 onPause 호출 필요(미호출 시 불이익 발생)
@Override
protected void onPause() {
super.onPause();
if(adWhaleMediationAdView != null) {
adWhaleMediationAdView.pause();
}
}
// 라이프사이클 onDestroy 콜백 시 반드시 onDestroy 호출 필요
@Override
protected void onDestroy() {
super.onDestroy();
if(adWhaleMediationAdView != null) {
adWhaleMediationAdView.destroy();
}
}
}
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.LinearLayout
import android.widget.RadioGroup
import android.widget.RelativeLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import net.adwhale.sdk.mediation.ads.ADWHALE_AD_SIZE
import net.adwhale.sdk.mediation.ads.AdWhaleMediationAdView
import net.adwhale.sdk.mediation.ads.AdWhaleMediationAdViewListener
import net.adwhale.sdk.mediation.ads.AdWhaleMediationAds
class MainActivity : AppCompatActivity() {
private lateinit var root: ConstraintLayout
private lateinit var adWhaleMediationAdView: AdWhaleMediationAdView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
root = findViewById<View>(R.id.root) as ConstraintLayout
// 로거 설정
AdWhaleLog.setLogLevel(AdWhaleLog.LogLevel.None)
// 배너광고 뷰 생성
adWhaleMediationAdView = AdWhaleMediationAdView(this)
adWhaleMediationAdView.setPlacementUid("발급받은 placement uid 값")
adWhaleMediationAdView.setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER320x50)
// 적응형 배너 뷰를 적용할 경우
// adWhaleMediationAdView.setAdwhaleAdSize(ADWHALE_AD_SIZE.ADAPTIVE_ANCHOR)
// adWhaleMediationAdView.setAdaptiveAnchorWidth(360) // 디바이스 width 입력. 0을 입력할 경우 디바이스 전체 가로 길이 적용됨.
// 배너광고 뷰 콜백 리스너 등록
adWhaleMediationAdView!!.adWhaleMediationAdViewListener =
object : AdWhaleMediationAdViewListener {
override fun onAdLoaded() {
Log.i(MainActivity::class.simpleName, ".onAdLoaded()")
}
override fun onAdLoadFailed(statusCode: Int, message: String) {
Log.i(MainActivity::class.simpleName, ".onAdLoadFailed($statusCode, $message)")
}
override fun onAdClicked() {
Log.i(MainActivity::class.simpleName, ".onAdClicked()")
}
}
// LayoutParams 적용 및 root view에 add
val params = RelativeLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT
)
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM)
params.addRule(RelativeLayout.CENTER_HORIZONTAL)
root!!.addView(adWhaleMediationAdView, params)
// 초기화 코드
AdWhaleMediationAds.init(this) { statusCode, message ->
Log.i(MainActivity::class.simpleName, ".onInitComplete($statusCode, $message)")
// 배너 뷰 로드
Handler(Looper.getMainLooper()).postDelayed({
adWhaleMediationAdView!!.loadAd()
}, 0)
}
}
// 라이프사이클 onResume 콜백 시 반드시 onResume 호출 필요(미호출 시 불이익 발생)
override fun onResume() {
super.onResume()
adWhaleMediationAdView!!.resume()
}
// 라이프사이클 onPause 콜백 시 반드시 onPause 호출 필요(미호출 시 불이익 발생)
override fun onPause() {
super.onPause()
adWhaleMediationAdView!!.pause()
}
// 라이프사이클 onDestroy 콜백 시 반드시 onDestroy 호출 필요
override fun onDestroy() {
super.onDestroy()
adWhaleMediationAdView!!.destroy()
}
}
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.content.Context
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.viewinterop.AndroidView
import net.adwhale.sdk.mediation.ads.ADWHALE_AD_SIZE
import net.adwhale.sdk.mediation.ads.AdWhaleMediationAdView
import net.adwhale.sdk.mediation.ads.AdWhaleMediationAdViewListener
import net.adwhale.sdk.mediation.ads.AdWhaleMediationAds
import net.adwhale.sdk.mediation.ads.AdWhaleMediationOnInitCompleteListener
import net.adwhale.sdk.utils.AdWhaleLog
class MainActivity : ComponentActivity() {
private var adWhaleMediationAdView: AdWhaleMediationAdView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 로거 설정
AdWhaleLog.setLogLevel(AdWhaleLog.LogLevel.None)
// 먼저 배너 View 생성 (Compose에서 재사용)
adWhaleMediationAdView = createBannerView(this)
// AdWhale 초기화
AdWhaleMediationAds.init(this, object : AdWhaleMediationOnInitCompleteListener {
override fun onInitComplete(statusCode: Int, message: String?) {
Log.i(MainActivity::class.java.simpleName,
".onInitComplete($statusCode, $message);")
// 초기화 완료 후 배너 로드
if (adWhaleMediationAdView != null) {
Handler(Looper.getMainLooper()).postDelayed({
adWhaleMediationAdView?.loadAd()
}, 0)
}
}
})
setContent {
Box(
modifier = Modifier.fillMaxSize()
) {
// 화면 하단 중앙에 배너 배치
AndroidView(
modifier = Modifier
.align(Alignment.BottomCenter),
factory = { context ->
// 이미 onCreate에서 만든 뷰 재사용
adWhaleMediationAdView ?: createBannerView(context).also {
adWhaleMediationAdView = it
}
}
)
}
}
}
private fun createBannerView(context: Context): AdWhaleMediationAdView {
return AdWhaleMediationAdView(context).apply {
// placement uid 설정
setPlacementUid("발급받은 placement uid 값")
// 고정 배너 사이즈 320x50
setAdwhaleAdSize(ADWHALE_AD_SIZE.BANNER320x50)
// 적응형 배너를 쓸 경우:
// setAdwhaleAdSize(ADWHALE_AD_SIZE.ADAPTIVE_ANCHOR)
// setAdaptiveAnchorWidth(360) // 디바이스 width. 0이면 전체 가로 길이
setAdWhaleMediationAdViewListener(object : AdWhaleMediationAdViewListener {
override fun onAdLoaded() {
Log.i(MainActivity::class.java.simpleName, ".onAdLoaded();")
}
override fun onAdLoadFailed(statusCode: Int, message: String?) {
Log.i(
MainActivity::class.java.simpleName,
".onAdLoadFailed($statusCode, $message);"
)
}
override fun onAdClicked() {
Log.i(MainActivity::class.java.simpleName, ".onAdClicked();")
}
})
val params = RelativeLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT
).apply {
addRule(RelativeLayout.ALIGN_PARENT_BOTTOM)
addRule(RelativeLayout.CENTER_HORIZONTAL)
}
layoutParams = params
}
}
// 라이프사이클 onResume 콜백 시 반드시 onResume 호출 필요
override fun onResume() {
super.onResume()
adWhaleMediationAdView?.resume()
}
// 라이프사이클 onPause 콜백 시 반드시 onPause 호출 필요
override fun onPause() {
super.onPause()
adWhaleMediationAdView?.pause()
}
// 라이프사이클 onDestroy 콜백 시 반드시 onDestroy 호출 필요
override fun onDestroy() {
super.onDestroy()
adWhaleMediationAdView?.destroy()
adWhaleMediationAdView = null
}
}