広告表示に使う AdMob で問題発生
なぜかSDK20以降でInterstitalAdの仕様が変更!
もちろん既存コードが使えなくなる訳ではないです。
ただその実装方法がかなり分かりにくくなったので、
AdMob SKD20以降のInterstitailAdの実装を覚え書き
かなり仕様が変わってて混乱しました。
このページの目次
AdMob SDK20 は互換性を破るアップデート
バージョン20.0.0以降について
▼ 公式ではこう説明してある
バージョン 20.0.0 では、互換性を破る多数の変更が加えられる予定です。バージョン 19.7.0 では、新しい API が多く導入され、バージョン 20.0.0 のリリースに向けて、多くのクラスが非推奨になりました。このガイドでは、バージョン 19.7.0 で導入された主な変更と、バージョン 20.0.0(2021 年初頭)のリリース内容について説明しています。
引用元 : https://developers.google.com/admob/android/migration?hl=ja
この説明にもあるように、
「互換性を破る多数の変更」
これが開発者にとって少し厄介です。
クラス名とかパッケージ名が変更になったり、スマートバナーが廃止されたり、今までのRewardedVideoAd APIが削除されたり、全画面広告の仕様が変わったり、いくつかのメソッドが削除・置換されたり・・・
これまでアプリ開発にSDK20.0.0未満を使ってたんですが、実際にアップデートするとエラーが出てしまいました。互換性がないことにも事情があるけど少し厄介。
中でもInterstitialAdの仕様変更
これの移行が少してこずりました。
SDK20以降のInterstialAdの実装方法
こういう手順に変わってました。
1.AdMobライブラリの導入と初期化
自分はAdMob20.1.0を使用しています。
▼ build.gradleから導入
1 2 |
/// Admob implementation 'com.google.android.gms:play-services-ads:20.1.0' |
▼ Activity内でAdMob初期化
1 2 3 4 5 6 7 8 |
/// AdMobの初期化 MobileAds.initialize(this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus initializationStatus) { /// GDPR用同意フォーム表示 checkConsentInfo(); } }); |
ここまでは何の変更もないですね。
ただAndroidでもGDPR対応とか必要になっているので、僕自身はGDPRConsentというライブラリも導入してます。上コードの checkConsentInfo(); がその処理です。
GDPRConsentの導入手順とかは次記事参照
少し面倒だけど色々なリスクを減らせて便利です。
2.InterstitialAdの読込・表示コード書き換え
肝心の InterstitialAd の実装について
まずパッケージ名からして変わりました。
▼ 以前のパッケージ名
1 |
com.google.android.gms.ads.InterstitialAd; |
▼ SDK20以降のパッケージ名
1 |
com.google.android.gms.ads.interstitial.InterstitialAd; |
こういった書き換えがまず必要です。
そして表示コードも大幅に変わってます。
たとえば表示手順を簡易的にまとめると次の通り
1.Activity内にInterstitialAd宣言
▼ たとえばこのようなコードで
1 2 3 4 5 6 |
/// インタースティシャル広告 private InterstitialAd interstitialAd; /// 広告ユニットIDも宣言 private final String ADMOB_UNIT_ID_INTERSTITIAL = "ca-app-pub-xxxxxxxxxxxxxxxx/yyyyyyyyyy"; |
2.初期化かつ読み込み用メソッド作成
▼ 実際に書いてみたコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
private void loadInterstitialAd(){ InterstitialAd.load( MainActivity.this, ADMOB_UNIT_ID_INTERSTITIAL, new AdRequest.Builder().build(), new InterstitialAdLoadCallback() { @Override public void onAdLoaded(InterstitialAd interstitialAd) { super.onAdLoaded(interstitialAd); MainActivity.this.interstitialAd = interstitialAd; } @Override public void onAdFailedToLoad(LoadAdError loadAdError) { super.onAdFailedToLoad(loadAdError); } } ); } |
なんか今までと全然違う...
今まではInterstitalAdを直接インスタンス化してたんですが、これからは InterstitialAd.load() を使って読み込みし、そのonAdLoadedコールバックの中でInterstitialAdインスタンスが取得できます。
そして全画面広告の表示タイミングも要注意!
必ず loadInterstitialAd(); を広告表示の前に呼び出しておく必要があります。たとえば他Activityからの帰還後に表示したいなら、別Activity起動前に loadInterstitialAd(); を呼び出すこと
3.任意の場所でInterstitialAdを表示
▼ こういう感じで
1 2 3 |
if (interstitialAd != null) { interstitialAd.show(this); } |
これは今までのコードと同じですね。
AdMob20以降はInterstitialAdの実装が大幅に違う
ここまでのまとめ
AdMob20以降はInterstitialAdの実装をはじめ、大幅に変更(破壊的)されました。もしAdMobバージョンアップでエラーが出たらコードを見直してみてください。
もちろんAdMob20未満が使えなくなる訳でもないです。そのままサポートされますが、修正がそれほど多くないなら、SDK20以降にアプデしておいた方がいいかもしれません。
以上、AdMob20以降のInterstitialAdの実装でした。
間違いなどはコメント欄からどうぞ。ではまた