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

概要

ポップアップ広告(Popup Ad)は、特定の瞬間に画面に表示される広告フォーマットです。アプリ起動時、コンテンツロード完了時、特定イベント発生時など、希望のタイミングで表示でき、ユーザーは閉じるボタンを押すか「今日は表示しない」を選択して終了できます。

特徴

  • 画面中央または下部に表示されるポップアップ形式
  • 画像および動画広告サポート
  • 閉じる、ディム(背景)クリック、「今日は表示しない」オプション提供
  • 背景色、テキスト色などカスタマイズ可能
  • 非侵入的でありながら効果的な広告体験
開発環境ではテストユニットIDを使用してください。テストユニットIDセクションを参照してください。

実装手順

ポップアップ広告は以下の4ステップで実装します:
  1. 初期化 - AdropPopupAdインスタンス作成
  2. リスナー設定 - 広告および閉じるイベント受信のためのリスナー設定
  3. 広告ロード - 広告リクエストおよび受信
  4. 広告表示 - 画面に広告を表示

基本実装

基本的な使い方

import io.adrop.ads.popupAd.AdropPopupAd
import io.adrop.ads.popupAd.AdropPopupAdListener
import io.adrop.ads.popupAd.AdropPopupAdCloseListener
import io.adrop.ads.model.AdropErrorCode

class MainActivity : AppCompatActivity() {
    private var popupAd: AdropPopupAd? = null

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

        // ポップアップ広告をロード
        loadPopupAd()
    }

    // 1. 広告の初期化とロード
    private fun loadPopupAd() {
        popupAd = AdropPopupAd(this, "YOUR_POPUP_UNIT_ID")
        popupAd?.popupAdListener = popupAdListener
        popupAd?.closeListener = popupCloseListener
        popupAd?.load()
    }

    // 2. 広告を表示
    private fun showPopupAd() {
        popupAd?.let { ad ->
            if (ad.isLoaded) {
                ad.show(this)
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        popupAd?.destroy()
    }
}

リスナーの実装

// 広告リスナーの実装
private val popupAdListener = object : AdropPopupAdListener {
    // 広告受信成功(必須)
    override fun onAdReceived(ad: AdropPopupAd) {
        Log.d("Adrop", "ポップアップ広告受信完了")
        // 広告が準備できたら表示
        showPopupAd()
    }

    // 広告受信失敗(必須)
    override fun onAdFailedToReceive(ad: AdropPopupAd, errorCode: AdropErrorCode) {
        Log.d("Adrop", "ポップアップ広告受信失敗:$errorCode")
    }

    // 広告インプレッション(任意)
    override fun onAdImpression(ad: AdropPopupAd) {
        Log.d("Adrop", "ポップアップ広告インプレッション")
    }

    // 広告クリック(任意)
    override fun onAdClicked(ad: AdropPopupAd) {
        Log.d("Adrop", "ポップアップ広告クリック")
    }

    // ポップアップ広告表示直前(任意)
    override fun onAdWillPresentFullScreen(ad: AdropPopupAd) {
        Log.d("Adrop", "ポップアップ広告表示直前")
    }

    // ポップアップ広告表示直後(任意)
    override fun onAdDidPresentFullScreen(ad: AdropPopupAd) {
        Log.d("Adrop", "ポップアップ広告表示完了")
    }

    // ポップアップ広告閉じる直前(任意)
    override fun onAdWillDismissFullScreen(ad: AdropPopupAd) {
        Log.d("Adrop", "ポップアップ広告閉じる直前")
    }

    // ポップアップ広告閉じた直後(任意)
    override fun onAdDidDismissFullScreen(ad: AdropPopupAd) {
        Log.d("Adrop", "ポップアップ広告閉じました")
        // 次の広告を事前ロード
        loadPopupAd()
    }

    // ポップアップ広告表示失敗(任意)
    override fun onAdFailedToShowFullScreen(ad: AdropPopupAd, errorCode: AdropErrorCode) {
        Log.d("Adrop", "ポップアップ広告表示失敗:$errorCode")
    }
}

// 閉じるリスナーの実装
private val popupCloseListener = object : AdropPopupAdCloseListener {
    // 閉じるボタンクリック(任意)
    override fun onClosed(ad: AdropPopupAd) {
        Log.d("Adrop", "ポップアップ広告閉じるボタンクリック")
    }

    // ディム(背景)クリック(任意)
    override fun onDimClicked(ad: AdropPopupAd) {
        Log.d("Adrop", "ポップアップ広告ディム領域クリック")
    }

    // 「今日は表示しない」クリック(任意)
    override fun onTodayOffClicked(ad: AdropPopupAd) {
        Log.d("Adrop", "今日は表示しない選択")
        // 今日の日付を保存して次の表示を制御
        val prefs = getSharedPreferences("adrop_prefs", Context.MODE_PRIVATE)
        prefs.edit().putLong("last_popup_hidden_date", System.currentTimeMillis()).apply()
    }
}

カスタマイズ

ポップアップ広告の外観をカスタマイズできます。

背景色とテキスト色の設定

private fun loadPopupAd() {
    popupAd = AdropPopupAd(this, "YOUR_POPUP_UNIT_ID")
    popupAd?.popupAdListener = popupAdListener
    popupAd?.closeListener = popupCloseListener

    // 背景色を設定(ディム領域)
    popupAd?.backgroundColor = Color.parseColor("#CC000000")

    // 「今日は表示しない」テキスト色
    popupAd?.hideForTodayTextColor = Color.WHITE

    // 閉じるボタンテキスト色
    popupAd?.closeTextColor = Color.WHITE

    // CTAボタンテキスト色
    popupAd?.ctaTextColor = Color.BLUE

    popupAd?.load()
}

カスタマイズオプション

プロパティタイプ説明デフォルト
backgroundColorInt?ポップアップ背景(ディム)色黒色(透明度0.8)
hideForTodayTextColorInt?「今日は表示しない」テキスト色白色
closeTextColorInt?閉じるボタンテキスト色白色
ctaTextColorInt?CTAボタンテキスト色システムデフォルト

カスタムクリック処理

広告クリック時にデフォルトブラウザを開く代わりにカスタム処理をするには、useCustomClickプロパティを使用します。
private fun loadPopupAd() {
    popupAd = AdropPopupAd(this, "YOUR_POPUP_UNIT_ID")

    // カスタムクリック処理を有効化
    popupAd?.useCustomClick = true

    popupAd?.popupAdListener = object : AdropPopupAdListener {
        override fun onAdReceived(ad: AdropPopupAd) {
            showPopupAd()
        }

        override fun onAdFailedToReceive(ad: AdropPopupAd, errorCode: AdropErrorCode) {
            Log.d("Adrop", "広告受信失敗:$errorCode")
        }

        override fun onAdClicked(ad: AdropPopupAd) {
            // カスタムクリック処理
            Log.d("Adrop", "広告クリック:${ad.destinationURL}")

            // カスタムURLで開く
            popupAd?.open("https://your-custom-url.com")

            // またはアプリ内ブラウザで開く
            // openInAppBrowser(ad.destinationURL)
        }
    }

    popupAd?.load()
}

広告プロパティ

ポップアップ広告オブジェクトで以下のプロパティが使用できます:
unitId
String
広告ユニットID
isLoaded
Boolean
広告がロードされたかどうか
creativeId
String
現在表示中の広告クリエイティブID
destinationURL
String
広告クリック時に移動するURL
txId
String
トランザクションID(広告インプレッション追跡用)
campaignId
String
キャンペーンID

リスナーメソッド

AdropPopupAdListener(広告イベント)

必須メソッド

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

任意メソッド

onAdImpression
(AdropPopupAd) -> Unit
広告インプレッションが記録された時に呼び出されます。
onAdClicked
(AdropPopupAd) -> Unit
ユーザーが広告をクリックした時に呼び出されます。
onAdWillPresentFullScreen
(AdropPopupAd) -> Unit
ポップアップ広告が表示される直前に呼び出されます。
onAdDidPresentFullScreen
(AdropPopupAd) -> Unit
ポップアップ広告が画面に表示された直後に呼び出されます。
onAdWillDismissFullScreen
(AdropPopupAd) -> Unit
ポップアップ広告が閉じる直前に呼び出されます。
onAdDidDismissFullScreen
(AdropPopupAd) -> Unit
ポップアップ広告が閉じた直後に呼び出されます。次の広告を事前ロードするのに良いタイミングです。
onAdFailedToShowFullScreen
(AdropPopupAd, AdropErrorCode) -> Unit
広告表示失敗時に呼び出されます。エラーコードで失敗原因を確認できます。

AdropPopupAdCloseListener(閉じるイベント)

すべてのメソッドが任意です。
onClosed
(AdropPopupAd) -> Unit
ユーザーが閉じるボタンをクリックした時に呼び出されます。
onDimClicked
(AdropPopupAd) -> Unit
ユーザーがポップアップ外部(ディム領域)をクリックした時に呼び出されます。
onTodayOffClicked
(AdropPopupAd) -> Unit
ユーザーが「今日は表示しない」を選択した時に呼び出されます。このコールバックで日付を保存して1日間広告を表示しないよう実装できます。

「今日は表示しない」の実装

ユーザーが「今日は表示しない」を選択した時に適切に処理する方法です。

SharedPreferencesを利用した実装

class PopupAdManager(private val context: Context) {
    private val prefs = context.getSharedPreferences("adrop_prefs", Context.MODE_PRIVATE)
    private val todayOffKey = "popup_ad_today_off_date"
    private var popupAd: AdropPopupAd? = null

    // 今日広告を表示できるか確認
    fun canShowAdToday(): Boolean {
        val lastHiddenDate = prefs.getLong(todayOffKey, 0L)
        if (lastHiddenDate == 0L) return true

        val calendar = Calendar.getInstance()
        calendar.timeInMillis = lastHiddenDate
        val hiddenDay = calendar.get(Calendar.DAY_OF_YEAR)
        val hiddenYear = calendar.get(Calendar.YEAR)

        calendar.timeInMillis = System.currentTimeMillis()
        val currentDay = calendar.get(Calendar.DAY_OF_YEAR)
        val currentYear = calendar.get(Calendar.YEAR)

        // 保存した日付が今日でなければ表示可能
        return hiddenDay != currentDay || hiddenYear != currentYear
    }

    // 広告のロードと表示
    fun loadAndShowAd(activity: Activity, unitId: String) {
        if (!canShowAdToday()) {
            Log.d("Adrop", "今日は広告を表示しません")
            return
        }

        popupAd?.destroy()
        popupAd = AdropPopupAd(activity, unitId)
        popupAd?.popupAdListener = popupAdListener
        popupAd?.closeListener = popupCloseListener
        popupAd?.load()
    }

    private val popupAdListener = object : AdropPopupAdListener {
        override fun onAdReceived(ad: AdropPopupAd) {
            // 広告受信後に自動表示
            if (context is Activity) {
                ad.show(context)
            }
        }

        override fun onAdFailedToReceive(ad: AdropPopupAd, errorCode: AdropErrorCode) {
            Log.d("Adrop", "広告受信失敗:$errorCode")
        }
    }

    private val popupCloseListener = object : AdropPopupAdCloseListener {
        override fun onTodayOffClicked(ad: AdropPopupAd) {
            // 今日の日付を保存
            prefs.edit().putLong(todayOffKey, System.currentTimeMillis()).apply()
            Log.d("Adrop", "今日1日ポップアップ広告を表示しません")
        }
    }

    fun destroy() {
        popupAd?.destroy()
        popupAd = null
    }
}

使用例

class MainActivity : AppCompatActivity() {
    private lateinit var popupAdManager: PopupAdManager

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

        popupAdManager = PopupAdManager(this)

        // アプリ起動時にポップアップ広告を表示
        popupAdManager.loadAndShowAd(this, "YOUR_POPUP_UNIT_ID")
    }

    override fun onDestroy() {
        super.onDestroy()
        popupAdManager.destroy()
    }
}

ポップアップタイプ

ポップアップ広告は2つのタイプで提供されます:
タイプ説明位置
POPUP_BOTTOM下部ポップアップ画面下部からスライドアップ
POPUP_CENTER中央ポップアップ画面中央に表示
ポップアップタイプはAdropコンソールで広告ユニット作成時に設定されます。コードで別途指定する必要はありません。

ベストプラクティス

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

ポップアップ広告は以下のタイミングで表示すると効果的です:
// 良い例:アプリ起動時
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    loadAndShowPopupAd()
}

// 良い例:コンテンツロード完了時
fun onContentLoaded() {
    if (shouldShowPopupAd()) {
        showPopupAd()
    }
}

// 良い例:特定イベント完了時
fun onAchievementUnlocked() {
    showPopupAd()
}

// 悪い例:ユーザーが作業中の時
fun onUserTyping() {
    showPopupAd() // ユーザー体験を阻害
}

2. 「今日は表示しない」を尊重

ユーザーが「今日は表示しない」を選択したら必ず遵守してください。
fun shouldShowPopupAd(): Boolean {
    // 今日は表示しない確認
    if (!canShowAdToday()) {
        return false
    }

    // 他の条件確認
    return true
}

3. 頻度制限

ポップアップ広告を頻繁に表示しすぎないでください。
class PopupAdFrequencyManager(private val context: Context) {
    private val prefs = context.getSharedPreferences("adrop_prefs", Context.MODE_PRIVATE)
    private val lastShownKey = "popup_ad_last_shown"
    private val minimumInterval = 3600000L // 1時間(ミリ秒)

    fun canShowAd(): Boolean {
        // 今日は表示しない確認
        if (!canShowAdToday()) {
            return false
        }

        // 最小時間間隔確認
        val lastShown = prefs.getLong(lastShownKey, 0L)
        if (lastShown == 0L) return true

        val currentTime = System.currentTimeMillis()
        return currentTime - lastShown >= minimumInterval
    }

    fun recordAdShown() {
        prefs.edit().putLong(lastShownKey, System.currentTimeMillis()).apply()
    }

    private fun canShowAdToday(): Boolean {
        // 上記の「今日は表示しない」実装を参照
        return true
    }
}

4. 広告の事前ロード

ユーザー体験のために広告を事前ロードしてください。
class MainActivity : AppCompatActivity() {
    private var popupAd: AdropPopupAd? = null
    private var isAdReady = false

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

        // 事前ロード
        preloadPopupAd()
    }

    private fun preloadPopupAd() {
        popupAd = AdropPopupAd(this, "YOUR_POPUP_UNIT_ID")
        popupAd?.popupAdListener = object : AdropPopupAdListener {
            override fun onAdReceived(ad: AdropPopupAd) {
                isAdReady = true
            }

            override fun onAdFailedToReceive(ad: AdropPopupAd, errorCode: AdropErrorCode) {
                Log.d("Adrop", "広告受信失敗:$errorCode")
            }
        }
        popupAd?.load()
    }

    fun showPopupAdIfReady() {
        if (isAdReady) {
            popupAd?.show(this)
        }
    }
}

5. 横画面モード処理

ポップアップ広告は縦画面モードでのみサポートされます。横画面モードではonAdFailedToShowFullScreenが呼び出されます。
private val popupAdListener = object : AdropPopupAdListener {
    override fun onAdReceived(ad: AdropPopupAd) {
        // 縦画面モードの時のみ表示
        if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
            ad.show(this@MainActivity)
        }
    }

    override fun onAdFailedToShowFullScreen(ad: AdropPopupAd, errorCode: AdropErrorCode) {
        if (errorCode == AdropErrorCode.ERROR_CODE_LANDSCAPE_UNSUPPORTED) {
            Log.d("Adrop", "ポップアップ広告は縦画面モードでのみサポートされます")
        }
    }

    override fun onAdFailedToReceive(ad: AdropPopupAd, errorCode: AdropErrorCode) {
        Log.d("Adrop", "広告受信失敗:$errorCode")
    }
}

テストユニットID

開発およびテスト時に以下のテストユニットIDを使用してください。
広告タイプテストユニットID
ポップアップ(下部画像)PUBLIC_TEST_UNIT_ID_POPUP_BOTTOM
ポップアップ(中央画像)PUBLIC_TEST_UNIT_ID_POPUP_CENTER
ポップアップ動画(下部16:9)PUBLIC_TEST_UNIT_ID_POPUP_BOTTOM_VIDEO_16_9
ポップアップ動画(下部9:16)PUBLIC_TEST_UNIT_ID_POPUP_BOTTOM_VIDEO_9_16
ポップアップ動画(中央16:9)PUBLIC_TEST_UNIT_ID_POPUP_CENTER_VIDEO_16_9
ポップアップ動画(中央9:16)PUBLIC_TEST_UNIT_ID_POPUP_CENTER_VIDEO_9_16

テスト広告の使用例

// テスト環境とプロダクション環境を分離
val popupUnitId = if (BuildConfig.DEBUG) {
    "PUBLIC_TEST_UNIT_ID_POPUP_BOTTOM"
} else {
    "YOUR_PRODUCTION_UNIT_ID"
}

popupAd = AdropPopupAd(this, popupUnitId)
実際のリリース時には必ずAdropコンソールで作成した実際のユニットIDを使用してください。

完全な例

import android.graphics.Color
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import io.adrop.ads.model.AdropErrorCode
import io.adrop.ads.popupAd.AdropPopupAd
import io.adrop.ads.popupAd.AdropPopupAdCloseListener
import io.adrop.ads.popupAd.AdropPopupAdListener

class PopupAdActivity : AppCompatActivity() {
    private var popupAd: AdropPopupAd? = null

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

        // ボタンクリックで広告をロードして表示
        findViewById<Button>(R.id.btn_show_popup).setOnClickListener {
            loadPopupAd()
        }
    }

    private fun loadPopupAd() {
        // 既存の広告をクリーンアップ
        popupAd?.destroy()

        // ポップアップ広告を作成
        popupAd = AdropPopupAd(this, "YOUR_POPUP_UNIT_ID")

        // カスタマイズ
        popupAd?.apply {
            backgroundColor = Color.parseColor("#CC000000")
            hideForTodayTextColor = Color.WHITE
            closeTextColor = Color.WHITE
            ctaTextColor = Color.BLUE
            useCustomClick = false
        }

        // リスナーを設定
        popupAd?.popupAdListener = object : AdropPopupAdListener {
            override fun onAdReceived(ad: AdropPopupAd) {
                Log.d("Adrop", "ポップアップ広告受信完了")
                showPopupAd()
            }

            override fun onAdFailedToReceive(ad: AdropPopupAd, errorCode: AdropErrorCode) {
                Log.d("Adrop", "ポップアップ広告受信失敗:$errorCode")
            }

            override fun onAdImpression(ad: AdropPopupAd) {
                Log.d("Adrop", "ポップアップ広告インプレッション")
                Log.d("Adrop", "txId: ${ad.txId}, campaignId: ${ad.campaignId}")
            }

            override fun onAdClicked(ad: AdropPopupAd) {
                Log.d("Adrop", "ポップアップ広告クリック:${ad.destinationURL}")
            }

            override fun onAdDidPresentFullScreen(ad: AdropPopupAd) {
                Log.d("Adrop", "ポップアップ広告表示")
            }

            override fun onAdDidDismissFullScreen(ad: AdropPopupAd) {
                Log.d("Adrop", "ポップアップ広告閉じました")
                // 次の広告を事前ロード
                loadPopupAd()
            }

            override fun onAdFailedToShowFullScreen(ad: AdropPopupAd, errorCode: AdropErrorCode) {
                Log.d("Adrop", "ポップアップ広告表示失敗:$errorCode")
            }
        }

        popupAd?.closeListener = object : AdropPopupAdCloseListener {
            override fun onClosed(ad: AdropPopupAd) {
                Log.d("Adrop", "閉じるボタンクリック")
            }

            override fun onDimClicked(ad: AdropPopupAd) {
                Log.d("Adrop", "ディム領域クリック")
            }

            override fun onTodayOffClicked(ad: AdropPopupAd) {
                Log.d("Adrop", "今日は表示しない選択")
                saveHiddenDate()
            }
        }

        // 広告をロード
        popupAd?.load()
    }

    private fun showPopupAd() {
        popupAd?.let { ad ->
            if (ad.isLoaded) {
                ad.show(this)
            }
        }
    }

    private fun saveHiddenDate() {
        val prefs = getSharedPreferences("adrop_prefs", MODE_PRIVATE)
        prefs.edit().putLong("last_popup_hidden_date", System.currentTimeMillis()).apply()
    }

    override fun onDestroy() {
        super.onDestroy()
        popupAd?.destroy()
    }
}

トラブルシューティング

広告が表示されない

  • SDKが初期化されているか確認
  • ユニットIDが正しいか確認
  • ネットワーク接続状態を確認
  • Adrop SDK初期化時のproduction設定を確認
  • エラーコードを確認して原因を把握
  • テスト環境ではテストユニットIDを使用
  • 広告インベントリ不足時は後で再試行
  • ERROR_CODE_AD_HIDE_FOR_TODAY:「今日は表示しない」が有効な状態
  • onAdReceivedコールバック後にshow()を呼び出したか確認
  • Activityが有効な状態か確認
  • isLoadedプロパティを確認して広告がロードされたか確認
  • 縦画面モードか確認(横画面モードはサポートされません)
ポップアップ広告は縦画面モードでのみサポートされます。横画面モードでshow()を呼び出すと、onAdFailedToShowFullScreenERROR_CODE_LANDSCAPE_UNSUPPORTEDエラーコードと共に呼び出されます。

「今日は表示しない」が動作しない

// 日付比較ロジックを確認
fun isToday(timestamp: Long): Boolean {
    val calendar = Calendar.getInstance()
    val today = calendar.apply {
        timeInMillis = System.currentTimeMillis()
    }

    val targetDay = Calendar.getInstance().apply {
        timeInMillis = timestamp
    }

    return today.get(Calendar.YEAR) == targetDay.get(Calendar.YEAR) &&
           today.get(Calendar.DAY_OF_YEAR) == targetDay.get(Calendar.DAY_OF_YEAR)
}

// 使用
fun canShowAdToday(): Boolean {
    val prefs = getSharedPreferences("adrop_prefs", Context.MODE_PRIVATE)
    val lastHiddenDate = prefs.getLong("last_popup_hidden_date", 0L)

    return lastHiddenDate == 0L || !isToday(lastHiddenDate)
}

関連ドキュメント