Android Getting Started - adxcorp/ADXLibrary_Integration GitHub Wiki

Getting started with ADXLibrary

๊ฐ€์ž…์„ ์›ํ•˜์‹œ๋ฉด [email protected]๋กœ ์—ฐ๋ฝ ๋ถ€ํƒ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

0. Latest ADXLibrary

Version : 1.17.0

Release Date : 2021/06/18

1. build.gradle ์ถ”๊ฐ€

repositories {
    // ... other project repositories
    jcenter()
    maven { url 'https://jitpack.io' }
    maven { url 'https://maven.google.com' }
}

// ...
dependencies {
    // ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „์ฒด๋ฅผ ํฌํ•จํ•  ๊ฒฝ์šฐ(์ถ”๊ฐ€ ์‹œ [email protected]๋กœ ๋…ธํ‹ฐ ํ•„์š”)
    implementation 'com.github.adxcorp.ADXLibrary_Android:adx-library:1.17.0'

    // ๋„ค์ดํ‹ฐ๋ธŒ๋งŒ ํฌํ•จํ•  ๊ฒฝ์šฐ
    implementation 'com.github.adxcorp.ADXLibrary_Android:adx-library-native:1.17.0'

    // ์ „๋ฉด/๋ฐฐ๋„ˆ๋งŒ ํฌํ•จํ•  ๊ฒฝ์šฐ
    implementation 'com.github.adxcorp.ADXLibrary_Android:adx-library-standard:1.17.0'

    // ๋ฆฌ์›Œ๋“œ ๋น„๋””์˜ค๋งŒ ํฌํ•จํ•  ๊ฒฝ์šฐ
    implementation 'com.github.adxcorp.ADXLibrary_Android:adx-library-rewarded-video:1.17.0'

    // ์˜ˆ๋ฅผ ๋“ค์–ด ์ „๋ฉด/๋ฐฐ๋„ˆ/๋„ค์ดํ‹ฐ๋ธŒ๋ฅผ ํฌํ•จํ•  ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    implementation 'com.github.adxcorp.ADXLibrary_Android:adx-library-standard:1.17.0'
    implementation 'com.github.adxcorp.ADXLibrary_Android:adx-library-native:1.17.0'

    // Google Play Service Ads 20.1.0 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    implementation 'com.google.android.gms:play-services-ads:20.1.0'
}

android {
    compileOptions {
       sourceCompatibility 1.8
       targetCompatibility 1.8
    }
}

2. Initialize

MainActivity onCreate์—์„œ ๊ด‘๊ณ  ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „, ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฐœ๊ธ‰๋ฐ›์œผ์‹  Ad Unit ID ์ค‘ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜์—ฌ initialize ํ•ด์ฃผ์‹œ๊ณ , onResult๊ฐ€ ํ˜ธ์ถœ ๋œ ๋‹ค์Œ ๊ด‘๊ณ  ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. initialize function์€ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

EU ํŠธ๋ž˜ํ”ฝ์ด ์—†์œผ์‹  ๊ฒฝ์šฐ์—๋Š” initWithSaveGDPRState๋ฅผ ์ด์šฉํ•˜์—ฌ ADXConsentStateNotRequired๋กœ ๋™์˜ ์—ฌ๋ถ€๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์‹œ๋ฉด ๋˜๋ฉฐ, initWithShowAdxConsent์˜ isDebug๋ฅผ true๋กœ ์„ค์ •ํ•˜์‹œ๋ฉด EU ๋‚ด์—์„œ ๋…ธ์ถœ๋˜๋Š” Consent UI๋ฅผ ํ™•์ธํ•˜์‹ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์„ธํ•œ ๋‚ด์šฉ์€ ํ•˜๋‹จ์˜ GDPR ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

- ์‚ฌ์šฉ์ž์˜ ์œ„์น˜ ๋ฐ ๋™์˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ ๋™์˜ UI ๋…ธ์ถœ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

ADXGDPR.initWithShowAdxConsent(activity, "<YOUR AD Unit ID>", isDebug, new ADXGDPR.ADXConsentListener() {
        @Override
        public void onResult(ADXGDPR.ADXConsentState adxConsentState) {
                
        }
});

- ์ง์ ‘ ๋™์˜ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•˜์‹œ๋Š” ๊ฒฝ์šฐ (๋™์˜ UI ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ)

ADXGDPR.initWithSaveGDPRState(activity, "<YOUR AD Unit ID>", adxConsentState, new ADXGDPR.ADXConsentListener() {
        @Override
        public void onResult(ADXGDPR.ADXConsentState adxConsentState) {

        }
});

- Native Ad์™€ ๊ด€๋ จ๋œ function์„ initialize function๊ณผ ๋™์ผํ•œ activity์—์„œ ํ˜ธ์ถœํ•˜์‹œ๋Š” ๊ฒฝ์šฐ

initWithShowAdxConsent ๋˜๋Š” initWithSaveGDPRState์™€ ๊ฐ™์€ initialize function์„ ํ˜ธ์ถœํ•˜์‹œ๊ธฐ ์ „, NativeAdFactory.init()๊ณผ NativeAdFactory.setViewBinder()๋ฅผ ๋จผ์ € ํ˜ธ์ถœํ•ด์ฃผ์‹œ๊ณ , ์•„๋ž˜ ์˜ˆ์‹œ ์ฝ”๋“œ์™€ ๊ฐ™์ด ADXConsentListener์˜ onResult ๋‚ด์—์„œ NativeAdFactory.preloadAd()๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

NativeAdFactory.init(context);
NativeAdFactory.setViewBinder(DefineAdUnitId.NATIVE_AD_UNIT_ID, new ViewBinder.Builder(R.layout.layout_native_ad)
                .mainImageId(R.id.mainImageId)
                .iconImageId(R.id.iconImageId)
                .titleId(R.id.titleId)
                .privacyInformationIconImageId(R.id.privacyInformationIconImageId)
                .callToActionId(R.id.callToActionId)
                .addExtra("ad_choices_container", R.id.ad_choices_container)
                .build());
NativeAdFactory.setAdxViewBinder(DefineAdUnitId.NATIVE_AD_UNIT_ID, new ADXViewBinder.Builder(R.layout.layout_media_native_ad)
                .mediaViewContainerId(R.id.mediaContainerId)
                .adIconViewContainerId(R.id.adIconContainerId)
                .titleId(R.id.titleId)
                .adChoiceContainerId(R.id.adChoicesContainerId)
                .callToActionId(R.id.callToActionId)
                .build());

ADXGDPR.initWithShowAdxConsent(this, DefineAdUnitId.BANNER_AD_UNIT_ID, true, new ADXGDPR.ADXConsentListener() {
        @Override
        public void onResult(ADXGDPR.ADXConsentState adxConsentState) {
                NativeAdFactory.preloadAd(DefineAdUnitId.NATIVE_AD_UNIT_ID);
        }

});

3.Rewarded Video ์—ฐ๋™ ์„ ํƒ

MoPub/AdMob ์—ฐ๋™ ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ์ •์ƒ์ ์œผ๋กœ callback ํ˜ธ์ถœ์ด ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ์—ฐ๋™ ์ฝ”๋“œ๋งŒ ์‚ฌ์šฉํ•ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4. Add test device

AdMob Rewarded Video๋ฅผ ์ด์šฉํ•˜์‹ค ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ค‘ ๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋””๋ฐ”์ด์Šค๋ฅผ ๋“ฑ๋ก ํ›„ ์‚ฌ์šฉํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋””๋ฐ”์ด์Šค ๋ฏธ๋“ฑ๋ก ์ƒํƒœ๋กœ ํ…Œ์ŠคํŠธํ•  ๊ฒฝ์šฐ ๊ณ„์ •์ด ์ •์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AdMob์„ ์ด์šฉํ•˜์—ฌ Rewarded Video๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์‚ฝ์ž… ๋œ ์ƒํƒœ๋กœ run ํ•ด์ฃผ์‹œ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 Ads: Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("9E928D273E90AF6642DB99539DB71311") 
      to get test ads on this device.

์ถœ๋ ฅ ๋œ Device ID๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด AdRequest์—์„œ AddTestDevice๋ฅผ call ํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.

RequestConfiguration configuration = new RequestConfiguration.Builder()
                        .setTestDeviceIds(Arrays.asList("9E928D273E90AF6642DB99539DB71311")).build();
MobileAds.setRequestConfiguration(configuration);

5. ๋””๋ฒ„๊น… ๋กœ๊ทธ ํ™œ์„ฑํ™”

๋ฏธ๋””์—์ด์…˜์ด ์ •์ƒ ๋™์ž‘ ํ™•์ธ์„ ์œ„ํ•ด Initialize ํ•˜๊ธฐ ์ „์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ADXLogUtil.setLogEnable(true);

* GDPR Guide

  • GDPR ๊ทœ์ •์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ADXGDPR class ์—์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ function์„ ์‚ฌ์šฉํ•˜์‹ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// ADXLibrary๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๊ณ , GDPR ๊ทœ์ •์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๊ธฐ์กด ๋™์˜ ์—ฌ๋ถ€์™€ EU ์‚ฌ์šฉ์ž ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ ๊ฐœ์ธ์ •๋ณด ์ˆ˜์ง‘ ๋ฐ ์ด์šฉ์— ๋Œ€ํ•œ ๋™์˜ ํ™”๋ฉด์„ ๋…ธ์ถœํ•˜์—ฌ ๋™์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
public static void initWithShowAdxConsent(final Activity activity, String mopubAdUnitId, final boolean isDebug, final ADXConsentListener gdprListener)

// ADXLibrary๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๊ณ , ๋™์˜ ํ™”๋ฉด ๋…ธ์ถœ ์—†์ด ์ง์ ‘ ๋™์˜ ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
public static void initWithSaveGDPRState(final Context context, final String mopubAdUnitId, final ADXConsentState consentState, final ADXConsentListener gdprListener)

// ADXGDPR์— ์„ค์ •๋œ ์‚ฌ์šฉ์ž์˜ ๋™์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public static int getResultGDPR(Context context)

// ์ง์ ‘ ๋™์˜ ์—ฌ๋ถ€๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
public static void saveResultGDPR(Context context, ADXGDPR.ADXConsentState consentState)

// AD(x)์˜ Privacy Policy URL์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
public static String getPrivacyURL()

  • ADXConsentState๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ 4๊ฐ€์ง€ ์ƒํƒœ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
// ๋™์˜์—ฌ๋ถ€๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž๋กœ, initialize function ๋ฏธํ˜ธ์ถœ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธํ™” ๊ด‘๊ณ ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ADXConsentStateUnknown
// EU๋‚ด์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋™์˜์—ฌ๋ถ€๊ฐ€ ๋ถˆํ•„์š”ํ•œ ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธํ™” ๊ด‘๊ณ ๊ฐ€ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
ADXConsentStateNotRequired
// ๊ฐœ์ธ์ •๋ณด ํ™œ์šฉ ๋™์˜ ํ™”๋ฉด์—์„œ ๊ฑฐ์ ˆ์„ ์„ ํƒํ•œ ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธํ™” ๊ด‘๊ณ ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ADXConsentStateDenied
// ๊ฐœ์ธ์ •๋ณด ํ™œ์šฉ ๋™์˜ ํ™”๋ฉด์—์„œ ์Šน์ธ์„ ์„ ํƒํ•œ ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธํ™” ๊ด‘๊ณ ๊ฐ€ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
ADXConsentStateConfirm
  • Application ์‹คํ–‰์‹œ ์›ํ•˜์‹œ๋Š” ๋ฐฉ์‹์— ๋งž์ถฐ initWithShowAdxConsent ๋˜๋Š” initWithSaveGDPRState๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • EU ํŠธ๋ž˜ํ”ฝ์ด ์—†์œผ์‹  ๊ฒฝ์šฐ์—๋Š” initWithSaveGDPRState๋ฅผ ์ด์šฉํ•˜์—ฌ ADXConsentStateNotRequired๋กœ ๋™์˜ ์—ฌ๋ถ€๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • initWithShowAdxConsent์˜ isDebug๋ฅผ true๋กœ ์„ค์ •ํ•˜์‹œ๋ฉด EU ๋‚ด์—์„œ ๋…ธ์ถœ๋˜๋Š” Consent UI๋ฅผ ํ™•์ธํ•˜์‹ค์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ด‘๊ณ  ๊ด€๋ จ ์ฝ”๋“œ๋Š” ADXConsentListener์˜ onResult๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์„ธ์š”.
  • NativeAdFactory์˜ init()๊ณผ setViewBinder()๊ฐ€ initialize function๊ณผ ๋™์ผํ•œ activity์—์„œ ํ˜ธ์ถœ๋  ๊ฒฝ์šฐ, initialize function ๋ณด๋‹ค ๋จผ์ € ํ˜ธ์ถœํ•ด์ฃผ์„ธ์š”.
  • initialize function์˜ AD Unit ID๋Š” ๋ฐœ๊ธ‰๋ฐ›์œผ์‹  ๊ฒƒ๋“ค ์ค‘ ์ž„์˜์˜ ๊ฒƒ์„ ํ•˜๋‚˜ ์‚ฌ์šฉํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • AdMob Rewarded Video๋ฅผ ์‚ฌ์šฉํ•˜์‹ค ๊ฒฝ์šฐ AdRequest์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด extra data๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Bundle extras = new Bundle();
if (ADXGDPR.ADXConsentState.values()[ADXGDPR.getResultGDPR(this)] == ADXGDPR.ADXConsentState.ADXConsentStateDenied) {
        extras.putString("npa", "1");
}

AdRequest request =  new AdRequest.Builder()
                .addNetworkExtrasBundle(AdMobAdapter.class, extras)
                .build();