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 外にある場合、広告が表示されない問題を修正しました。