Skip to content

tpmn/applovin-max-android-tpmn-guide

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

18 Commits
ย 
ย 

Repository files navigation

1. AppLovin MAX Android SDK ์—ฐ๋™ ๊ฐ€์ด๋“œ

์‹œ์ž‘ํ•˜๊ธฐ

ID ๋ฐœ๊ธ‰

๋งค๋‹ˆ์ €๋กœ๋ถ€ํ„ฐ ๋‹ค์Œ์„ ๋ฐœ๊ธ‰ ๋ฐ›์œผ์„ธ์š”.

  • AppLovin SDK key
  • AppLovin MAX ad unit ID (์•ฑ์˜ ๊ด‘๊ณ  ํ˜•์‹๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๊ฐ’)
  • AdMob app ID (์•ฑ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๊ฐ’)
  • PointBerry inventory ID (์•ฑ์˜ ๊ด‘๊ณ  ๋‹จ์œ„๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๊ฐ’)

build.gradle

AppLovin MAX SDK์™€ AdMob ์–ด๋Œ‘ํ„ฐ, Unity Ads ์–ด๋Œ‘ํ„ฐ, Android Advertising ID, PointBerry Event Tracker๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”.

repositories {
    google()
    mavenCentral()
    maven { url 'https://jitpack.io' }
}

dependencies {
    // AppLovin MAX SDK
    implementation 'com.applovin:applovin-sdk:11.3.1'
    
    // Meta SDK
    implementation 'com.applovin.mediation:facebook-adapter:6.11.0.2'    
    implementation 'com.facebook.android:audience-network-sdk:6.11.0'

    // Vungle SDK
    implementation 'com.applovin.mediation:vungle-adapter:6.11.0.1'
    
    // AdMob-to-MAX adapter
    implementation 'com.applovin.mediation:google-adapter:20.6.0.3'

    // Unity-Ads-to-MAX adapter
    implementation 'com.applovin.mediation:unityads-adapter:4.3.0.0'

    // Android Advertising ID (AAID)
    implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'

    // PointBerry Event Tracker
    implementation 'com.github.connect-n:pointberry-event-tracker-android:1.0.3'
}

AndroidManifest.xml

๋งค๋‹ˆ์ €๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰ ๋ฐ›์€ AppLovin SDK key์™€ AdMob app ID๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

<?xml version="1.0" encoding="utf-8"?>
<manifest โ€ฆ >
    <application โ€ฆ >
        <meta-data android:name="applovin.sdk.key"
           android:value="YOUR_APPLOVIN_SDK_KEY"/>
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="YOUR_ADMOB_APP_ID"/>
        โ‹ฎ
    </application>
</manifest>

AppLovin MAX SDK ์ดˆ๊ธฐํ™”

์•ฑ์ด ์‹œ์ž‘๋œ ํ›„ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ SDK๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์„ธ์š”.

public class FirstActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        AppLovinSdk.getInstance(this).setMediationProvider(AppLovinMediationProvider.MAX);
        AppLovinSdk.getInstance(this).initializeSdk(config -> {
            // SDK๊ฐ€ ์ดˆ๊ธฐํ™”๋์Šต๋‹ˆ๋‹ค.
            // ์ด์ œ ๊ด‘๊ณ ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        });
    }
}

๋ฐฐ๋„ˆ ๊ด‘๊ณ 

๋ ˆ์ด์•„์›ƒ XML์— ๋ฐฐ๋„ˆ ์ •์˜

๊ธฐ๋ณธ ๋ฐฐ๋„ˆ ๋†’์ด๋ฅผ 50dp๋กœ ์„ค์ •ํ•˜์„ธ์š”.

<!-- res/values/attrs.xml -->

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="banner_height">50dp</dimen>
</resources>

ํƒœ๋ธ”๋ฆฟ ๋ฐฐ๋„ˆ ๋†’์ด๋ฅผ 90dp๋กœ ์„ค์ •ํ•˜์„ธ์š”.

<!-- res/values-sw600dp/attrs.xml -->

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="banner_height">90dp</dimen>
</resources>

๋ ˆ์ด์•„์›ƒ XML์— MaxAdView๋ฅผ ์ •์˜ํ•˜์„ธ์š”. ์ด๋•Œ ๋งค๋‹ˆ์ €๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰ ๋ฐ›์€ MAX ad unit ID๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

<!-- res/layout/activity_banner_ad.xml -->

<com.applovin.mediation.ads.MaxAdView
    xmlns:maxads="http://schemas.applovin.com/android/1.0"
    maxads:adUnitId="YOUR_MAX_AD_UNIT_ID"
    android:background="@color/banner_background_color" <!-- Set background or background color for banners to be fully functional -->
    android:layout_width="match_parent"                 <!-- Stretch to the width of the screen for banners to be fully functional -->
    android:layout_height="@dimen/banner_height"
</com.applovin.mediation.ads.MaxAdView>

๋ฐฐ๋„ˆ ๊ด‘๊ณ  ๋กœ๋“œ

MaxAdView์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.

MaxAdView์˜ loadAd()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ด‘๊ณ ๋ฅผ ๋กœ๋“œํ•˜์„ธ์š”.

MaxAdViewAdListener๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ๊ด‘๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์„ธ์š”.

onAdLoaded() ์ฝœ๋ฐฑ์—์„œ PointBerryImpressionTracker์˜ logImpression()์„ ํ˜ธ์ถœํ•ด์„œ ๊ด‘๊ณ  ๋…ธ์ถœ์„ ๋กœ๊น…ํ•˜์„ธ์š”. ์ด๋•Œ ๋งค๋‹ˆ์ €๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰ ๋ฐ›์€ PointBerry inventory ID๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

public class BannerAdActivity extends Activity implements MaxAdViewAdListener {

    private MaxAdView bannerAd;

    private PointBerryImpressionTracker impTracker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_banner_ad);

        bannerAd = findViewById(R.id.banner_ad);
        bannerAd.setListener(this);
        bannerAd.setPlacement("YOUR_POINTBERRY_INVENTORY_ID");

        // ์ฒซ ๊ด‘๊ณ ๋ฅผ ๋กœ๋“œํ•˜์„ธ์š”.
        bannerAd.loadAd();

        impTracker = new PointBerryImpressionTracker(getApplicationContext());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        bannerAd.destroy();
    }

    // ๊ด‘๊ณ  ์ด๋ฒคํŠธ

    @Override
    public void onAdLoaded(final MaxAd maxAd) {
        // ๊ด‘๊ณ ๊ฐ€ ๋กœ๋“œ๋์Šต๋‹ˆ๋‹ค.

        // ๊ด‘๊ณ  ๋…ธ์ถœ์„ ๋กœ๊น…ํ•˜์„ธ์š”.
        impTracker.logImpression("YOUR_POINTBERRY_INVENTORY_ID");

        // ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” development ํŒŒ๋ผ๋ฏธํ„ฐ์— true๋ฅผ ์ „๋‹ฌํ•ด์„œ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์„ธ์š”.
        // impTracker.logImpression("YOUR_POINTBERRY_INVENTORY_ID", true);
    }

    @Override
    public void onAdLoadFailed(final String adUnitId, final MaxError error) {
        // ๊ด‘๊ณ ๊ฐ€ ๋กœ๋“œ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.
    }

    @Override
    public void onAdClicked(final MaxAd maxAd) {
        // ๊ด‘๊ณ ๊ฐ€ ํด๋ฆญ๋์Šต๋‹ˆ๋‹ค.
    }

    @Override
    public void onAdExpanded(MaxAd ad) {
    }

    @Override
    public void onAdCollapsed(MaxAd ad) {
    }

    @Override
    public void onAdDisplayed(final MaxAd maxAd) {
        // ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”!
    }

    @Override
    public void onAdDisplayFailed(final MaxAd maxAd, final MaxError error) {
        // ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”!
    }

    @Override
    public void onAdHidden(final MaxAd maxAd) {
        // ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”!
    }
}

์ „๋ฉด ๊ด‘๊ณ 

์ „๋ฉด ๊ด‘๊ณ  ๋กœ๋“œ

MaxInterstitialAd์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”. ์ด๋•Œ ๋งค๋‹ˆ์ €๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰ ๋ฐ›์€ MAX ad unit ID๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

MaxInterstitialAd์˜ loadAd()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ด‘๊ณ ๋ฅผ ๋กœ๋“œํ•˜์„ธ์š”.

MaxAdListener๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ๊ด‘๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์„ธ์š”.

onAdDisplayed() ์ฝœ๋ฐฑ์—์„œ PointBerryImpressionTracker์˜ logImpression()์„ ํ˜ธ์ถœํ•ด์„œ ๊ด‘๊ณ  ๋…ธ์ถœ์„ ๋กœ๊น…ํ•˜์„ธ์š”. ์ด๋•Œ ๋งค๋‹ˆ์ €๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰ ๋ฐ›์€ PointBerry inventory ID๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

public class InterstitialAdActivity extends Activity implements MaxAdListener {

    private MaxInterstitialAd interstitialAd;
    private int retryAttempt;

    private PointBerryImpressionTracker impTracker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        interstitialAd = new MaxInterstitialAd("YOUR_MAX_AD_UNIT_ID", this);
        interstitialAd.setListener(this);

        // ์ฒซ ๊ด‘๊ณ ๋ฅผ ๋กœ๋“œํ•˜์„ธ์š”.
        interstitialAd.loadAd();

        impTracker = new PointBerryImpressionTracker(getApplicationContext());
    }

    // ๊ด‘๊ณ  ์ด๋ฒคํŠธ

    @Override
    public void onAdLoaded(final MaxAd maxAd) {
        // ๊ด‘๊ณ ๊ฐ€ ๋กœ๋“œ๋๊ณ  ์ด์ œ ๊ฒŒ์žฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        // interstitialAd.isReady()๊ฐ€ true๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

        // ๋กœ๋“œ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ๋ฆฌ์…‹ํ•˜์„ธ์š”.
        retryAttempt = 0;
    }

    @Override
    public void onAdLoadFailed(final String adUnitId, final MaxError error) {
        // ๊ด‘๊ณ ๊ฐ€ ๋กœ๋“œ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

        // ๋”œ๋ ˆ์ด๋ฅผ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ๊ด‘๊ณ  ๋กœ๋“œ๋ฅผ ์žฌ์‹œ๋„ํ•˜์„ธ์š”.
        // ๋”œ๋ ˆ์ด๋ฅผ 1์ดˆ๋ถ€ํ„ฐ 64์ดˆ๊นŒ์ง€ 2๋ฐฐ์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
        retryAttempt++;
        long delayMillis = TimeUnit.SECONDS.toMillis((long) Math.pow(2, Math.min(6, retryAttempt)));
        new Handler().postDelayed(() -> interstitialAd.loadAd(), delayMillis);
    }

    @Override
    public void onAdDisplayFailed(final MaxAd maxAd, final MaxError error) {
        // ๊ด‘๊ณ ๊ฐ€ ๊ฒŒ์žฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

        // ๋‹ค์Œ ๊ด‘๊ณ ๋ฅผ ๋กœ๋“œํ•˜์„ธ์š”.
        interstitialAd.loadAd();
    }

    @Override
    public void onAdDisplayed(final MaxAd maxAd) {
        // ๊ด‘๊ณ ๊ฐ€ ๊ฒŒ์žฌ๋์Šต๋‹ˆ๋‹ค.

        // ๊ด‘๊ณ  ๋…ธ์ถœ์„ ๋กœ๊น…ํ•˜์„ธ์š”.
        impTracker.logImpression("YOUR_POINTBERRY_INVENTORY_ID");

        // ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” development ํŒŒ๋ผ๋ฏธํ„ฐ์— true๋ฅผ ์ „๋‹ฌํ•ด์„œ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์„ธ์š”.
        // impTracker.logImpression("YOUR_POINTBERRY_INVENTORY_ID", true);
    }

    @Override
    public void onAdClicked(final MaxAd maxAd) {
        // ๊ด‘๊ณ ๊ฐ€ ํด๋ฆญ๋์Šต๋‹ˆ๋‹ค.
    }

    @Override
    public void onAdHidden(final MaxAd maxAd) {
        // ๊ด‘๊ณ ๊ฐ€ ๋‹ซํ˜”์Šต๋‹ˆ๋‹ค.

        // ๋‹ค์Œ ๊ด‘๊ณ ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜์„ธ์š”.
        interstitialAd.loadAd();
    }
}

์ „๋ฉด ๊ด‘๊ณ  ๊ฒŒ์žฌ

MaxInterstitialAd์˜ showAd()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ด‘๊ณ ๋ฅผ ๊ฒŒ์žฌํ•˜์„ธ์š”. ์ด๋•Œ ๋งค๋‹ˆ์ €๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰ ๋ฐ›์€ PointBerry inventory ID๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

if (interstitialAd.isReady()) {
    interstitialAd.showAd("YOUR_POINTBERRY_INVENTORY_ID");
}

๋ณด์ƒํ˜• ๊ด‘๊ณ 

๋ณด์ƒํ˜• ๊ด‘๊ณ  ๋กœ๋“œ

MaxRewaredAd์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”. ์ด๋•Œ ๋งค๋‹ˆ์ €๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰ ๋ฐ›์€ MAX ad unit ID๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

MaxRewaredAd์˜ loadAd()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ด‘๊ณ ๋ฅผ ๋กœ๋“œํ•˜์„ธ์š”.

MaxRewardedAdListener๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ๊ด‘๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์„ธ์š”.

onUserRewarded() ์ฝœ๋ฐฑ์—์„œ PointBerryImpressionTracker์˜ logImpression()์„ ํ˜ธ์ถœํ•ด์„œ ๊ด‘๊ณ  ๋…ธ์ถœ์„ ๋กœ๊น…ํ•˜์„ธ์š”. ์ด๋•Œ ๋งค๋‹ˆ์ €๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰ ๋ฐ›์€ PointBerry inventory ID๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

public class RewardedAdActivity extends Activity implements MaxRewardedAdListener {

    private MaxRewardedAd rewardedAd;
    private int retryAttempt;

    private PointBerryImpressionTracker impTracker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        rewardedAd = MaxRewardedAd.getInstance("YOUR_MAX_AD_UNIT_ID", this);
        rewardedAd.setListener(this);

        // ์ฒซ ๊ด‘๊ณ ๋ฅผ ๋กœ๋“œํ•˜์„ธ์š”.
        rewardedAd.loadAd();

        impTracker = new PointBerryImpressionTracker(getApplicationContext());
    }

    // ๊ด‘๊ณ  ์ด๋ฒคํŠธ

    @Override
    public void onAdLoaded(final MaxAd maxAd) {
        // ๊ด‘๊ณ ๊ฐ€ ๋กœ๋“œ๋๊ณ  ์ด์ œ ๊ฒŒ์žฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        // rewardedAd.isReady()๊ฐ€ true๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

        // ๋กœ๋“œ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ๋ฆฌ์…‹ํ•˜์„ธ์š”.
        retryAttempt = 0;
    }

    @Override
    public void onAdLoadFailed(final String adUnitId, final MaxError error) {
        // ๊ด‘๊ณ ๊ฐ€ ๋กœ๋“œ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

        // ๋”œ๋ ˆ์ด๋ฅผ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ๊ด‘๊ณ  ๋กœ๋“œ๋ฅผ ์žฌ์‹œ๋„ํ•˜์„ธ์š”.
        // ๋”œ๋ ˆ์ด๋ฅผ 1์ดˆ๋ถ€ํ„ฐ 64์ดˆ๊นŒ์ง€ 2๋ฐฐ์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
        retryAttempt++;
        long delayMillis = TimeUnit.SECONDS.toMillis((long) Math.pow(2, Math.min(6, retryAttempt)));
        new Handler().postDelayed(() -> rewardedAd.loadAd(), delayMillis);
    }

    @Override
    public void onAdDisplayFailed(final MaxAd maxAd, final MaxError error) {
        // ๊ด‘๊ณ ๊ฐ€ ๊ฒŒ์žฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

        // ๋‹ค์Œ ๊ด‘๊ณ ๋ฅผ ๋กœ๋“œํ•˜์„ธ์š”.
        rewardedAd.loadAd();
    }

    @Override
    public void onAdDisplayed(final MaxAd maxAd) {
        // ๊ด‘๊ณ ๊ฐ€ ๊ฒŒ์žฌ๋์Šต๋‹ˆ๋‹ค.
    }

    @Override
    public void onAdClicked(final MaxAd maxAd) {
        // ๊ด‘๊ณ ๊ฐ€ ํด๋ฆญ๋์Šต๋‹ˆ๋‹ค.
    }

    @Override
    public void onRewardedVideoStarted(MaxAd ad) {
        // ๊ด‘๊ณ ๊ฐ€ ์‹œ์ž‘๋์Šต๋‹ˆ๋‹ค.
    }

    @Override
    public void onRewardedVideoCompleted(MaxAd ad) {
        // ๊ด‘๊ณ ๊ฐ€ ์ข…๋ฃŒ๋์Šต๋‹ˆ๋‹ค.
    }

    @Override
    public void onUserRewarded(MaxAd ad, MaxReward reward) {
        // ์œ ์ €๊ฐ€ ๋ณด์ƒ์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

        // ๊ด‘๊ณ  ๋…ธ์ถœ์„ ๋กœ๊น…ํ•˜์„ธ์š”.
        impTracker.logImpression("YOUR_POINTBERRY_INVENTORY_ID");

        // ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” development ํŒŒ๋ผ๋ฏธํ„ฐ์— true๋ฅผ ์ „๋‹ฌํ•ด์„œ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์„ธ์š”.
        // impTracker.logImpression("YOUR_POINTBERRY_INVENTORY_ID", true);
    }

    @Override
    public void onAdHidden(final MaxAd maxAd) {
        // ๊ด‘๊ณ ๊ฐ€ ๋‹ซํ˜”์Šต๋‹ˆ๋‹ค.

        // ๋‹ค์Œ ๊ด‘๊ณ ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•˜์„ธ์š”.
        rewardedAd.loadAd();
    }
}

๋ณด์ƒํ˜• ๊ด‘๊ณ  ๊ฒŒ์žฌ

MaxRewaredAd์˜ showAd()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ด‘๊ณ ๋ฅผ ๊ฒŒ์žฌํ•˜์„ธ์š”. ์ด๋•Œ ๋งค๋‹ˆ์ €๋กœ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰ ๋ฐ›์€ PointBerry inventory ID๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

if (rewardedAd.isReady()) {
    rewardedAd.showAd("YOUR_POINTBERRY_INVENTORY_ID");
}

2. PUBMATIC MAX Android SDK ์—ฐ๋™ ๊ฐ€์ด๋“œ

์‹œ์ž‘ํ•˜๊ธฐ

PUBMATIC SDK ์—ฐ๋™์€ Prebid๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ด‘๊ณ  ํšจ์œจ ์ตœ์ ํ™” ๋ฐฉ์‹์œผ๋กœ 2023.11์›”(์˜ˆ์ •) ์‹ค ์„œ๋น„์Šค ์‹œ์ž‘์‹œ ์•ฑ ๋ณ„ ์ง‘ํ–‰ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„ ์ „๋‹ฌํ•  ์˜ˆ์ •์ด๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด ์‚ฌ์ „ ์•ฑ ๋‚ด ์„ค์ •์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€. PUBMATIC SDK Github ์ฃผ์†Œ

https://github.com/PubMatic/android-openwrap-sdk-samples

๊ฐ€. ๊ทธ๋ž˜๋“ค ์•ˆ์— ์ถ”๊ฐ€ํ•  ๋‚ด์šฉ ( build.gradle ์— ์ถ”๊ฐ€. )

// To integrate OpenWrap SDK
implementation 'com.pubmatic.sdk:openwrap:3.0.0'
// To integrate GAM event handler
implementation 'com.pubmatic.sdk:openwrap-eventhandler-dfp:3.0.0'

๋‚˜. ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์ถ”๊ฐ€

<!-- Mandatory permission for OpenWrap SDK -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!--  Ask this permission to user (at runtime from code) only for API 30+ -->

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

๋‹ค. ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์‚ฌ์šฉ์„ ์œ„ํ•œ ํ—ˆ์šฉ ์š”์ฒญ

private void Permission() {
    // Runtime optional permission list
    List<String> permissionList = new ArrayList<>();
    permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
    permissionList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
    permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
    // Access READ_PHONE_STATE permission if api level 30 and above
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        permissionList.add(Manifest.permission.READ_PHONE_STATE);
    }

    final String[] PERMISSIONS = new String[permissionList.size()];
    permissionList.toArray(PERMISSIONS);
    // Ask permission from user for location and write external storage
    if (!hasPermissions(this, PERMISSIONS)) {
        int MULTIPLE_PERMISSIONS_REQUEST_CODE = 123;
        ActivityCompat.requestPermissions(this, PERMISSIONS, MULTIPLE_PERMISSIONS_REQUEST_CODE);
    }
}


private static boolean hasPermissions(Context context, String... permissions) {
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}

๋ผ. PUBMATIC ๋ฐฐ๋„ˆ ๋ทฐ๋ฅผ ์œ„ํ•œ ์ •์˜

pubmatic Banner View

   <com.pubmatic.sdk.openwrap.banner.POBBannerView
            android:id="@+id/banner"
            android:layout_width="320dp" // android:layout_width="300dp" 
            android:layout_height="50dp" // android:layout_height="250dp"
 />

๋งˆ. PUBMATIC ์ธํ„ฐ์Šคํ‹ฐ์…œ ๋ทฐ๋ฅผ ์œ„ํ•œ ์ •์˜

// ์•„๋ž˜ ๊ฐ’๋“ค ์ค‘ ์ฝ”๋“œ ๋ฐ ์œ ๋‹› ๊ฐ’์€ ์ž„์˜ ์‚ฌํ•ญ์œผ๋กœ ์‹ค ๋ฐ˜์˜์‹œ ๋ณ„๋„ ์ œ๊ณต ์˜ˆ์ •

 // Interstitial
    void DFPInterstitial() {

        // Create an interstitial custom event handler for your ad server. Make sure
        // you use separate event handler objects to create each interstitial ad instance.
        // For example, The code below creates an event handler for DFP ad server.
        DFPInterstitialEventHandler eventHandler = new DFPInterstitialEventHandler(this, DFP_AD_UNIT_ID_Interstitial);

        // Create  interstitial instance by passing activity context and
        interstitial = new POBInterstitial(this,
                "YOUR_PUB_ID_Interstitial",                    // publisherId
                "YOUR_PROFILE_ID_Interstitial",                // profileId
                "YOUR_OPENWRAP_AD_UNIT_ONE_Interstitial",      // adUnitId
                eventHandler);

        // Set Optional listener
        interstitial.setListener(new POBInterstitialListener());


    }

// To show interstitial ad call this method
     
    private void showInterstitialAd() {
        // check if the interstitial is ready
        if (null != interstitial && interstitial.isReady()) {
            // Call show on interstitial
            interstitial.show();
        }
    }

// Interstitial Ad listener callbacks
    class POBInterstitialListener extends POBInterstitial.POBInterstitialListener {
        private final String TAG = "tpmn";

        // Callback method notifies that an ad has been received successfully.
        @Override
        public void onAdReceived(@NonNull POBInterstitial ad) {
            Log.d(TAG, "onAdReceived Interstitial");
            //Method gets called when ad gets loaded in container
            //Here, you can show interstitial ad to user
            btnInterstitial.setBackgroundColor(getResources().getColor(R.color.colorPrimary));

        }

        // Callback method notifies an error encountered while loading an ad.
        @Override
        public void onAdFailedToLoad(@NonNull POBInterstitial ad, @NonNull POBError error) {
            Log.e(TAG, "onAdFailedToLoad Interstitial : Ad failed to load with error -" + error.toString());
            //Method gets called when loadAd fails to load ad
            //Here, you can put logger and see why ad failed to load
        }

        // Callback method notifies an error encountered while showing an ad.
        @Override
        public void onAdFailedToShow(@NonNull POBInterstitial ad, @NonNull POBError error) {
            Log.e(TAG, "onAdFailedToShow Interstitial : Ad failed to show with error -" + error.toString());
            //Method gets called when loadAd fails to show ad
            //Here, you can put logger and see why ad failed to show
        }

        // Callback method notifies that a user interaction will open another app (for example, App Store), leaving the current app.
        @Override
        public void onAppLeaving(@NonNull POBInterstitial ad) {
            Log.d(TAG, "onAppLeaving");
        }

        // Callback method notifies that the interstitial ad will be presented as a modal on top of the current view controller
        @Override
        public void onAdOpened(@NonNull POBInterstitial ad) {
            Log.d(TAG, "onAdOpened Interstitial");
        }

        // Callback method notifies that the interstitial ad has been animated off the screen.
        @Override
        public void onAdClosed(@NonNull POBInterstitial ad) {
            Log.d(TAG, "onAdClosed Interstitial");
            btnInterstitial.setBackgroundColor(Color.GRAY);

        }

        // Callback method notifies ad click
        @Override
        public void onAdClicked(@NonNull POBInterstitial ad) {
            Log.d(TAG, "onAdClicked");
        }
    }

๋ฐ”. PUBMATIC ๋ฆฌ์›Œ๋“œ ๋ทฐ๋ฅผ ์œ„ํ•œ ์ •์˜

// Rewarded
    void DFPRewarded() {
    

        // Create an rewarded custom event handler for your ad server. Make sure
        // you use separate event handler objects to create each rewarded ad instance.
        // For example, The code below creates an event handler for DFP ad server.
        DFPRewardedEventHandler eventHandler = new DFPRewardedEventHandler(this, "YOUR_DFP_AD_UNIT_ID_Rewarded");

        //Create POBRewardedAd instance by passing activity context and profile parameters
        rewarded = POBRewardedAd.getRewardedAd(this,
                "YOUR_PUB_ID_Rewarded",
                "YOUR_PROFILE_ID_Rewarded",
                "YOUR_OPENWRAP_AD_UNIT_ID_Rewarded",
                eventHandler
        );

        //Set Optional Callback Listener
        rewarded.setListener(new POBRewardedAdListenerImpl());

    }

// To show Rewarded Ad Call this method

    private void showRewardedAd() {
        //Call showAd when Ad is ready
        if (rewarded != null && rewarded.isReady()) {
            rewarded.show();
        }
    }


// Rewarded Ad listener callbacks
    class POBRewardedAdListenerImpl extends POBRewardedAd.POBRewardedAdListener {
        private final String TAG = "tpmn";

        // Callback method notifies that an ad has been received successfully.
        @Override
        public void onAdReceived(@NonNull POBRewardedAd ad) {
            Log.d(TAG, "Rewarded: onAdReceived : " + ad);
            //Method gets called when ad gets loaded in container
            //Here, you can show Rewarded ad to user
            btnRewarded.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
        }

        // Callback method notifies an error encountered while loading an ad.
        @Override
        public void onAdFailedToLoad(@NonNull POBRewardedAd ad, @NonNull POBError error) {
            Log.d(TAG, "Rewarded : onAdFailedToLoad");
            Log.e(TAG, "Ad failed with load error - " + error.toString());
            //Method gets called when sdk fails to load ad
            //Here, you can put logger and see why ad failed to load
        }

        // Callback method notifies an error encountered while rendering an ad.
        @Override
        public void onAdFailedToShow(@NonNull POBRewardedAd ad, @NonNull POBError error) {
            Log.e(TAG, "Rewarded : onAdFailedToShow");
            Log.e(TAG, "Ad failed with show error - " + error.toString());
            //Method gets called when sdk fails to show ad
            //Here, you can put logger and see why ad failed to show
        }


        // Callback method notifies that a user interaction will open another app (for example, App Store), leaving the current app.
        @Override
        public void onAppLeaving(@NonNull POBRewardedAd ad) {
            Log.d(TAG, "Rewarded : onAppLeaving");
        }

        // Callback method notifies that the rewarded ad will be presented as a modal on top of the current view controller
        @Override
        public void onAdOpened(@NonNull POBRewardedAd ad) {
            Log.d(TAG, "Rewarded : onAdOpened");
        }

        // Callback method notifies that the rewarded ad has been animated off the screen.
        @Override
        public void onAdClosed(@NonNull POBRewardedAd ad) {
            Log.d(TAG, "Rewarded : onAdClosed");
            btnRewarded.setBackgroundColor(Color.GRAY);
        }

        // Callback method notifies ad click
        @Override
        public void onAdClicked(@NonNull POBRewardedAd ad) {
            Log.d(TAG, "Rewarded : onAdClicked");
        }

        @Override
        public void onReceiveReward(@NonNull POBRewardedAd ad, @NonNull POBReward reward) {
            // As this is callback method, No action Required
            Log.d(TAG, "Rewarded : Ad should Reward -" + reward.getAmount() + "(" + reward.getCurrencyType() + ")");
            Toast.makeText(getApplicationContext(), "Congratulation! You are rewarded with " + reward.getAmount() + " " + reward.getCurrencyType(), Toast.LENGTH_LONG).show();
        }
    }

์‚ฌ. PUBMATIC ๋ฐฐ๋„ˆ(320x50) ๋ทฐ๋ฅผ ์œ„ํ•œ ์ •์˜

// Banner
    private void POBView() {

        try {

            // Initialize banner view
            banner = findViewById(R.id.banner);

            // Call init() to set tag information
            // For test IDs see - https://community.pubmatic.com/display/AOPO/Test+and+debug+your+integration#Testanddebugyourintegration-Testprofile/placement

            
            // Create a banner custom event handler for your ad server. Make sure you use
            // separate event handler objects to create each banner view.
            // For example, The code below creates an event handler for DFP ad server.
            DFPBannerEventHandler eventHandler = new DFPBannerEventHandler(this, AdUnit, AdSize.BANNER);

            // Initialise banner view
            banner = findViewById(R.id.banner);
            banner.init("YOUR_PublisherId",
                    "YOUR_ProfileId",
                    "YOUR_AdUnit",
                    eventHandler);

            //optional listener to listen banner events
            banner.setListener(new POBBannerViewListener());

            // Call loadAd() on banner instance
            banner.loadAd();

 
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("tpmn", "Exception  e : " + e.getMessage());
        }
    }

์•„. PUBMATIC ๋ฐฐ๋„ˆ(MREC:300x250) ๋ทฐ๋ฅผ ์œ„ํ•œ ์ •์˜

// Banner 
    void BannerVideo() {


        // Create a banner custom event handler for your ad server. Make sure you use
        // separate event handler objects to create each banner view.
        // For example, The code below creates an event handler for DFP ad server with adsize medium rectangle i.e 300x250.
        DFPBannerEventHandler eventHandler = new DFPBannerEventHandler(this, "YOUR_DFP_AD_UNIT_ID_BV", AdSize.MEDIUM_RECTANGLE);

        // Initialise banner view
        bannerVideo = findViewById(R.id.bannerVideo);
        bannerVideo.init("YOUR_PUB_ID_BV",
                "YOUR_PROFILE_ID_BV",
                "YOUR_OPENWRAP_AD_UNIT_ID_BV",
                eventHandler);
 

        //optional listener to listen banner events
        bannerVideo.setListener(new POBBannerViewListener());

        // Call loadAd() on banner instance
        bannerVideo.loadAd();
    }


// Banner Ad listener callbacks

    class POBBannerViewListener extends POBBannerView.POBBannerViewListener {
        private final String TAG = "tpmn";

        // Callback method Notifies that an ad has been successfully loaded and rendered.
        @Override
        public void onAdReceived(@NonNull POBBannerView view) {
            Log.d(TAG, "Ad Received");
        }

        // Callback method Notifies an error encountered while loading or rendering an ad.
        @Override
        public void onAdFailed(@NonNull POBBannerView view, @NonNull POBError error) {
            Log.e(TAG, "onAdFailed : " + error.toString());
        }

        // Callback method Notifies whenever current app goes in the background due to user click
        @Override
        public void onAppLeaving(@NonNull POBBannerView view) {
            Log.d(TAG, "App Leaving");
        }

        // Callback method Notifies that the banner ad view is clicked.
        @Override
        public void onAdClicked(@NonNull POBBannerView view) {
            Log.d(TAG, "Ad Clicked");
        }

        // Callback method Notifies that the banner ad view will launch a dialog on top of the current view
        @Override
        public void onAdOpened(@NonNull POBBannerView view) {
            Log.d(TAG, "Ad Opened");
        }

        // Callback method Notifies that the banner ad view has dismissed the modal on top of the current view
        @Override
        public void onAdClosed(@NonNull POBBannerView view) {
            Log.d(TAG, "Ad Closed");
        }
    }

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๊ด‘๊ณ ๊ฐ€ ๋…ธ์ถœ๋˜๋‚˜์š”?

    ๊ด‘๊ณ ๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด MAX SDK๋ฅผ ์ ๊ฒ€ํ•˜์„ธ์š”.

  • ๊ด‘๊ณ  ๋…ธ์ถœ์ด ๋กœ๊น…๋˜๋‚˜์š”?

    logImpression("YOUR_POINTBERRY_INVENTORY_ID", true)์„ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    Successfully logged ad impression for inventory ID P_148 and advertising ID a1312407-a27a-4a2e-a52f-0a0ab89febe1

    ์„ฑ๊ณต์„ ๋œปํ•˜๋Š” ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ฆ‰ ๊ด‘๊ณ  ๋…ธ์ถœ์ด ๋กœ๊น…๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด PointBerry Event Tracker๋ฅผ ์ ๊ฒ€ํ•˜์„ธ์š”.

  • ์•ฑ ์ถœ์‹œ ์ „์—, ๊ด‘๊ณ  ๋…ธ์ถœ ๋กœ๊น…์— ๊ด€ํ•œ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋„๋ก ํ–ˆ๋‚˜์š”?

    ์ถœ์‹œ ๋ฒ„์ „์—์„œ๋Š” logImpression("YOUR_POINTBERRY_INVENTORY_ID") ๋˜๋Š” logImpression("YOUR_POINTBERRY_INVENTORY_ID", false)์„ ํ˜ธ์ถœํ•˜์„ธ์š”.

๋ฐ๋ชจ ์•ฑ

AppLovin์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ๋ชจ ์•ฑ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •