アプリの画面上部にバナー広告を出しているのですが、極稀に「画面上部が広告に隠されてプレイできない。酷いゲーム。★1。」みたいなレビューがくることがありました。
手元で発生したことは一度もなく、アダプティブバナーにも対応しているので何故そんなことに?というのでだいぶ悩んだのですが、ある方法を試したところ、上述のようなレビューが来ることはなくなりました。
なぜバナー広告がバナー領域をはみ出すのか?
バナーの表示は以下のような感じでやっていました。
mAdMobBannerAdView = new AdView(this);
mAdMobBannerAdView.setAdUnitId(adUnitId);
AdSize adSize = getAdSize();
mAdMobBannerAdView.setAdSize(adSize);
mAdMobBannerAdView.setAdListener(new AdListener() { /* 省略 */ });
LinearLayout adContainerView = new LinearLayout(this);
adContainerView.setOrientation(LinearLayout.VERTICAL);
adContainerView.addView(mAdMobBannerAdView);
mFrameLayout.addView(adContainerView);
getAdSize() は アダプティブバナーの公式ドキュメント で紹介されているものです。
adSize を指定しているので、これで問題ないと思っていました。
しかし、報告される内容から察するに、バナー広告のクリエイティブのサイズが 320×50 の縦横比と大きく違うようなケースだとどうやらはみ出すことがあるようです。
バナーがゲーム領域にはみ出さないようにする対応策
以下のようにして FrameLayout.LayoutParams を指定するようにしたところ、解消しました。
// 元のコード
mFrameLayout.addView(adContainerView);
// 対応したコード
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
adSize.getWidthInPixels(this),
adSize.getHeightInPixels(this));
mFrameLayout.addView(adContainerView, layoutParams);
このようにしておくと、仮にバナー広告のクリエイティブサイズが正方形みたいになっていても、クリッピングされるのでゲーム領域に重なることはなくなります。
手元で確認した際は、adSize.getHeightInPixels(this) を adSize.getHeightInPixels(this) * 0.9 のようにしてみて通常のバナー広告のケースでもクリッピングされるかどうかチェックしたりしました。
まとめ
バナー広告がゲーム画面にはみ出すケースの根本的な解決策を紹介しました。
そもそも「バナー広告」の広告枠なのにバナー以外の変なサイズのクリエイティブを配信してくる広告ソース側の問題の気もするのですが。
このあたり、あまり情報がなくて結構試行錯誤することになりました(cocos2d-x とか使わないで Androidでガリガリ開発する人にとっては当たり前すぎるのでしょうか…?)
似たような問題で困っている方の助けになれば幸いです。
コメント