การพัฒนาอะแดปเตอร์สื่อกลางเครือข่ายโฆษณา

คู่มือนี้มีไว้สําหรับเครือข่ายโฆษณาที่ต้องการสร้างอะแดปเตอร์สื่อกลาง หากคุณเป็นผู้เผยแพร่โฆษณา โปรดดู วิธีการเป็นสื่อกลางของผู้เผยแพร่โฆษณา

อะแดปเตอร์เครือข่ายโฆษณาคือชั้นของการสื่อสารระหว่างเครือข่ายโฆษณาของคุณกับสื่อกลางโฆษณาในอุปกรณ์เคลื่อนที่ของ Google

อะแดปเตอร์มีหน้าที่รับผิดชอบในการติดตั้งใช้งาน MediationBannerAdapter เพื่อรองรับโฆษณาแบนเนอร์ และ MediationInterstitialAdapter เพื่อรองรับโฆษณาคั่นระหว่างหน้า และยังต้องเรียกใช้การเรียกกลับใน MediationBannerListener และ MediationInterstitialListener ในเวลาที่เหมาะสมเพื่อแจ้งสื่อกลางโฆษณาในอุปกรณ์เคลื่อนที่ของ Google เกี่ยวกับเหตุการณ์เหล่านี้ ซึ่งสามารถส่งต่อไปยังนักพัฒนาแอปได้เช่นกัน

ตัวอย่างเครือข่ายโฆษณา

คู่มือนี้สาธิตวิธีสร้างอะแดปเตอร์สำหรับเครือข่ายโฆษณาตัวอย่าง เครือข่ายโฆษณาตัวอย่างประกอบด้วยคลาสต่อไปนี้ซึ่งเป็นตัวแทนของคลาสที่ให้บริการโดยเครือข่ายโฆษณาส่วนใหญ่

class SampleAdView {
    public SampleAdView(Context context);
    public void setSize(SampleAdSize size);
    public void setAdUnit(String sampleAdUnit);
    public void setAdListener(SampleAdListener listener);
    public void fetchAd(SampleAdRequest request);
    public void destroy();
}

class SampleAdSize {
    public SampleAdSize(int width, int height);
    public int getWidth();
    public int getHeight();
}

class SampleAdRequest {
    public SampleAdRequest();
    public void setKeywords(Set<String> keywords);
    public void setTestMode(boolean useTesting);
}

class SampleAdListener {
    public void onAdFetchSucceeded();
    public void onAdFetchFailed(SampleErrorCode code);
    public void onAdFullScreen();
    public void onAdClosed();
}

enum SampleErrorCode {
    UNKNOWN,
    BAD_REQUEST,
    NETWORK_ERROR,
    NO_INVENTORY
}

class SampleInterstitial {
    public SampleInterstitial(Context context);
    public void setAdUnit(String sampleAdUnit);
    public void setAdListener(SampleAdListener listener);
    public void fetchAd(SampleAdRequest request);
    public void show();
    public void destroy();
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับคลาสเหล่านี้ได้ที่การใช้งาน SDK ที่สมบูรณ์

ใช้อะแดปเตอร์แบนเนอร์

หากต้องการใช้อะแดปเตอร์ที่รองรับโฆษณาแบนเนอร์ ให้สร้างคลาสที่ใช้งาน MediationBannerAdapter

public class SampleAdapter implements MediationBannerAdapter {
    @Override
    public void requestBannerAd(
            Context context,
            MediationBannerListener listener,
            Bundle serverParameters,
            AdSize adSize,
            MediationAdRequest mediationAdRequest,
            Bundle mediationExtras) {}

    @Override
    public View getBannerView() {}

    @Override
    public void onDestroy() {}

    @Override
    public void onPause() {}

    @Override
    public void onResume() {}
}

ก่อนที่จะลงลึกในการติดตั้งใช้งาน MediationBannerAdapter เรามาพูดถึงพารามิเตอร์ของเซิร์ฟเวอร์ ส่วนเสริมสื่อกลาง และวิธีส่งค่าเหล่านี้ไปยังอะแดปเตอร์กัน

พารามิเตอร์เซิร์ฟเวอร์

เครือข่ายโฆษณาอาจต้องใช้ตัวระบุบางอย่างเพื่อระบุผู้เผยแพร่โฆษณา ตัวอย่างเช่น เครือข่ายโฆษณาตัวอย่างต้องใช้เพียงหน่วยโฆษณา 1 หน่วย เป็นต้น พารามิเตอร์ที่จำเป็นเหล่านี้จะมีอยู่ในแพ็กเกจ serverParameters ภายใน requestBannerAd() ระหว่างการพัฒนา คุณจะสันนิษฐานได้ว่าจะมีการป้อนข้อมูลคีย์ที่คุณต้องการในแพ็กเกจแล้ว ดังนี้

private static final String SAMPLE_AD_UNIT_KEY = "ad_unit";

@Override
public void requestBannerAd(
        Context context,
        MediationBannerListener listener,
        Bundle serverParameters,
        AdSize adSize,
        MediationAdRequest mediationAdRequest,
        Bundle mediationExtras) {
    String adUnit = serverParameters.getString(SAMPLE_AD_UNIT_KEY);
    ...
}

AdMob จะส่งแบบสอบถามให้คุณเพื่อสอบถามเกี่ยวกับพารามิเตอร์ของเซิร์ฟเวอร์ที่คุณจำเป็นต้องใช้จากผู้เผยแพร่โฆษณาเพื่อขอและแสดงโฆษณา AdMob จะใช้อินพุตนั้น ในการกำหนดค่าเครือข่ายใน UI ของ AdMob ภาพหน้าจอด้านล่างแสดงให้เห็นว่า APID จำเป็นต้องมีสำหรับ Millennial Media และรหัสแอปสำหรับ InMobi

AdMob จะใช้ข้อมูลนี้เพื่อสร้างแพ็กเกจ serverParameters เมื่อยืนยันอะแดปเตอร์

ดูข้อมูลเพิ่มเติมว่าผู้เผยแพร่โฆษณาจะกำหนดค่าเครือข่ายโฆษณาสื่อกลางอย่างไรได้จากบทความนี้

พารามิเตอร์การกำหนดเป้าหมายเพิ่มเติม

MediationAdRequest ประกอบด้วยข้อมูลการกําหนดเป้าหมายทั่วไปบางส่วนที่คุณใช้เพื่อการกำหนดเป้าหมายโฆษณาได้ เช่น

ส่วนเสริมสำหรับสื่อกลาง

หากเครือข่ายโฆษณารองรับข้อมูลการกำหนดเป้าหมายที่ MediationAdRequest ไม่ได้ให้ไว้ นักพัฒนาแอปสามารถส่งแพ็กเกจ mediationExtras ไปยังเครือข่ายของคุณโดยเฉพาะได้ สื่อกลางจะแสดงตัวอย่าง วิธีส่งส่วนเสริมสื่อกลาง

คุณสามารถระบุคลาสเครื่องมือสร้างแพ็กเกจในอะแดปเตอร์เพื่อให้นักพัฒนาแอปเลือกส่งข้อมูลนี้ได้ง่ายขึ้น สมมติว่าเครือข่ายของคุณสนับสนุน การส่งมูลค่ารายได้ คุณสามารถเพิ่มคลาสเครื่องมือสร้างในอะแดปเตอร์ที่กำหนดรายได้ ดังนี้

public static final class BundleBuilder {
    private int income;

    public BundleBuilder setIncome(int income) {
        this.income = income;
        return this;
    }

    public Bundle build() {
        Bundle bundle = new Bundle();
        bundle.putInt("income", income);
        return bundle;
    }
}

คลาสนี้มี API ที่ชัดเจนเพื่อให้นักพัฒนาซอฟต์แวร์สร้างแพ็กเกจสำหรับเครือข่ายของคุณ ดังนี้

Bundle sampleAdapterBundle =
        new SampleAdapter.BundleBuilder().setIncome(100000).build();

requestBannerAd()

ตอนนี้คุณได้รู้จักพารามิเตอร์เซิร์ฟเวอร์และส่วนขยายสื่อกลางแล้ว เราสามารถใช้พารามิเตอร์ดังกล่าวเพื่อสร้าง MediationBannerAdapter ได้

ระบบจะเรียกใช้เมธอด requestBannerAd() ทันทีหลังจากที่สร้างอินสแตนซ์อะแดปเตอร์แล้ว ซึ่งเป็นส่วนที่คุณควรสร้างมุมมองโฆษณาและส่งคำขอโฆษณาแบนเนอร์

การติดตั้งใช้งาน requestBannerAd() สำหรับเครือข่ายโฆษณาตัวอย่างจะมีลักษณะดังนี้

public class SampleAdMobAdapter implements MediationBannerAdapter {
    private static final String SAMPLE_AD_UNIT_KEY = "ad_unit";
    private SampleAdView sampleAdView;

    @Override
    public void requestBannerAd(
            Context context, // May be an application context.
            MediationBannerListener listener,
            Bundle serverParameters,
            AdSize adSize,
            MediationAdRequest mediationAdRequest,
            Bundle mediationExtras) {
        sampleAdView = new SampleAdView(context);

        if (serverParameters.containsKey(SAMPLE_AD_UNIT_KEY)) {
            sampleAdView.setAdUnit(serverParameters.getString(SAMPLE_AD_UNIT_KEY));
        } else {
            listener.onAdFailedToLoad(this, AdRequest.ERROR_CODE_INVALID_REQUEST);
        }

        sampleAdView.setSize(
                new SampleAdSize(adSize.getWidth(),adSize.getHeight()));

        sampleAdView.setAdListener(
                new SampleBannerEventForwarder(listener, this));

        SampleAdRequest request = new SampleAdRequest();
        request.setTestMode(mediationAdRequest.isTesting());
        request.setKeywords(mediationAdRequest.getKeywords());
        sampleAdView.fetchAd(request);
    }
}

อย่าคิดไปเองว่าพารามิเตอร์บริบทเป็นประเภท Activity สื่อกลางโฆษณาในอุปกรณ์เคลื่อนที่ของ Google อาจส่งต่อบริบทแอปพลิเคชันไปยังอะแดปเตอร์ ทั้งนี้ขึ้นอยู่กับการติดตั้งใช้งานของผู้เผยแพร่โฆษณา หากอะแดปเตอร์จัดการบริบทแอปพลิเคชันไม่ได้ ขอแนะนำให้เรียกใช้ onAdFailedToLoad() ที่มีรหัสข้อผิดพลาด AdRequest.ERROR_CODE_INVALID_REQUEST

โค้ดเรียกกลับ MediationBannerListener

คุณควรบันทึก MediationBannerListener ที่ให้ไว้ใน requestBannerAd() เพื่อให้ส่งต่อเหตุการณ์โฆษณากลับไปยังสื่อกลางโฆษณาในอุปกรณ์เคลื่อนที่ของ Google ได้ การเรียกกลับแต่ละรายการจะต้องเรียกใช้ในเวลาที่เหมาะสมในวงจรของโฆษณา

วิธีการ เวลาที่จะโทร
onAdLoaded() ส่งคำขอแบนเนอร์สำเร็จแล้ว
onAdFailedToLoad() คำขอแบนเนอร์ล้มเหลว
onAdClicked() คลิกแบนเนอร์แล้ว
onAdOpened() แบนเนอร์จะแสดงผลในมุมมองเต็มหน้าจอ
onAdClosed() ผู้ใช้กลับไปที่แอปหลังจากคลิกแบนเนอร์
onAdLeftApplication() แบนเนอร์ทำให้ผู้ใช้ออกจากแอป

อะแดปเตอร์เครือข่ายโฆษณาตัวอย่างจะสร้างคลาสชื่อ SampleBannerEventForwarder เพื่อจัดการการส่งต่อเหตุการณ์ ดังนี้

public class SampleBannerEventForwarder extends SampleAdListener {
    private MediationBannerListener mediationListener;
    private SampleAdapter adapter;

    public SampleBannerEventForwarder(
            MediationBannerListener listener, SampleAdapter adapter) {
        this.mediationListener = listener;
        this.adapter = adapter;
    }

    @Override
    public void onAdFetchSucceeded() {
        mediationListener.onAdLoaded(adapter);
    }

    @Override
    public void onAdFetchFailed(SampleErrorCode errorCode) {
        switch(errorCode) {
            case UNKNOWN:
                mediationListener.onAdFailedToLoad(adapter, AdRequest.ERROR_CODE_INTERNAL_ERROR);
                break;
            case BAD_REQUEST:
                mediationListener.onAdFailedToLoad(adapter, AdRequest.ERROR_CODE_INVALID_REQUEST);
                break;
            case NETWORK_ERROR:
                mediationListener.onAdFailedToLoad(adapter, AdRequest.ERROR_CODE_NETWORK_ERROR);
                break;
            case NO_INVENTORY:
                mediationListener.onAdFailedToLoad(adapter, AdRequest.ERROR_CODE_NO_FILL);
                break;
        }
    }

    @Override
    public void onAdFullScreen() {
        mediationListener.onAdClicked(adapter);
        mediationListener.onAdOpened(adapter);
        mediationListener.onAdLeftApplication(adapter);
    }

    @Override
    public void onAdClosed() {
        mediationListener.onAdClosed(adapter);
    }
}

สังเกตวิธีที่อะแดปเตอร์เครือข่ายโฆษณาตัวอย่างส่ง onAdClicked, onAdOpened และ onAdLeftApplication ในโค้ดเรียกกลับเดียวกัน แม้ว่าการเรียกกลับสำหรับเครือข่ายของคุณอาจไม่ตรงกับการเรียกกลับที่โฆษณาบนอุปกรณ์เคลื่อนที่ของ Google กำหนดไว้ แต่อะแดปเตอร์จะต้องรับผิดชอบในการแมปที่สมเหตุสมผล

getBannerView

เมื่อคุณเรียกใช้ MediationBannerListener.onAdLoaded() สื่อกลางจะเรียกใช้ getBannerView() เพื่อให้มุมมองแบนเนอร์ของเครือข่ายโฆษณาแสดงบนหน้าจอ เพียงแค่แสดงมุมมองแบนเนอร์ที่คุณสร้างขึ้นใน requestBannerAd():

@Override
public View getBannerView() {
    return sampleAdView;
}

เหตุการณ์ในวงจรกิจกรรม

สื่อกลางจะแจ้งอะแดปเตอร์เกี่ยวกับเหตุการณ์กิจกรรม onPause() และ onResume() หากนักพัฒนาแอปแจ้งสื่อกลางเกี่ยวกับเหตุการณ์ดังกล่าว ดำเนินการหยุดแบนเนอร์ชั่วคราวและกลับมาใช้งานต่อตามขั้นตอนต่อไปนี้

@Override
public void onPause() {
}

@Override
public void onResume() {
}

เครือข่ายโฆษณาตัวอย่างจะไม่รวมการหยุดชั่วคราวหรือการโทรต่อ ดังนั้นจึงมีการติดตั้งใช้งานที่ว่างเปล่า

สื่อกลางจะพยายามเรียกใช้ onDestroy() เมื่ออะแดปเตอร์กำลังจะทำลาย ดำเนินการทำความสะอาดที่จำเป็นที่นี่

@Override
public void onDestroy() {
    if (sampleAdView != null) {
        sampleAdView.destroy();
    }
}

แบนเนอร์อัจฉริยะ

SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google รองรับขนาดโฆษณาแบนเนอร์อัจฉริยะ ซึ่งมีความกว้างเต็ม และความสูงเปลี่ยนแปลงได้โดยขึ้นอยู่กับขนาดของอุปกรณ์

หากต้องการได้ขนาดโฆษณาของแบนเนอร์อัจฉริยะอย่างถูกต้อง อะแดปเตอร์ของคุณควรใช้ adSize.getWidthInPixels(context) แทนความกว้าง และใช้ adSize.getHeightInPixels(context) แทน adSize.getHeight() เพื่อหาความสูง จากนั้นค่าควรหารด้วยความหนาแน่นของอุปกรณ์ ดังนี้

int widthInPixels = adSize.getWidthInPixels(context);
int heightInPixels = adSize.getHeightInPixels(context);
DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
int widthInDp = Math.round(widthInPixels / displayMetrics.density);
int heightInDp = Math.round(heightInPixels / displayMetrics.density);

จากนั้นคุณจะใช้ widthInDp และ heightInDp เป็นขนาดเมื่อสร้างคำขอโฆษณาได้

เท่านี้ก็เรียบร้อย ตอนนี้คุณมีอะแดปเตอร์สื่อกลางสำหรับแบนเนอร์ที่ใช้งานได้แล้ว เพื่อเป็นข้อมูลอ้างอิง คุณสามารถดูการติดตั้งใช้งาน SampleAdapter โดยสมบูรณ์ได้ที่นี่

ใช้อะแดปเตอร์คั่นระหว่างหน้า

การใช้งานอะแดปเตอร์สำหรับโฆษณาคั่นระหว่างหน้าจะคล้ายกับโฆษณาแบนเนอร์ หากต้องการใช้อะแดปเตอร์ที่รองรับโฆษณาคั่นระหว่างหน้า ให้สร้างคลาสที่มีการใช้งาน MediationInterstitialAdapter โดยทำดังนี้

public class SampleAdapter implements MediationInterstitialAdapter {
    @Override
    public void requestInterstitialAd(
            Context context,
            MediationInterstitialListener listener,
            Bundle serverParameters,
            MediationAdRequest mediationAdRequest,
            Bundle mediationExtras) {}

    @Override
    public View showInterstitial() {}

    @Override
    public void onDestroy() {}

    @Override
    public void onPause() {}

    @Override
    public void onResume() {}
}

หากอะแดปเตอร์ของคุณรองรับแบนเนอร์ด้วย คุณสามารถใช้คลาสอะแดปเตอร์เดียวกันเพื่อใช้งานอินเทอร์เฟซทั้ง 2 แบบ

มาทำความคุ้นเคยกับพารามิเตอร์เซิร์ฟเวอร์และส่วนเสริมของสื่อกลางก่อนเริ่มใช้งาน MediationInterstitialAdapter

พารามิเตอร์เซิร์ฟเวอร์ (โฆษณาคั่นระหว่างหน้า)

ดูส่วนพารามิเตอร์เซิร์ฟเวอร์แบนเนอร์

พารามิเตอร์การกำหนดเป้าหมายเพิ่มเติม (โฆษณาคั่นระหว่างหน้า)

ดูส่วนพารามิเตอร์การกำหนดเป้าหมายเพิ่มเติมของแบนเนอร์

ส่วนเสริมสื่อกลาง (โฆษณาคั่นระหว่างหน้า)

ดูส่วนส่วนเสริมสื่อกลางแบนเนอร์

requestInterstitialAd

ระบบจะเรียกใช้เมธอด requestInterstitialAd() ทันทีหลังจากที่สร้างอินสแตนซ์อะแดปเตอร์แล้ว ซึ่งเป็นขั้นตอนที่คุณควรสร้างโฆษณาคั่นระหว่างหน้าและส่งคำขอโฆษณาคั่นระหว่างหน้า

การใช้ requestInterstitialAd() สำหรับเครือข่ายโฆษณาตัวอย่างจะมีลักษณะดังนี้

public class SampleAdapter implements MediationBannerAdapter {
    private static final String SAMPLE_AD_UNIT_KEY = "ad_unit";

    private SampleInterstitial sampleInterstitial;

    @Override
    public void requestInterstitialAd(
            Context context, // May be an application context.
            MediationInterstitialListener listener,
            Bundle serverParameters,
            MediationAdRequest mediationAdRequest,
            Bundle mediationExtras) {
        sampleInterstitial = new SampleInterstitial(context);

        if (serverParameters.containsKey(SAMPLE_AD_UNIT_KEY)) {
            sampleInterstitial.setAdUnit(serverParameters.getString(SAMPLE_AD_UNIT_KEY));
        } else {
            listener.onAdFailedToLoad(this, AdRequest.ERROR_CODE_INVALID_REQUEST);
        }

        sampleInterstitial.setAdListener(
                new SampleInterstitialEventForwarder(listener, this));

        // Make an ad request.
        SampleAdRequest request = new SampleAdRequest();
        request.setTestMode(mediationAdRequest.isTesting());
        request.setKeywords(mediationAdRequest.getKeywords());
        sampleInterstitial.fetchAd(request);
    }
}

อย่าคิดไปเองว่าพารามิเตอร์บริบทเป็นประเภท "กิจกรรม" สื่อกลางโฆษณาในอุปกรณ์เคลื่อนที่ของ Google จะส่งต่อบริบทที่นักพัฒนาแอปส่งให้ และอาจส่งต่อบริบทของแอปพลิเคชันได้ หากอะแดปเตอร์จัดการบริบทแอปพลิเคชันไม่ได้ ขอแนะนำให้เรียกใช้ onAdFailedToLoad ที่มีรหัสข้อผิดพลาด AdRequest.ERROR_CODE_INVALID_REQUEST

โค้ดเรียกกลับ MediationInterstitialListener

คุณควรบันทึก MediationInterstitialListener ที่คุณได้รับใน requestInterstitialAd เพื่อให้ส่งต่อเหตุการณ์โฆษณากลับไปยังสื่อกลางโฆษณาในอุปกรณ์เคลื่อนที่ของ Google ได้ ต้องมีการเรียกใช้โค้ดเรียกกลับแต่ละรายการในเวลาที่เหมาะสมในวงจรของโฆษณา

วิธีการ เวลาที่จะโทร
onAdLoaded ส่งคำขอคั่นระหว่างหน้าสำเร็จแล้ว
onAdFailedToLoad ส่งคำขอคั่นระหว่างหน้าไม่สำเร็จ
onAdOpened กำลังแสดงโฆษณาคั่นระหว่างหน้า
onAdClosed โฆษณาคั่นระหว่างหน้าปิดอยู่
onAdLeftApplication โฆษณาคั่นระหว่างหน้าจะทำให้ผู้ใช้ออกจากแอป

showInterstitial

เมื่อเรียกใช้ MediationInterstitialListener.onAdLoaded() คุณควรรอแสดงโฆษณาคั่นระหว่างหน้าจนกว่าจะมีการเรียก showInterstitial() นักพัฒนาแอปเป็นผู้ตัดสินใจว่าจะแสดงโฆษณาคั่นระหว่างหน้าเมื่อใด ซึ่งอาจใช้เวลาหลายนาทีหลังจากที่มีการขอโฆษณา

การติดตั้งใช้งานสำหรับ showInterstitial() ค่อนข้างตรงไปตรงมา เพียงแสดงออบเจ็กต์คั่นระหว่างหน้า

@Override
public void showInterstitial() {
    sampleInterstitial.show();
}

เหตุการณ์ในวงจรกิจกรรม (โฆษณาคั่นระหว่างหน้า)

โปรดดูส่วนเหตุการณ์ในวงจรกิจกรรมแบนเนอร์

หลังจากใช้เหตุการณ์ในวงจรกิจกรรม อะแดปเตอร์สื่อกลางก็พร้อมที่จะจัดการโฆษณาคั่นระหว่างหน้าแล้ว เพื่อเป็นข้อมูลอ้างอิง คุณสามารถดูการติดตั้งใช้งาน SampleAdapter ที่สมบูรณ์ได้ที่นี่

คำถามที่พบบ่อย

ฉันจะทำอย่างไรถ้าอะแดปเตอร์รองรับเฉพาะโฆษณาแบนเนอร์หรือโฆษณาคั่นระหว่างหน้า แต่ไม่ใช่ทั้ง 2 อย่าง

หากอะแดปเตอร์รองรับเฉพาะแบนเนอร์ คุณแค่ต้องใช้อินเทอร์เฟซ MediationBannerAdapter เท่านั้น หากอะแดปเตอร์รองรับเฉพาะโฆษณาคั่นระหว่างหน้า คุณก็แค่ใช้อินเทอร์เฟซ MediationInterstitialAdapter เท่านั้น