kako.dev

開発、自作アプリのこと

【アプリで収益化を目指す】AdMob入門

最近AdMobを詰め込んだアプリをリリースしました。

play.google.com

このアプリには下記3タイプのAdMob広告を入れています。

  • バナー
  • インタースティシャル
  • リワードインタースティシャル

導入方法をまとめます

目次

AdMobで広告ユニットを作成する

アプリに導入する前にAdMobで広告ユニットを作成します。 たくさん種類がありますが、導入したいモノを1つ選択します。

任意のユニット名を記入して広告を作成すると、ユニットを配置するためのアプリIDユニットIDが表示されます。

例. (実際のIDではありません)

  • アプリID: ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy
  • ユニットID: ca-app-pub-xxxxxxxxxxxxxxxx/yyyyyyyyyy

AndroidManifest.xmlにアプリIDを設定する

AndroidManifestの<application>内に下記のように設定します。 実際の AdMob アプリ ID を使用して下さい。

<meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/>

MainActivityで初期化

MainActivityでMobileAds.initialize(this)を呼びます

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
       // ...

        MobileAds.initialize(this)
    }
}

バナー広告

2通りの方法があります。

xmlで配置する

<com.google.android.gms.ads.AdView
      xmlns:ads="http://schemas.android.com/apk/res-auto"
      android:id="@+id/adView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerHorizontal="true"
      android:layout_alignParentBottom="true"
      ads:adSize="BANNER"
      ads:adUnitId="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy">

ads:adSizeBANNERを指定します。 ads:adUnitIdにユニットIDを指定します。

コードで生成する

val adView = AdView(this).apply {
  adSize = AdSize.BANNER
  adUnitId = "ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"
}

広告を読み込む

注意点としてメインスレッドで行う必要があります。

val mAdView = requireView().findViewById(R.id.adView)
 val adRequest: AdRequest = AdRequest.Builder().build()
mAdView.loadAd(adRequest)

// Event Listener
mAdView.setAdListener(object : AdListener() {
    override fun onAdFailedToLoad(error: LoadAdError) {
        super.onAdFailedToLoad(error)
        // error 処理
    }
})

loadAdで広告を読み込みます。 広告のイベントリスナーを設定できるので読み込み完了時やエラー時に処理をさせたい時に便利です。

詳細はこちら見るといいです→ 広告イベント

インタースティシャル広告

広告を読み込む

load で広告を読み込みます。

var mInterstitialAd: InterstitialAd? = null

var adRequest = AdRequest.Builder().build()

InterstitialAd.load(context, "ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy", adRequest, object : InterstitialAdLoadCallback() {
      override fun onAdFailedToLoad(adError: LoadAdError) {
          mInterstitialAd = null
          // エラー処理
      }

      override fun onAdLoaded(interstitialAd: InterstitialAd) {
          mInterstitialAd = interstitialAd

          // ... 
      }
})

FullScreenContentCallbackを設定する

FullScreenContentCallbackを設定することで広告表示に関するコールバックを受け取れます。

mInterstitialAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
    override fun onAdDismissedFullScreenContent() {
        Log.d(TAG, "Ad was dismissed.")
    }

    override fun onAdFailedToShowFullScreenContent(adError: AdError?) {
        Log.e(TAG, "Ad failed to show.")
    }

    override fun onAdShowedFullScreenContent() {
        Log.d(TAG, "Ad showed fullscreen content.")
        mInterstitialAd = null
        // 広告表示後の処理を書く
    }
}

広告を表示する

show で広告を表示します。

if (mInterstitialAd != null) {
    mInterstitialAd?.show(requireActivity())
} else {
    Log.e(TAG, "The interstitial ad wasn't ready yet.")
}

リワードインタースティシャル広告

広告を見たユーザーに報酬を与えたい場合、リワード広告を選択します。 アプリの自然な切れ目や移行のタイミングで広告を視聴することを前提としています。 通常のリワード広告との違いは、

  • リワード広告はユーザーが広告の視聴を選択する必要があり
  • リワードインタースティシャル広告は全画面での表示になります

広告を読み込む

loadで広告を読み込みます。

var mRewardInterstitialAd: RewardedInterstitialAd? = null

val adRequest = AdRequest.Builder().build()

RewardedInterstitialAd.load(context, "ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy", adRequest, object : 
RewardedInterstitialAdLoadCallback() {
    override fun onAdFailedToLoad(p0: LoadAdError) {
        super.onAdFailedToLoad(p0)
        mRewardInterstitialAd = null
    }

    override fun onAdLoaded(p0: RewardedInterstitialAd) {
        super.onAdLoaded(p0)
        viewModel.loadingAds.postValue(false)
        mRewardInterstitialAd = p0

        // ... 
    }
})

FullScreenContentCallbackを設定する

リワードインタースティシャル広告もFullScreenContentCallbackを設定できます。 方法はFullScreenContentCallbackを設定すると同じです。

広告を表示する

showで広告を表示します。第2引数にOnUserEarnedRewardListenerを設定することができます。

class MainFragment : Fragment(), OnUserEarnedRewardListener {

     // ...
     if (mRewardInterstitialAd != null) {
            mRewardInterstitialAd?.show(requireActivity(), this)
        } else {
            Log.e(TAG, "The reward interstitial ad wasn't ready yet.")
        }
    // ...

   // 広告の報酬を受け取る
   override fun onUserEarnedReward(rewardItem: RewardItem) {
        Log.i(TAG, "Reward Earned item.amount=${rewardItem.amount}, item.type=${rewardItem.type}")
    }
}

報酬を受け取る

OnUserEarnedRewardListeneronUserEarnedRewardRewardItemを返してきます。 RewardItemには報酬の値(int)と種類(string)が含まれているので、適宜判定してユーザーに報酬を付与します。

下の例では、石5つを付与する想定でtypeにstone, 報酬の数に5が設定されているとします。

class MainFragment : Fragment(), OnUserEarnedRewardListener {
   // ...

   // 広告の報酬を受け取る
   override fun onUserEarnedReward(rewardItem: RewardItem) {
        Log.i(TAG, "Reward Earned item.amount=${rewardItem.amount}, item.type=${rewardItem.type}")
        if(rewardItem.type == "stone") {
            // ユーザーにamount分石を渡す
           user.addStone(rewardItem.amount)
        }
    }
}

テストデバイスを設定する

開発中に実際の広告が表示されてしまわないように、テストデバイスを登録しておきます。 AdMob 管理画面で 設定>テストデバイス で登録できます。

端末上で広告IDを確認して登録するだけなのでしておくといいです。

AdMobポリシーを確認する

ポリシーを確認しておかないとあとで広告の配信停止をくらうことがあります。 例えば、インタースティシャル広告の場合には、以下のような禁止事項があります。

  • アプリ起動時や終了時には表示してはいけない
  • 連続して表示してはならない
  • ユーザー操作 2 回につき 1 回以下の頻度にする

必ずガイドラインを確認しておくことを推奨します。

参考

https://developers.google.com/admob/android/quick-start?hl=ja#import_the_mobile_ads_sdk