Android SDK Guide(SPLASH)

7 분 소요

Geonjin Mun

현재 버전은 3.0.0 입니다.

Ad type

division Sample Explanation
스플래시 배너
앱 실행 시 스플래시 화면에 노출되는 배너입니다.
배너는 투명 PNG로 제공됩니다.
배너 위치/노출시간/노출방식(모션)은 매체에서 제어합니다.
- 하단 위치/3초 이상 노출 권장
- 가로 또는 세로 사이즈 조정 시 비율 유지하여 축소
- 배너가 가려지거나 잘리지 않도록 주의
- SDK 3.0.0버전 이상에서만 사용 가능

지원 상품(사이즈)

Product classification      size
스플래시 배너    1200x1000

SDK 라이브러리 적용

안드로이드 개발에 필요한 환경 설정 등은 지면상 생략합니다.
개발하고자 하는 Android Project를 생성합니다.
libs폴더를 생성하여 제공된 manlibray.jar를 추가합니다.

AndroidManifest.xml

android.permission는 광고 SDK 광고 삽입을 위해 필요한 권한 설정입니다. 위치정보는 사용하고 있지않아 미설정으로 하시면됩니다.
광고를 삽입할 해당 Activity의 속성에 android:configChanges=”orientation|keyboard”를 삽입해야 합니다.
 (연속된 OnCreate 호출로 인한 네트웍 자원 낭비 방지용)
android9(API 28)부터 강화된 네트워크 보안정책으로 인해 application에 값(android:usesCleartextTraffic=”true”)을 삽입합니다.
 광고 이미지url load, 트래킹요소, resource가 http 구성될 수 있으므로 해당옵션을 삽입합니다.
광고 SDK 적용 대상 앱이 android11(API Level 30)이상을 타겟팅 하며, 자동으로 표시되는 앱이 아닌 다른 앱과 상호 작용을 해야 한다면 앱의 매니페스트 파일에 요소를 추가해야 합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mezzomedia.sampleapp"
    android:versionCode="1"
    android:versionName="1.0" >
    <!--네트워크 사용 -->
    <!-- 권한 : NetworkInterface 목적 : IP 주소 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 권한 : ConnectivityManager 목적 : 통신 연결이 Mobile or Wifi 여부 파악 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!--단말기 정보( TelephonyManager의 망 사업자의 MNC, MCC ) 사용 -->
    <!-- 권한 : Telephony DataNetworkType Type SDK version 24 이상 목적 : Mobile network: 2G, 3G, LET, 5G 등 -->
    <uses-permission android:name="android.permission.READ_BASIC_PHONE_STATE" />
    <!-- 권한 : Telephony Network Type SDK version 23 이하 목적 : Mobile network: 2G, 3G, LET, 5G 등 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!-- 권한 : 광고 ID -->
    <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
    <application
        android:usesCleartextTraffic="true"
        android:name=".MZApplication"
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
		<!--SPLASH activity-->
        <activity
            android:exported="true"
            android:name="com.mmc.adman.app.Splash"
            android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize">
        </activity>
    </application>

</manifest>

Java source

SPLASH

광고 삽입된 splash 페이지에서 아래 코드를 꼭 시작하셔야 합니다.

private AdManView splashAd = null;

public void destroySplashAd() {
    if (splashAd != null) {
        splashAd.onDestroy();
        splashAd = null;
    }
}

//Sample source Navimanager.java
public void requestInlayoutInter(final Context c, final int p, final int m, final int s,  final RelativeLayout bannerArea) {
    AdData adData = new AdData();//광고 설정의 데이터 구성 클래스
    String appName = "appname";
    //광고 설정값의 필수
    adData.major("splashArea_ID", AdConfig.API_INTER, p, m, s, "http://www.storeurl.com", "packagename", appName, 320, 480);
    //유저 나이 레벨 필수
    adData.setUserAgeLevel(0);
    //퍼미션 사용 여부
    adData.isPermission(AdConfig.NOT_USED);
    adData.setIsInLayout(AdConfig.USED);
	splashAd = new AdManView(c);
	splashAd.setData(adData, new AdListener() {
        //광고 호출 성공
        @Override
        public void onAdSuccessCode(Object v, String id, final String type, final String status, final String jsonDataString) {
            ((Activity) c).runOnUiThread(new Runnable() {
                @Override
                public void run() {
					((Activity) c).runOnUiThread(new Runnable() {
						@Override
						public void run() {
							if (AdResponseCode.Status.SUCCESS.equals(status)) {
								inlayoutInter.addBannerView(bannerArea);
							}
						}
					});
                }
            });
        }
        //광고 호출 실패 에러
        @Override
        public void onAdFailCode(Object v, String id, String type, String status, String jsonDataString) {
            
        }
        //광고 호출 실패 에러(웹뷰 에러)
        @Override
        public void onAdErrorCode(Object v, String id, String type, String status, String failingUrl) {
            
        }
        //광고에서 발생하는 이벤트
        @Override
        public void onAdEvent(Object v, String id, String type, String status, String jsonDataString) {
            if(AdEvent.Type.IMP.equals(type)){
                //노출
            }       
        }
        // 광고 퍼미션(위치) 설정 요청 이벤트 - 사용자 단말기 설정 페이지에 있는 앱 권한을 받기 위한 이벤트입니다.
        @Override
        public void onPermissionSetting(Object v, String id) {
            // isPermission값이 미사용으로 설정한다면 이벤트가 발생하지 않습니다.
        }
    });
    //요청 메서드
    inlayoutInter.request(new Handler());
}

공통 사항

Method - 광고연동 시 사용하는 메서드입니다.

메서드                       설명
AdManView ( Context context )                                                                     광고 생성자(전면팝업을 제외하고 사용합니다.)
setData ( AdData adData, AdListener adListener ) 광고세팅 메서드
request( Handler handler )                            광고로직 시작
onDestroy( )                              광고로직 종료
addBannerView(ViewGroup bannerArea)                                                                            특정영역에 광고 넣는 메서드

AdData - 광고 삽입 때 사용하는 데이터입니다.

method                                                                                                                                   Explanation       Usable range
major(String id, String apiMode, int publisher,
int media, int section, String storeUrl,
String appId, String appName, int adAreaWidth, int adAreaHeight )
필수값 세팅 메서드 공통
setUserAgeLevel(int userAgeLevel)                                   필수값 유저의 나이 레벨            공통
isPermission(String isReadPhone)                                퍼미션 사용 여부
(AdConfig.NOT_USED, AdConfig.USED)            
공통
setIsInLayout(String isInLayout)                                                       특정레이아웃 삽입 사용 여부
(AdConfig.NOT_USED, AdConfig.USED)        
스플래시
setDefaultBackgroundColor(String color)                                            광고background 색상
(default : #000000)
공통

major - 필수값 세팅 메서드

인자값             설명
String id                매체에서 사용할 광고 영역의 고유 id
ex) bannerid, interbannerid
String apiMode 광고 타입
int publisher                         퍼블리셔 코드
int media                           미디어 코드
int section                            섹션 코드
String storeUrl           스토어 url
String appId                               패키지명
String appName                        앱명
int adAreaWidth                     노출되는 광고 영역 사이즈 넓이
int adAreaHeight                       노출되는 광고 영역 사이즈 높이

ageLevel - user’s age level

상수                 설명
0                   어린이 (만13세 미만)
1                                     청소년, 성인 (만13세 이상)
-1                                    알수없음

AdConfig - This is the value used for ad settings.

상수 설명
AdConfig.SDK_VERSION               sdk version
AdConfig.SDK_RELEASEDATE       sdk release date
AdConfig.API_INTER                     apiMode에 전달하는 값 : 스플래시
AdConfig.USED                      isPermission, setIsInLayout, setIsCloseShow, setPopup 등의 메서드 사용유무에서 설정하는 값
AdConfig.NOT_USED                  isPermission, setIsInLayout, setIsCloseShow, setPopup 등의 메서드 사용유무에서 설정하는 값

AdListener

    //광고 호출 성공
    @Override
    public void onAdSuccessCode(Object v, String id, final String type, final String status, final String jsonDataString) {
        if(AdResponseCode.Type.HOUSE.equals(type)){
            //광고 성공 : 무료
        }else{
            //광고 성공 : 유료
        }
    }
    //광고 호출 실패 에러
    @Override
    public void onAdFailCode(Object v, String id, String type, String status, String jsonDataString) {
        if(AdResponseCode.Status.NOAD.equals(status)){
            //광고소진
        }else if(AdResponseCode.Status.TIMEOUT.equals(status)){
            //네트워크 타임아웃
        }else if(AdResponseCode.Status.ERROR_PARSING.equals(status)){
            //파싱 에러
        }else if(AdResponseCode.Status.DUPLICATIONCALL.equals(status)){
            //중복호출
        }else if(AdResponseCode.Status.ERROR.equals(status)){
            //예외적이 오류
        }else if(AdResponseCode.Status.ERROR_NOTSUPPORT_BROWSER.equals(status)){
            //미지원 브라우져
        }else if(AdResponseCode.Status.ERROR_NOTSUPPORT_IOS.equals(status)){
            //미지원 Ios version
        }else if(AdResponseCode.Status.ERROR_NOTSUPPORT_ANDROID.equals(status)){
            //미지원 Android version
        }else if(AdResponseCode.Status.NEEDSYNC.equals(status)){
            //ajax error
        }else if(AdResponseCode.Status.DEVICE_NETWORK_ERROR.equals(status)){
            //단말기 네트워크 상태 에러
        }else if(AdResponseCode.Status.DEVICE_RENDERING_TIMEOUT.equals(status)){
            //광고 랜더링 타임아웃
        }else if(AdResponseCode.Status.DEVICE_SETTING_ERROR.equals(status)){
            //광고 데이터 잘못설정 에러
        }else if(AdResponseCode.Status.DEVICE_AD_INTERVAL.equals(status)){
            //광고 호출 이후에 설정된 시간 이내 호출 에러
        }else if(AdResponseCode.Status.APP_LIFECYCLE_BACK.equals(status)){
            //백그라운드 호출시 발생하는 에러
        }
    }
    //광고 호출 실패 에러(웹뷰 에러)
    @Override
    public void onAdErrorCode(Object v, String id, String type, String status, String failingUrl) {
        int errorCode = Integer.valueOf(type);
        switch (errorCode) {
            case WebViewClient.ERROR_AUTHENTICATION:
                //서버에서 사용자 인증 실패
                break;
            case WebViewClient.ERROR_BAD_URL:
                //잘못된 URL
                break;
            case WebViewClient.ERROR_CONNECT:
                //서버로 연결 실패
                break; 
            case WebViewClient.ERROR_FAILED_SSL_HANDSHAKE:
                //SSL handshake 수행 실패
                break;
            case WebViewClient.ERROR_FILE:
                //일반 파일 오류
                break;
            case WebViewClient.ERROR_FILE_NOT_FOUND:
                //파일을 찾을 수 없습니다
                break;
            case WebViewClient.ERROR_HOST_LOOKUP:
                //서버 또는 프록시 호스트 이름 조회 실패
                break;
            case WebViewClient.ERROR_IO:
                //서버에서 읽거나 서버로 쓰기 실패
                break;
            case WebViewClient.ERROR_PROXY_AUTHENTICATION:
                //프록시에서 사용자 인증 실패
                break;
            case WebViewClient.ERROR_REDIRECT_LOOP:
                //너무 많은 리디렉션
                break;
            case WebViewClient.ERROR_TIMEOUT:
                //연결 시간 초과
                break;
            case WebViewClient.ERROR_TOO_MANY_REQUESTS:
                //페이지 로드중 너무 많은 요청 발생
                break;
            case WebViewClient.ERROR_UNKNOWN:
                //일반 오류
                break;
            case WebViewClient.ERROR_UNSUPPORTED_AUTH_SCHEME:
                //지원되지 않는 인증 체계
                break;
            case WebViewClient.ERROR_UNSUPPORTED_SCHEME:
               //URI가 지원되지 않는 방식
                break;
        }
    }
    //광고에서 발생하는 이벤트
    @Override
    public void onAdEvent(Object v, String id, String type, String status, String jsonDataString) {
        if(AdEvent.Type.IMP.equals(type)){
            //노출 트래킹
        }
    }

AdListener Explanation

메서드 설명
onAdSuccessCode(Object v, String id, String type, String status, String jsonDataString) 광고 성공 이벤트
onAdFailCode(Object v, String id, String type, String status, String jsonDataString) 에러 발생시 발생 되는 이벤트
onAdErrorCode(Object v, String id, String type, String status, String failingUrl) 광고가 보여지는 웹뷰영역 이벤트
( WebViewClient 참고 )
onAdEvent(Object v, String id, String type, String status, String jsonDataString) 광고에서 일어나는 이벤트

Success type Code

Type 설명
AdResponseCode.Type.HOUSE 무료 광고
AdResponseCode.Type.GUARANTEE 유료 광고

onAdFailCode status Code

Status                                        설명
AdResponseCode.Status.SUCCESS               성공
AdResponseCode.Status.NOAD                  광고소진
AdResponseCode.Status.NEEDSYNC              ajax error
AdResponseCode.Status.TIMEOUT                네트워크 타임아웃
AdResponseCode.Status.ERROR_PARSING         파싱 에러
AdResponseCode.Status.DUPLICATIONCALL             중복호출
AdResponseCode.Status.ERROR                   예외적이 오류
AdResponseCode.Status.ERROR_NOTSUPPORT_BROWSER 미지원 브라우저
AdResponseCode.Status.ERROR_NOTSUPPORT_IOS 미지원 iOS version
AdResponseCode.Status.ERROR_NOTSUPPORT_ANDROID 미지원 Android version
AdResponseCode.Status.DEVICE_NETWORK_ERROR 단말기 네트워크 상태 에러
AdResponseCode.Status.DEVICE_RENDERING_TIMEOUT 광고 랜더링 타임아웃
AdResponseCode.Status.DEVICE_SETTING_ERROR 광고 데이터 잘못 설정 에러
AdResponseCode.Status.DEVICE_AD_INTERVAL   광고 호출 이후에 설정된 시간 이내 호출 에러
AdResponseCode.Status.APP_LIFECYCLE_BACK 백그라운드 호출시 발생하는 에러

onAdEvent type Code

Status                설명
AdEvent.Type.IMP      노출 이벤트

Q&A

광고 노출 여부 확인

No 설명
1 Q. 상용 물량 세팅 이후에 광고가 안 보이거나 하우스 광고만 노출 될 경우
A. 대부분의 광고 세팅 후에 광고가 노출되지 않는 현상은 코드를 잘못 설정하거나
테스트 코드로 세팅 할 경우 발생되기 때문에 설정방식을 확인 하시기 바랍니다.
이후에도 상용 물량이 안 나올 경우 문의사항 연락 주시기 바랍니다.

No ad 처리 방법(패스백)

No 설명
1 Q. No ad 처리 방법에 대한 문의
A. TARGETPICK SDK 해당 ID의 광고가 존재하지 않거나 물량을 소진했을 경우 또는
 타켓팅에 의해 시간, 앱 종류, 카테고리, 날짜에 따라서도 노출 가능한 광고의 수가 달라질 수 있습니다.
 각 등록한 리스너에 광고의 NO AD같은경우 “AdResponseCode.Status.NOAD”으로 콜백을 호출 해주고 있습니다.
 일정 시간 후 다시 광고 요청을 하거나 콜백 받은 부분에서 이후 진행 로직을 진행해 주시면 됩니다.
2 Q. No ad 캠페인 세팅 후 리포트 수치가 잡히는 이유
A. No ad 캠페인 세팅을 해도 리포트 수치 발생은 정상이며, 이는 실제 노출이 아닌 인벤토리 체크를 위한 호출 수치 입니다.

문의처

구분 부서 이름 이메일 전화번호
제휴 문의     모바일 영업팀 김정혁 차장 jeonghyeok.kim@cj.net 02-6484-3856
ID발급 및 광고 세팅 문의          모바일 영업팀 이선민 차장 sunmin.lee1@cj.net 02-6484-3461

업데이트: