インタースティシャル広告は、アプリの画面全体を覆う形式で表示される広告です。ゲームのレベル遷移やコンテンツページの切り替えなど、アプリの自然な遷移ポイントで表示するのに適しています。
- 全画面を覆う没入型広告
- ユーザーが明示的に閉じるまで表示を維持
- 画像および動画広告に対応
- 高い視覚的注目度
開発環境ではテストユニットIDを使用してください:PUBLIC_TEST_UNIT_ID_INTERSTITIAL
実装ステップ
インタースティシャル広告は以下の4ステップで実装します:
- 初期化 - AdropInterstitialAdインスタンスを作成
- リスナー設定 - 広告イベント受信のためのリスナーを設定
- 広告ロード - 広告をリクエストして受信
- 広告表示 - 画面に広告を表示
基本実装
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コンストラクタ
Android Contextオブジェクト(ActivityまたはApplication Context)
リスナー設定
広告イベントを受信するには、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メソッド
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にインターネット権限があるか確認
onAdFailedToReceiveが呼び出される
- エラーコードを確認して原因を把握
ERROR_CODE_AD_NO_FILL:広告インベントリ不足、後で再試行
ERROR_CODE_NETWORK:ネットワーク接続を確認
ERROR_CODE_INVALID_UNIT:ユニットIDを確認
onAdReceivedコールバック後にshow()を呼び出しているか確認
isLoadedプロパティがtrueか確認
- Activityが有効か確認
- 他のインタースティシャル広告が既に表示中でないか確認
onDestroy()でdestroy()メソッドを呼び出しているか確認
- Context参照がWeakReferenceで管理されているか確認
- リスナーをnullに設定しているか確認
次のステップ