メインコンテンツへスキップ

概要

インタースティシャル広告は、アプリの画面全体を覆う形式で表示される広告です。ゲームのレベル遷移やコンテンツページの切り替えなど、アプリの自然な遷移ポイントで表示するのに適しています。

特徴

  • 全画面を覆う没入型広告
  • ユーザーが明示的に閉じるまで表示を維持
  • 画像および動画広告に対応
  • 高い視覚的注目度
開発環境ではテストユニットIDを使用してください:PUBLIC_TEST_UNIT_ID_INTERSTITIAL

実装ステップ

インタースティシャル広告は以下の4ステップで実装します:
  1. 初期化 - AdropInterstitialAdインスタンスを作成
  2. リスナー設定 - 広告イベント受信のためのリスナーを設定
  3. 広告ロード - 広告をリクエストして受信
  4. 広告表示 - 画面に広告を表示

基本実装

AdropInterstitialAdインスタンスの作成

import io.adrop.ads.interstitial.AdropInterstitialAd

class MainActivity : AppCompatActivity() {
    private var interstitialAd: AdropInterstitialAd? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 1. インタースティシャル広告インスタンスを作成
        interstitialAd = AdropInterstitialAd(this, "YOUR_UNIT_ID")
    }
}

AdropInterstitialAdコンストラクタ

context
Context
required
Android Contextオブジェクト(ActivityまたはApplication Context)
unitId
String
required
広告ユニットID(コンソールで発行)

リスナー設定

広告イベントを受信するには、AdropInterstitialAdListenerを実装して設定する必要があります。
import io.adrop.ads.interstitial.AdropInterstitialAdListener
import io.adrop.ads.model.AdropErrorCode

class MainActivity : AppCompatActivity() {
    private var interstitialAd: AdropInterstitialAd? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 1. インタースティシャル広告インスタンスを作成
        interstitialAd = AdropInterstitialAd(this, "YOUR_UNIT_ID")

        // 2. リスナー設定
        interstitialAd?.interstitialAdListener = object : AdropInterstitialAdListener {
            override fun onAdReceived(ad: AdropInterstitialAd) {
                Log.d("Adrop", "インタースティシャル広告受信完了")
            }

            override fun onAdFailedToReceive(ad: AdropInterstitialAd, errorCode: AdropErrorCode) {
                Log.e("Adrop", "インタースティシャル広告受信失敗: $errorCode")
            }

            override fun onAdImpression(ad: AdropInterstitialAd) {
                Log.d("Adrop", "インタースティシャル広告インプレッション")
            }

            override fun onAdClicked(ad: AdropInterstitialAd) {
                Log.d("Adrop", "インタースティシャル広告クリック")
            }

            override fun onAdWillPresentFullScreen(ad: AdropInterstitialAd) {
                Log.d("Adrop", "インタースティシャル広告表示直前")
            }

            override fun onAdDidPresentFullScreen(ad: AdropInterstitialAd) {
                Log.d("Adrop", "インタースティシャル広告表示完了")
            }

            override fun onAdWillDismissFullScreen(ad: AdropInterstitialAd) {
                Log.d("Adrop", "インタースティシャル広告終了直前")
            }

            override fun onAdDidDismissFullScreen(ad: AdropInterstitialAd) {
                Log.d("Adrop", "インタースティシャル広告終了")
                // 次の広告を事前ロード
                loadInterstitialAd()
            }

            override fun onAdFailedToShowFullScreen(ad: AdropInterstitialAd, errorCode: AdropErrorCode) {
                Log.e("Adrop", "インタースティシャル広告表示失敗: $errorCode")
            }
        }

        // 3. 広告ロード
        loadInterstitialAd()
    }

    private fun loadInterstitialAd() {
        interstitialAd?.load()
    }
}

広告のロード

load()メソッドを呼び出して広告をリクエストします。
private fun loadInterstitialAd() {
    interstitialAd?.load()
}
広告ロード完了時にonAdReceivedコールバックが呼び出され、失敗時にはonAdFailedToReceiveコールバックが呼び出されます。

広告の表示

広告がロードされた後、show()メソッドを呼び出して広告を表示します。

isLoadedプロパティ

広告がロードされているかどうかを確認するプロパティです。show()を呼び出す前にこの値を確認することをお勧めします。
private fun showInterstitialAd() {
    if (interstitialAd?.isLoaded == true) {
        interstitialAd?.show(this)
    } else {
        Log.d("Adrop", "広告がまだロードされていません")
    }
}

showメソッド

activity
Activity
required
広告を表示するActivityオブジェクト

AdropInterstitialAdプロパティ

unitId

広告ユニットIDを返します。
val unitId: String = interstitialAd?.unitId ?: ""

isLoaded

広告がロードされているかどうかを返します。
val isLoaded: Boolean = interstitialAd?.isLoaded ?: false

creativeId

現在ロードされている広告のクリエイティブIDを返します。
val creativeId: String = interstitialAd?.creativeId ?: ""

txId

現在ロードされている広告のトランザクションIDを返します。
val txId: String = interstitialAd?.txId ?: ""

campaignId

現在ロードされている広告のキャンペーンIDを返します。
val campaignId: String = interstitialAd?.campaignId ?: ""

isBackfilled

現在ロードされている広告がバックフィル広告かどうかを返します。
val isBackfilled: Boolean = interstitialAd?.isBackfilled ?: false

AdropInterstitialAdListenerメソッド

必須メソッド

onAdReceived
(AdropInterstitialAd) -> Unit
広告受信成功時に呼び出されます。この時点でshow()を呼び出して広告を表示できます。
onAdFailedToReceive
(AdropInterstitialAd, AdropErrorCode) -> Unit
広告受信失敗時に呼び出されます。エラーコードで失敗原因を確認できます。

オプションメソッド

onAdImpression
(AdropInterstitialAd) -> Unit
広告インプレッションが記録された時に呼び出されます。
onAdClicked
(AdropInterstitialAd) -> Unit
ユーザーが広告をクリックした時に呼び出されます。
onAdWillPresentFullScreen
(AdropInterstitialAd) -> Unit
インタースティシャル広告が表示される直前に呼び出されます。ゲームの一時停止などの処理ができます。
onAdDidPresentFullScreen
(AdropInterstitialAd) -> Unit
インタースティシャル広告が画面に表示された直後に呼び出されます。
onAdWillDismissFullScreen
(AdropInterstitialAd) -> Unit
インタースティシャル広告が閉じる直前に呼び出されます。
onAdDidDismissFullScreen
(AdropInterstitialAd) -> Unit
インタースティシャル広告が閉じた直後に呼び出されます。次の広告を事前ロードするのに適したタイミングです。
onAdFailedToShowFullScreen
(AdropInterstitialAd, AdropErrorCode) -> Unit
広告表示失敗時に呼び出されます。エラーコードで失敗原因を確認できます。

ライフサイクル管理

destroyメソッド

ActivityやFragmentが終了する時は、destroy()メソッドを呼び出してリソースを解放する必要があります。
override fun onDestroy() {
    super.onDestroy()
    interstitialAd?.destroy()
    interstitialAd = null
}
メモリリークを防ぐため、必ずdestroy()を呼び出してください。

事前ロード戦略

ユーザー体験を向上させるため、広告を事前にロードすることをお勧めします。

基本的な事前ロード

class GameActivity : AppCompatActivity() {
    private var interstitialAd: AdropInterstitialAd? = null
    private var isAdReady = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_game)

        // 画面進入時に事前ロード
        preloadInterstitialAd()
    }

    private fun preloadInterstitialAd() {
        interstitialAd = AdropInterstitialAd(this, "YOUR_UNIT_ID")
        interstitialAd?.interstitialAdListener = object : AdropInterstitialAdListener {
            override fun onAdReceived(ad: AdropInterstitialAd) {
                isAdReady = true
                Log.d("Adrop", "インタースティシャル広告準備完了")
            }

            override fun onAdFailedToReceive(ad: AdropInterstitialAd, errorCode: AdropErrorCode) {
                isAdReady = false
                Log.e("Adrop", "インタースティシャル広告ロード失敗: $errorCode")
            }

            override fun onAdDidDismissFullScreen(ad: AdropInterstitialAd) {
                isAdReady = false
                // 次の広告を事前ロード
                preloadInterstitialAd()
            }
        }
        interstitialAd?.load()
    }

    private fun onGameLevelComplete() {
        // レベル完了時に即座に表示
        if (isAdReady) {
            interstitialAd?.show(this)
        }
    }
}

終了後の再ロード

広告が閉じた後、onAdDidDismissFullScreenコールバックで次の広告を事前にロードします。
override fun onAdDidDismissFullScreen(ad: AdropInterstitialAd) {
    Log.d("Adrop", "インタースティシャル広告終了")
    // 即座に次の広告をロード
    interstitialAd?.load()
}

ベストプラクティス

1. 適切な表示タイミング

アプリの自然な遷移ポイントで広告を表示してください。
// 良い例:ゲームレベル遷移
fun onLevelComplete() {
    saveProgress()
    showInterstitialAd()
    loadNextLevel()
}

// 良い例:コンテンツ読了完了
fun onArticleFinished() {
    showInterstitialAd()
}

// 悪い例:ユーザーアクション中
fun onButtonClick() {
    showInterstitialAd() // ユーザー体験を阻害
    performAction()
}

2. エラー処理

広告ロード失敗に対する処理を実装してください。
override fun onAdFailedToReceive(ad: AdropInterstitialAd, errorCode: AdropErrorCode) {
    when (errorCode) {
        AdropErrorCode.ERROR_CODE_NETWORK -> {
            Log.e("Adrop", "ネットワークエラー:後でリトライ")
            retryAfterDelay()
        }
        AdropErrorCode.ERROR_CODE_AD_NO_FILL -> {
            Log.w("Adrop", "表示可能な広告なし")
            continueWithoutAd()
        }
        else -> {
            Log.e("Adrop", "広告ロード失敗: $errorCode")
        }
    }
}

private fun retryAfterDelay() {
    Handler(Looper.getMainLooper()).postDelayed({
        interstitialAd?.load()
    }, 30000) // 30秒後にリトライ
}

private fun continueWithoutAd() {
    // 広告なしで続行
    proceedToNextScreen()
}

3. 頻度制限

広告を頻繁に表示しないようにしてください。
class AdFrequencyManager {
    private var lastAdShownTime: Long = 0
    private val minimumInterval = 180_000L // 3分

    fun canShowAd(): Boolean {
        val currentTime = System.currentTimeMillis()
        return currentTime - lastAdShownTime >= minimumInterval
    }

    fun recordAdShown() {
        lastAdShownTime = System.currentTimeMillis()
    }
}

// 使用例
class MainActivity : AppCompatActivity() {
    private val frequencyManager = AdFrequencyManager()

    private fun showInterstitialIfAllowed() {
        if (!frequencyManager.canShowAd()) {
            Log.d("Adrop", "広告表示間隔が短すぎます")
            return
        }

        interstitialAd?.show(this)
    }

    // リスナーで呼び出し
    override fun onAdDidPresentFullScreen(ad: AdropInterstitialAd) {
        frequencyManager.recordAdShown()
    }
}

4. ゲーム一時停止処理

インタースティシャル広告表示時にゲームやアニメーションを一時停止してください。
override fun onAdWillPresentFullScreen(ad: AdropInterstitialAd) {
    // ゲーム一時停止
    pauseGame()
    // BGM停止
    pauseBackgroundMusic()
}

override fun onAdDidDismissFullScreen(ad: AdropInterstitialAd) {
    // ゲーム再開
    resumeGame()
    // BGM再生
    resumeBackgroundMusic()
}

テスト

テストユニットIDの使用

開発中はテストユニットIDを使用してください。
import io.adrop.ads.AdropAds

class MainActivity : AppCompatActivity() {
    private val unitId = if (BuildConfig.DEBUG) {
        "PUBLIC_TEST_UNIT_ID_INTERSTITIAL"
    } else {
        "YOUR_PRODUCTION_UNIT_ID"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        interstitialAd = AdropInterstitialAd(this, unitId)
    }
}

広告ロードの確認

広告が正常にロードされているか確認してください。
override fun onAdReceived(ad: AdropInterstitialAd) {
    Log.d("Adrop", "インタースティシャル広告ロード成功")
    Log.d("Adrop", "Unit ID: ${ad.unitId}")
    Log.d("Adrop", "Creative ID: ${ad.creativeId}")
    Log.d("Adrop", "Is Backfilled: ${ad.isBackfilled}")
}

override fun onAdFailedToReceive(ad: AdropInterstitialAd, errorCode: AdropErrorCode) {
    Log.e("Adrop", "インタースティシャル広告ロード失敗: $errorCode")
    if (BuildConfig.DEBUG) {
        Toast.makeText(this, "広告ロード失敗: $errorCode", Toast.LENGTH_SHORT).show()
    }
}

完全な実装例

import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import io.adrop.ads.interstitial.AdropInterstitialAd
import io.adrop.ads.interstitial.AdropInterstitialAdListener
import io.adrop.ads.model.AdropErrorCode

class InterstitialAdActivity : AppCompatActivity() {
    private var interstitialAd: AdropInterstitialAd? = null
    private lateinit var loadButton: Button
    private lateinit var showButton: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_interstitial_ad)

        loadButton = findViewById(R.id.btn_load_ad)
        showButton = findViewById(R.id.btn_show_ad)

        // ボタンの初期状態を設定
        showButton.isEnabled = false

        // インタースティシャル広告を初期化
        setupInterstitialAd()

        // ボタンクリックリスナー
        loadButton.setOnClickListener {
            loadInterstitialAd()
        }

        showButton.setOnClickListener {
            showInterstitialAd()
        }

        // 最初の広告を自動ロード
        loadInterstitialAd()
    }

    private fun setupInterstitialAd() {
        val unitId = if (BuildConfig.DEBUG) {
            "PUBLIC_TEST_UNIT_ID_INTERSTITIAL"
        } else {
            "YOUR_PRODUCTION_UNIT_ID"
        }

        interstitialAd = AdropInterstitialAd(this, unitId)
        interstitialAd?.interstitialAdListener = object : AdropInterstitialAdListener {
            override fun onAdReceived(ad: AdropInterstitialAd) {
                Log.d(TAG, "インタースティシャル広告受信完了")
                showButton.isEnabled = true
                loadButton.isEnabled = false
                Toast.makeText(
                    this@InterstitialAdActivity,
                    "広告の準備ができました",
                    Toast.LENGTH_SHORT
                ).show()
            }

            override fun onAdFailedToReceive(ad: AdropInterstitialAd, errorCode: AdropErrorCode) {
                Log.e(TAG, "インタースティシャル広告受信失敗: $errorCode")
                showButton.isEnabled = false
                loadButton.isEnabled = true
                Toast.makeText(
                    this@InterstitialAdActivity,
                    "広告ロード失敗: $errorCode",
                    Toast.LENGTH_SHORT
                ).show()
            }

            override fun onAdImpression(ad: AdropInterstitialAd) {
                Log.d(TAG, "インタースティシャル広告インプレッション")
            }

            override fun onAdClicked(ad: AdropInterstitialAd) {
                Log.d(TAG, "インタースティシャル広告クリック")
            }

            override fun onAdWillPresentFullScreen(ad: AdropInterstitialAd) {
                Log.d(TAG, "インタースティシャル広告表示直前")
            }

            override fun onAdDidPresentFullScreen(ad: AdropInterstitialAd) {
                Log.d(TAG, "インタースティシャル広告表示完了")
            }

            override fun onAdWillDismissFullScreen(ad: AdropInterstitialAd) {
                Log.d(TAG, "インタースティシャル広告終了直前")
            }

            override fun onAdDidDismissFullScreen(ad: AdropInterstitialAd) {
                Log.d(TAG, "インタースティシャル広告終了")
                showButton.isEnabled = false
                loadButton.isEnabled = true
                Toast.makeText(
                    this@InterstitialAdActivity,
                    "広告が閉じられました",
                    Toast.LENGTH_SHORT
                ).show()

                // 次の広告を事前ロード
                loadInterstitialAd()
            }

            override fun onAdFailedToShowFullScreen(ad: AdropInterstitialAd, errorCode: AdropErrorCode) {
                Log.e(TAG, "インタースティシャル広告表示失敗: $errorCode")
                showButton.isEnabled = false
                loadButton.isEnabled = true
                Toast.makeText(
                    this@InterstitialAdActivity,
                    "広告表示失敗: $errorCode",
                    Toast.LENGTH_SHORT
                ).show()
            }
        }
    }

    private fun loadInterstitialAd() {
        Log.d(TAG, "インタースティシャル広告ロード開始")
        loadButton.isEnabled = false
        interstitialAd?.load()
    }

    private fun showInterstitialAd() {
        if (interstitialAd?.isLoaded == true) {
            Log.d(TAG, "インタースティシャル広告表示")
            interstitialAd?.show(this)
        } else {
            Log.w(TAG, "広告がまだロードされていません")
            Toast.makeText(this, "広告の準備ができていません", Toast.LENGTH_SHORT).show()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        interstitialAd?.destroy()
        interstitialAd = null
    }

    companion object {
        private const val TAG = "InterstitialAdActivity"
    }
}

トラブルシューティング

  • SDKが初期化されているか確認
  • ユニットIDが正しいか確認
  • ネットワーク接続状態を確認
  • AndroidManifest.xmlにインターネット権限があるか確認
  • エラーコードを確認して原因を把握
  • ERROR_CODE_AD_NO_FILL:広告インベントリ不足、後で再試行
  • ERROR_CODE_NETWORK:ネットワーク接続を確認
  • ERROR_CODE_INVALID_UNIT:ユニットIDを確認
  • onAdReceivedコールバック後にshow()を呼び出しているか確認
  • isLoadedプロパティがtrueか確認
  • Activityが有効か確認
  • 他のインタースティシャル広告が既に表示中でないか確認
  • onDestroy()destroy()メソッドを呼び出しているか確認
  • Context参照がWeakReferenceで管理されているか確認
  • リスナーをnullに設定しているか確認

次のステップ