ポップアップ広告(Popup Ad)は、特定の瞬間に画面に表示される広告フォーマットです。アプリ起動時、コンテンツロード完了時、特定イベント発生時など、希望のタイミングで表示でき、ユーザーは閉じるボタンを押すか「今日は表示しない」を選択して終了できます。
- 画面中央または下部に表示されるポップアップ形式
- 画像および動画広告サポート
- 閉じる、ディム(背景)クリック、「今日は表示しない」オプション提供
- 背景色、テキスト色などカスタマイズ可能
- 非侵入的でありながら効果的な広告体験
開発環境ではテストユニットIDを使用してください。テストユニットIDセクションを参照してください。
実装手順
ポップアップ広告は以下の4ステップで実装します:
- 初期化 - AdropPopupAdインスタンス作成
- リスナー設定 - 広告および閉じるイベント受信のためのリスナー設定
- 広告ロード - 広告リクエストおよび受信
- 広告表示 - 画面に広告を表示
基本実装
基本的な使い方
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()
}
カスタマイズオプション
| プロパティ | タイプ | 説明 | デフォルト |
|---|
backgroundColor | Int? | ポップアップ背景(ディム)色 | 黒色(透明度0.8) |
hideForTodayTextColor | Int? | 「今日は表示しない」テキスト色 | 白色 |
closeTextColor | Int? | 閉じるボタンテキスト色 | 白色 |
ctaTextColor | Int? | 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()
}
広告プロパティ
ポップアップ広告オブジェクトで以下のプロパティが使用できます:
トランザクションID(広告インプレッション追跡用)
リスナーメソッド
必須メソッド
広告受信成功時に呼び出されます。この時点でshow()を呼び出して広告を表示できます。
onAdFailedToReceive
(AdropPopupAd, AdropErrorCode) -> Unit
広告受信失敗時に呼び出されます。エラーコードで失敗原因を確認できます。
任意メソッド
広告インプレッションが記録された時に呼び出されます。
onAdWillPresentFullScreen
ポップアップ広告が表示される直前に呼び出されます。
ポップアップ広告が画面に表示された直後に呼び出されます。
onAdWillDismissFullScreen
ポップアップ広告が閉じる直前に呼び出されます。
ポップアップ広告が閉じた直後に呼び出されます。次の広告を事前ロードするのに良いタイミングです。
onAdFailedToShowFullScreen
(AdropPopupAd, AdropErrorCode) -> 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設定を確認
onAdFailedToReceiveが呼び出される
- エラーコードを確認して原因を把握
- テスト環境ではテストユニットIDを使用
- 広告インベントリ不足時は後で再試行
ERROR_CODE_AD_HIDE_FOR_TODAY:「今日は表示しない」が有効な状態
onAdReceivedコールバック後にshow()を呼び出したか確認
- Activityが有効な状態か確認
isLoadedプロパティを確認して広告がロードされたか確認
- 縦画面モードか確認(横画面モードはサポートされません)
ポップアップ広告は縦画面モードでのみサポートされます。横画面モードでshow()を呼び出すと、onAdFailedToShowFullScreenがERROR_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)
}
関連ドキュメント