Android のバナー広告がゲーム画面にはみ出して困った話

Android

アプリの画面上部にバナー広告を出しているのですが、極稀に「画面上部が広告に隠されてプレイできない。酷いゲーム。★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でガリガリ開発する人にとっては当たり前すぎるのでしょうか…?)

似たような問題で困っている方の助けになれば幸いです。

コメント

タイトルとURLをコピーしました