AdMobHelper みたいなクラスを作ってみた

テキトウに作ったので間違ってるところがあったら教えて頂けると助かります。

できること

Activity から呼び出して、広告を表示するための同意ダイアログを表示したり、広告を表示したりすること。

できないこと

非ターゲティング広告の表示。ちょっと加筆すればできるとは思います。

使い方

Activity で以下のように呼び出します。

MainActivity などの場合

同意状態の確認と、必要に応じて同意ダイアログを出す必要があります。

AdMobHelper adMobHelper = new AdMobHelper(this);
adMobHelper.updateConsentInfo(new AdMobHelper.OnConsentGivenCallback() {
    @Override
    public void onConsentGiven() {
        AdMobHelper.initialize(MainActivity.this);
        AdMobHelper.loadAdForGeneral(findViewById(R.id.adView));
    }

    @Override
    public void onConsentNotGiven() {
        MainActivity.this.finish();
    }
});

他の Activity の場合

既に同意を得ているという前提なので広告を表示するだけです。

AdMobHelper.loadAdForGeneral(findViewById(R.id.adView));

ソースコード

package your.package.name;

import android.content.Context;
import android.os.Bundle;

import com.google.ads.consent.ConsentForm;
import com.google.ads.consent.ConsentFormListener;
import com.google.ads.consent.ConsentInfoUpdateListener;
import com.google.ads.consent.ConsentInformation;
import com.google.ads.consent.ConsentStatus;
import com.google.ads.consent.DebugGeography;
import com.google.ads.mediation.admob.AdMobAdapter;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.MobileAds;

import java.net.MalformedURLException;
import java.net.URL;

public class AdMobHelper {
    private static final String MAX_AD_CONTENT_RATING = "max_ad_content_rating";
    private static final String RATING_G = "G";

    private Context context;
    private ConsentForm consentForm;

    public AdMobHelper(Context context) {
        this.context = context;
    }

    public static void initialize(Context context) {
        MobileAds.initialize(context, "ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX"); // AdMob のアプリ ID を入れる
    }

    public static void loadAdForGeneral(AdView adView) {
        AdRequest.Builder builder = new AdRequest.Builder();

        Bundle bundle = new Bundle();
        bundle.putString(MAX_AD_CONTENT_RATING, RATING_G);
        builder.addNetworkExtrasBundle(AdMobAdapter.class, bundle);

//            builder.addTestDevice("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); // 必要なら

        adView.loadAd(builder.build());
    }

    public void updateConsentInfo(OnConsentGivenCallback callback) {
        DebugGeography debugGeography = DebugGeography.DEBUG_GEOGRAPHY_DISABLED;
        if (BuildConfig.DEBUG) {
            debugGeography = DebugGeography.DEBUG_GEOGRAPHY_EEA; // デバッグ時は EEA 内にいる扱いにする
        }
        ConsentInformation consentInformation = initializeConsentInformation(debugGeography);
        String[] pubIds = {"pub-XXXXXXXXXXXXXXXX"}; // AdMob のパブリッシャー ID

        consentInformation.requestConsentInfoUpdate(pubIds, new ConsentInfoUpdateListener() {
            @Override
            public void onConsentInfoUpdated(ConsentStatus consentStatus) {
                if (consentInformation.isRequestLocationInEeaOrUnknown()) {
                    switch (consentStatus) {
                        case UNKNOWN:
                            createConsentForm(callback).load();
                            break;

                        default:
                            callback.onConsentGiven();
                    }
                // 追記 2018/12/31 端末が EEA 外にある場合は同意を得た扱いにする
                } else {
                    callback.onConsentGiven();
                }
            }

            @Override
            public void onFailedToUpdateConsentInfo(String reason) {

            }
        });
    }

    private ConsentInformation initializeConsentInformation(DebugGeography debugGeography) {
        ConsentInformation consentInformation = ConsentInformation.getInstance(context);

//        consentInformation.reset(); // 同意をリセットする場合

        consentInformation.setDebugGeography(debugGeography);

//            consentInformation.addTestDevice("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); // 必要なら

        return consentInformation;
    }

    private ConsentForm createConsentForm(OnConsentGivenCallback callback) {
        URL privacyUrl = null;
        try {
            privacyUrl = new URL("https://your.privacy.policy.url/");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

        consentForm = new ConsentForm.Builder(context, privacyUrl).withListener(new ConsentFormListener() {
            @Override
            public void onConsentFormLoaded() {
                consentForm.show();
            }

            @Override
            public void onConsentFormError(String reason) {

            }

            @Override
            public void onConsentFormOpened() {

            }

            @Override
            public void onConsentFormClosed(ConsentStatus consentStatus, Boolean userPrefersAdFree) {
                switch (consentStatus) {
                    case UNKNOWN:
                        callback.onConsentNotGiven();
                        break;

                    default:
                        callback.onConsentGiven();
                }
            }
        })
                .withPersonalizedAdsOption()
//                .withNonPersonalizedAdsOption()
//                .withAdFreeOption()
                .build();

        return consentForm;
    }

    public interface OnConsentGivenCallback {
        void onConsentGiven();

        void onConsentNotGiven();
    }
}

追記

  • 2018/12/31
    • release ビルドかつ端末が EEA 外にある場合、広告が表示されない問題を修正しました。