AdMob広告はバナーか全画面のInterstitialだけではなく色々なサイズがあります。また、指定したレイアウトにはまるようにするには PublisherAdView を使うことができます。
API 29
AdMob 広告サイズ
20.0.0 2021‑04‑05
Removed classes prefixed with Publisher (e.g.: PublisherAdView).
しばらくは残しておきますがいずれこの記事も削除する予定です。
タブレットや画面が大きくなったスマホの広告サイズはBannerかInterstitialの全画面だけだと思っていたのですが、いろいろあるようです。
AdMob フォーマット
以下のフォーマットが現在サポートされています。
サイズ(幅×高さ) | 説明 | 対応 | 広告サイズの定数値 | |
---|---|---|---|---|
320×50 | 標準のバナー | スマートフォン、タブレット | BANNER |
|
320×100 | バナー(大) | スマートフォン、タブレット | LARGE_BANNER |
|
300×250 | IAB レクタングル(中) | スマートフォン、タブレット | MEDIUM_RECTANGLE |
|
468×60 | IAB フルサイズ バナー | タブレット | FULL_BANNER |
|
728×90 | IAB ビッグバナー | タブレット | LEADERBOARD |
|
画面の幅×32|50|90 | スマートバナー | スマートフォン、タブレット | SMART_BANNER |
バナー広告 | SDK for DFP Users on Android | Google Developers
BANNER, SMART_BANNERが一般的ですが、カスタムでサイズを変更したい場合は PublisherAdView を使うとできるようです。
PublisherAdView
レイアウトの空いたところに広告を入れたいとすると、レイアウトの縦横のサイズを取得して設定します。と言っても横幅はスマホの場合は最大幅にしたほうが見やすので、高さがどれだけかになります。
getWidth()、getHeight()でサイズを取り出せますが、これはonCreate()では表示が完了していません。
onWindowFocusChanged(boolean hasFocus)
で表示されるタイミングでサイズを取得する必要があります。
そのサイズをAdSizeに設定することにより動的に広告サイズの変更が可能となります。
1 |
AdSize customAdSize = new AdSize(layoutWidth, layoutHeight); |
ただし、このAdSizeに設定するサイズは dp で入れないといけないので画面のdensityを取り出して計算することになります。
サンプルコード
Firebaseでの設定の基本的なところはこちらを確認しておいてください。
今回はFirebaseで設定しましたが、Google Mobile Ads SDKでも可能です。
Firebase consoleにてプロジェクトを登録し
google-services.json
を取得してプロジェクトに組み入れます。
gradleの設定(バージョンは環境に合わます)
build.gradle(Project: xxx)
1 2 3 4 5 6 7 8 9 10 |
buildscript { repositories { jcenter() } dependencies { ... classpath 'com.google.gms:google-services:4.3.3' ... } } |
build.gradle(Module: app)
1 2 3 4 5 6 7 |
apply plugin: 'com.android.application' ... dependencies { ... implementation 'com.google.firebase:firebase-ads:18.3.0' } apply plugin: 'com.google.gms.google-services' |
ManifestにアプリケーションIDを入れます。
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... android:theme="@style/AppThene"> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-3940256099942544~3347511713"/> <activity android:name=".MainActivity"> ... </activity> </application> </manifest> |
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
package your.package.name; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.LinearLayout; import com.google.android.gms.ads.AdSize; import com.google.android.gms.ads.MobileAds; import com.google.android.gms.ads.doubleclick.PublisherAdRequest; import com.google.android.gms.ads.doubleclick.PublisherAdView; public class MainActivity extends AppCompatActivity { private LinearLayout layout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MobileAds.initialize(getApplicationContext(),"ca-app-pub-3940256099942544~3347511713"); layout = findViewById(R.id.ad_layout); } public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); // Test用のID String AdUnitID = "ca-app-pub-3940256099942544/6300978111"; PublisherAdView adMobView = new PublisherAdView(this); adMobView.setAdUnitId(AdUnitID); float scale = getResources().getDisplayMetrics().density; int layoutWidth =(int)(layout.getWidth()/scale); int layoutHeight =(int)(layout.getHeight()/scale); AdSize customAdSize = new AdSize(layoutWidth, layoutHeight); adMobView.setAdSizes(customAdSize); layout.addView(adMobView); PublisherAdRequest adRequest = new PublisherAdRequest.Builder().build(); adMobView.loadAd(adRequest); } } |
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:ads="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ImageView android:src="@drawable/sample_image" android:scaleType="centerCrop" android:layout_width="match_parent" android:layout_height="match_parent" android:contentDescription="@string/description"/> <LinearLayout android:id="@+id/ad_layout" android:orientation="vertical" android:layout_width="match_parent" android:layout_alignParentBottom="true" android:layout_height="200dp" > </LinearLayout> </RelativeLayout> |
strings.xml
1 2 3 4 |
<resources> <string name="app_name">YourAppName</string> <string name="description">yuka</string> </resources> |
レイアウトの横幅いっぱいで高さ200dpの広告スペースを設定したところにAdMobが入りました。
広告のスペースを決めましたが、空いているところに埋め込む形にすることも可能です。
上下の高さを変えて、AdMob広告を空いているスペースに入るか試してみます。
(上の画像高さ/下の画像高さ)
広告スペースが大きくなりすぎると
「スペース全体にイメージ広告を表示しようとすると余白ができる場合は、画像が中央に配置され、両側のスペースは塗りつぶされます。」
となるようです。
関連ページ:
- FirebaseでのAdMob広告の実装 (Firebase)
- AdMob banner 広告を Android Studio で設定 (Google Mobile Ads SDK)
- AdMob 表示、非表示の切り替え
- インタースティシャルの設置
- Interstitial広告をクラスにまとめる
- AdMob サイズをPublisherAdViewを使って動的に変える
References:
バナー広告 | SDK for DFP Users on Android | Google Developers
PublisherAdView | Google APIs for Android | Google Developers