โฆษณาคั่นระหว่างหน้าเป็นโฆษณาแบบเต็มหน้าจอที่ครอบคลุมอินเทอร์เฟซของแอปโฮสต์
โดยมักจะแสดงที่จุดเปลี่ยนหน้าปกติในขั้นตอนของแอป
เช่น ระหว่างกิจกรรมหรือระหว่างการหยุดชั่วคราวระหว่างการเปลี่ยนด่านในเกม
เมื่อแอปแสดงโฆษณาคั่นระหว่างหน้า ผู้ใช้เลือกได้ว่าจะแตะ
โฆษณาและดำเนินการต่อไปยังปลายทาง หรือปิดโฆษณาแล้วกลับไปที่แอป
อ่านกรณีศึกษา ของเรา
คู่มือนี้จะอธิบายวิธีผสานรวมโฆษณาคั่นระหว่างหน้าเข้ากับ Android
แอป
ข้อกำหนดเบื้องต้น
SDK โฆษณาในอุปกรณ์เคลื่อนที่ของ Google เวอร์ชัน 19.7.0 ขึ้นไป
ทำตามคู่มือเริ่มต้นใช้งาน ให้เสร็จสมบูรณ์
ทดสอบด้วยโฆษณาทดสอบเสมอ
เมื่อสร้างและทดสอบแอป โปรดตรวจสอบว่าคุณใช้โฆษณาทดสอบแทน
โฆษณาเวอร์ชันที่ใช้งานจริง หากไม่ดำเนินการ บัญชีจะถูกระงับ
วิธีที่ง่ายที่สุดในการโหลดโฆษณาทดสอบคือการใช้รหัสหน่วยโฆษณาทดสอบโดยเฉพาะของเรา
โฆษณาคั่นระหว่างหน้า Android
ca-app-pub-3940256099942544/1033173712
โดยได้รับการกำหนดค่าเป็นพิเศษให้ส่งคืนโฆษณาทดสอบสำหรับทุกคำขอ โดยคุณจะ
นำไปใช้ในแอปของคุณเองขณะเขียนโค้ด ทดสอบ และแก้ไขข้อบกพร่องได้ฟรี ทำ
อย่าลืมแทนที่ด้วยรหัสหน่วยโฆษณาของคุณเองก่อนที่จะเผยแพร่แอป
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของโฆษณาทดสอบของ SDK โฆษณาบนอุปกรณ์เคลื่อนที่ โปรดดู
Test Ads
โหลดโฆษณา
หมายเหตุ: เรียกใช้ Mobile Ads SDK ทั้งหมดในชุดข้อความหลัก
หากต้องการโหลดโฆษณาคั่นระหว่างหน้า ให้เรียกใช้ InterstitialAd
คงที่
load()
และส่ง
InterstitialAdLoadCallback
เพื่อรับการโหลด
หรือข้อผิดพลาดใดๆ ที่อาจเกิดขึ้น โปรดสังเกตว่าเหมือนกับการโหลด Callback รูปแบบอื่นๆ
ใช้ประโยชน์จาก InterstitialAdLoadCallback
LoadAdError
เพื่อให้รายละเอียดข้อผิดพลาดเกี่ยวกับความแม่นยำที่สูงขึ้น
Java
import com.google.android.gms.ads.interstitial.InterstitialAd ;
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback ;
public class MainActivity extends Activity {
private InterstitialAd mInterstitialAd ;
private static final String TAG = "MainActivity ";
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_main );
AdRequest adRequest = new AdRequest . Builder (). build ();
InterstitialAd . load ( this , "ca - app - pub - 3940256099942544 / 1033173712 ", adRequest ,
new InterstitialAdLoadCallback () {
@Override
public void onAdLoaded ( @NonNull InterstitialAd interstitialAd ) {
// The mInterstitialAd reference will be null until
// an ad is loaded.
mInterstitialAd = interstitialAd ;
Log . i ( TAG , "onAdLoaded ");
}
@Override
public void onAdFailedToLoad ( @NonNull LoadAdError loadAdError ) {
// Handle the error
Log . d ( TAG , loadAdError . toString ());
mInterstitialAd = null ;
}
});
}
}
Kotlin
import com.google.android.gms.ads.interstitial.InterstitialAd;
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback;
class MainActivity : AppCompatActivity () {
private var mInterstitialAd : InterstitialAd? = null
private final val TAG = "MainActivity "
override fun onCreate ( savedInstanceState : Bundle?) {
super . onCreate ( savedInstanceState )
setContentView ( R . layout . activity_main )
val adRequest = AdRequest . Builder (). build ()
InterstitialAd . load ( this , "ca - app - pub - 3940256099942544 / 1033173712 ", adRequest , object : InterstitialAdLoadCallback () {
override fun onAdFailedToLoad ( adError : LoadAdError ) {
Log . d ( TAG , adError ?. toString ())
mInterstitialAd = null
}
override fun onAdLoaded ( interstitialAd : InterstitialAd ) {
Log . d ( TAG , 'Ad was loaded .')
mInterstitialAd = interstitialAd
}
})
}
}
เคล็ดลับ:
คุณสามารถใช้การเรียกจำนวนโฆษณาเพื่อสร้างแคชของโฆษณาที่โหลดล่วงหน้าก่อนที่จะ
ที่ตั้งใจจะแสดงโฆษณาเหล่านั้น เพื่อที่คุณจะสามารถแสดงโฆษณาโดยที่ไม่ต้องการตอบสนองใดๆ เมื่อจําเป็น
เนื่องจากโฆษณาจะหมดอายุใน 1 ชั่วโมง คุณควรล้างแคชและโหลดซ้ำ
โฆษณาในทุกๆ ชั่วโมง
ตั้งค่า FullScreenContentCallback
FullScreenContentCallback
จะจัดการกิจกรรมที่เกี่ยวข้องกับการแสดง
InterstitialAd
ก่อนแสดง InterstitialAd
โปรดตรวจสอบว่าได้ตั้งค่า
ติดต่อกลับ:
Java
mInterstitialAd . setFullScreenContentCallback ( new FullScreenContentCallback (){
@Override
public void onAdClicked () {
// Called when a click is recorded for an ad.
Log . d ( TAG , "Ad was clicked .");
}
@Override
public void onAdDismissedFullScreenContent () {
// Called when ad is dismissed.
// Set the ad reference to null so you don't show the ad a second time.
Log . d ( TAG , "Ad dismissed fullscreen content .");
mInterstitialAd = null ;
}
@Override
public void onAdFailedToShowFullScreenContent ( AdError adError ) {
// Called when ad fails to show.
Log . e ( TAG , "Ad failed to show fullscreen content .");
mInterstitialAd = null ;
}
@Override
public void onAdImpression () {
// Called when an impression is recorded for an ad.
Log . d ( TAG , "Ad recorded an impression .");
}
@Override
public void onAdShowedFullScreenContent () {
// Called when ad is shown.
Log . d ( TAG , "Ad showed fullscreen content .");
}
});
Kotlin
mInterstitialAd ?. fullScreenContentCallback = object : FullScreenContentCallback () {
override fun onAdClicked () {
// Called when a click is recorded for an ad.
Log . d ( TAG , "Ad was clicked .")
}
override fun onAdDismissedFullScreenContent () {
// Called when ad is dismissed.
Log . d ( TAG , "Ad dismissed fullscreen content .")
mInterstitialAd = null
}
override fun onAdFailedToShowFullScreenContent ( adError : AdError?) {
// Called when ad fails to show.
Log . e ( TAG , "Ad failed to show fullscreen content .")
mInterstitialAd = null
}
override fun onAdImpression () {
// Called when an impression is recorded for an ad.
Log . d ( TAG , "Ad recorded an impression .")
}
override fun onAdShowedFullScreenContent () {
// Called when ad is shown.
Log . d ( TAG , "Ad showed fullscreen content .")
}
}
แสดงโฆษณา
โฆษณาคั่นระหว่างหน้าควรแสดงขึ้นในช่วงที่แอปหยุดชั่วคราวตามปกติ
ตัวอย่างที่ดีระหว่างการเปลี่ยนด่านเกม หรือหลังจากที่ผู้ใช้ทำงานเสร็จ
หากต้องการแสดงโฆษณาคั่นระหว่างหน้า ให้ใช้
show()
Java
if ( mInterstitialAd != null ) {
mInterstitialAd . show ( MyActivity . this );
} else {
Log . d ( "TAG ", "The interstitial ad wasn't ready yet .");
}
Kotlin
if ( mInterstitialAd != null ) {
mInterstitialAd ?. show ( this )
} else {
Log . d ( "TAG ", "The interstitial ad wasn't ready yet .")
}
แนวทางปฏิบัติแนะนำบางส่วน
พิจารณาว่าโฆษณาคั่นระหว่างหน้าเป็นประเภทโฆษณาที่เหมาะสมสำหรับแอปของคุณหรือไม่
โฆษณาคั่นระหว่างหน้าทำงานได้ดีที่สุดในแอปที่มีจุดเปลี่ยนที่เป็นธรรมชาติ
บทสรุปของงานภายในแอป เช่น การแชร์รูปภาพหรือการเสร็จสิ้น
ในระดับเกม จะทำให้เกิดคะแนนดังกล่าว อย่าลืมพิจารณาว่า
เพื่อแสดงโฆษณาคั่นระหว่างหน้าและแนวโน้มที่ผู้ใช้จะแสดง
ตอบกลับ
อย่าลืมหยุดการดำเนินการไว้ชั่วคราวเมื่อแสดงโฆษณาคั่นระหว่างหน้า
โฆษณาคั่นระหว่างหน้ามีหลายประเภท ได้แก่ แบบข้อความ รูปภาพ
วิดีโอ และอื่นๆ คุณต้องตรวจสอบว่าเมื่อแอปแสดง
โฆษณาคั่นระหว่างหน้าได้ ก็ยังระงับการใช้ทรัพยากรบางอย่างเพื่ออนุญาตให้โฆษณา
ใช้ประโยชน์จากส่วนนี้ ตัวอย่างเช่น เมื่อคุณโทรออกเพื่อแสดง
อย่าลืมหยุดเอาต์พุตเสียงที่แอปสร้างไว้ชั่วคราวในโฆษณาคั่นระหว่างหน้า
เผื่อเวลาโหลดให้เพียงพอ
คุณควรตรวจสอบว่าได้แสดงโฆษณาคั่นระหว่างหน้าที่
ในเวลาที่เหมาะสม คุณยังควรตรวจสอบว่าผู้ใช้ไม่ต้อง
เพื่อรอให้ส่วนขยายโหลดขึ้นมา โหลดโฆษณาล่วงหน้าโดยการโทร
load()
ก่อนที่คุณจะโทร
show()
จะดูแลให้แอปแสดงโฆษณาคั่นระหว่างหน้าที่โหลดอย่างสมบูรณ์ได้
ให้พร้อมเมื่อถึงเวลาแสดง 1 รายการ
อย่าแสดงโฆษณาต่อผู้ใช้จำนวนมาก
แม้ว่าการเพิ่มความถี่ของโฆษณาคั่นระหว่างหน้าในแอปอาจดูเหมือน
เป็นวิธีที่ยอดเยี่ยมในการเพิ่มรายได้
ยังทำให้ประสบการณ์ของผู้ใช้แย่ลง
และอัตราการคลิกผ่านลดลง ตรวจสอบว่าผู้ใช้ไม่ได้เข้าร่วมบ่อย
ว่าจะไม่สามารถใช้ประโยชน์จากแอปของคุณได้อีก
ซอร์สโค้ด
MyActivity.java
/*
* Copyright ( C ) 2013 Google , Inc .
*
* Licensed under the Apache License , Version 2.0 ( the "License ");
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : // www . apache . org / licenses / LICENSE - 2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an "AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
package com . google . android . gms . example . interstitialexample ;
import android.annotation.SuppressLint ;
import android.os.Bundle ;
import android.os.CountDownTimer ;
import android.util.Log ;
import android.view.Menu ;
import android.view.MenuItem ;
import android.view.View ;
import android.widget.Button ;
import android.widget.PopupMenu ;
import android.widget.TextView ;
import android.widget.Toast ;
import androidx.annotation.NonNull ;
import androidx.appcompat.app.AppCompatActivity ;
import com.google.android.gms.ads.AdError ;
import com.google.android.gms.ads.AdRequest ;
import com.google.android.gms.ads.FullScreenContentCallback ;
import com.google.android.gms.ads.LoadAdError ;
import com.google.android.gms.ads.MobileAds ;
import com.google.android.gms.ads.RequestConfiguration ;
import com.google.android.gms.ads.interstitial.InterstitialAd ;
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback ;
import java.util.Arrays ;
import java.util.concurrent.atomic.AtomicBoolean ;
/** Main Activity . Inflates main activity xml . */
@SuppressLint ( "SetTextI18n ")
public class MyActivity extends AppCompatActivity {
// Check your logcat output for the test device hashed ID e . g .
// "Use RequestConfiguration . Builder () . setTestDeviceIds ( Arrays . asList ( "ABCDEF012345 "))
// to get test ads on this device " or
// "Use new ConsentDebugSettings . Builder () . addTestDeviceHashedId ( "ABCDEF012345 ") to set this as
// a debug device ".
public static final String TEST_DEVICE_HASHED_ID = "ABCDEF012345 ";
private static final long GAME_LENGTH_MILLISECONDS = 3000 ;
private static final String AD_UNIT_ID = "ca - app - pub - 3940256099942544 / 1033173712 ";
private static final String TAG = "MyActivity ";
private final AtomicBoolean isMobileAdsInitializeCalled = new AtomicBoolean ( false );
private GoogleMobileAdsConsentManager googleMobileAdsConsentManager ;
private InterstitialAd interstitialAd ;
private CountDownTimer countDownTimer ;
private Button retryButton ;
private boolean gamePaused ;
private boolean gameOver ;
private boolean adIsLoading ;
private long timerMilliseconds ;
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R . layout . activity_my );
// Log the Mobile Ads SDK version .
Log . d ( TAG , "Google Mobile Ads SDK Version : " + MobileAds . getVersion ());
googleMobileAdsConsentManager =
GoogleMobileAdsConsentManager . getInstance ( getApplicationContext ());
googleMobileAdsConsentManager . gatherConsent (
this ,
consentError - > {
if ( consentError != null ) {
// Consent not obtained in current session .
Log . w (
TAG ,
String . format ( "% s : % s ", consentError . getErrorCode (), consentError . getMessage ()));
}
startGame ();
if ( googleMobileAdsConsentManager . canRequestAds ()) {
initializeMobileAdsSdk ();
}
if ( googleMobileAdsConsentManager . isPrivacyOptionsRequired ()) {
// Regenerate the options menu to include a privacy setting .
invalidateOptionsMenu ();
}
});
// This sample attempts to load ads using consent obtained in the previous session .
if ( googleMobileAdsConsentManager . canRequestAds ()) {
initializeMobileAdsSdk ();
}
// Create the "retry " button , which tries to show an interstitial between game plays .
retryButton = findViewById ( R . id . retry_button );
retryButton . setVisibility ( View . INVISIBLE );
retryButton . setOnClickListener (
new View . OnClickListener () {
@Override
public void onClick ( View view ) {
showInterstitial ();
}
});
}
public void loadAd () {
// Request a new ad if one isn't already loaded .
if ( adIsLoading || interstitialAd != null ) {
return ;
}
adIsLoading = true ;
AdRequest adRequest = new AdRequest . Builder () . build ();
InterstitialAd . load (
this ,
AD_UNIT_ID ,
adRequest ,
new InterstitialAdLoadCallback () {
@Override
public void onAdLoaded ( @NonNull InterstitialAd interstitialAd ) {
// The mInterstitialAd reference will be null until
// an ad is loaded .
MyActivity . this . interstitialAd = interstitialAd ;
adIsLoading = false ;
Log . i ( TAG , "onAdLoaded ");
Toast . makeText ( MyActivity . this , "onAdLoaded ()", Toast . LENGTH_SHORT ) . show ();
interstitialAd . setFullScreenContentCallback (
new FullScreenContentCallback () {
@Override
public void onAdDismissedFullScreenContent () {
// Called when fullscreen content is dismissed .
// Make sure to set your reference to null so you don't
// show it a second time .
MyActivity . this . interstitialAd = null ;
Log . d ( "TAG ", "The ad was dismissed . ");
}
@Override
public void onAdFailedToShowFullScreenContent ( AdError adError ) {
// Called when fullscreen content failed to show .
// Make sure to set your reference to null so you don't
// show it a second time .
MyActivity . this . interstitialAd = null ;
Log . d ( "TAG ", "The ad failed to show . ");
}
@Override
public void onAdShowedFullScreenContent () {
// Called when fullscreen content is shown .
Log . d ( "TAG ", "The ad was shown . ");
}
});
}
@Override
public void onAdFailedToLoad ( @NonNull LoadAdError loadAdError ) {
// Handle the error
Log . i ( TAG , loadAdError . getMessage ());
interstitialAd = null ;
adIsLoading = false ;
String error =
String . format (
java . util . Locale . US ,
"domain : % s , code : % d , message : % s ",
loadAdError . getDomain (),
loadAdError . getCode (),
loadAdError . getMessage ());
Toast . makeText (
MyActivity . this , "onAdFailedToLoad () with error : " + error , Toast . LENGTH_SHORT )
. show ();
}
});
}
private void createTimer ( final long milliseconds ) {
// Create the game timer , which counts down to the end of the level
// and shows the "retry " button .
if ( countDownTimer != null ) {
countDownTimer . cancel ();
}
final TextView textView = findViewById ( R . id . timer );
countDownTimer =
new CountDownTimer ( milliseconds , 50 ) {
@Override
public void onTick ( long millisUnitFinished ) {
timerMilliseconds = millisUnitFinished ;
textView . setText ( "seconds remaining : " + (( millisUnitFinished / 1000 ) + 1 ));
}
@Override
public void onFinish () {
gameOver = true ;
textView . setText ( "done ! ");
retryButton . setVisibility ( View . VISIBLE );
}
};
countDownTimer . start ();
}
@Override
public void onResume () {
// Start or resume the game .
super . onResume ();
resumeGame ();
}
@Override
public void onPause () {
super . onPause ();
pauseGame ();
}
@Override
public boolean onCreateOptionsMenu ( Menu menu ) {
getMenuInflater () . inflate ( R . menu . action_menu , menu );
return true ;
}
@Override
public boolean onOptionsItemSelected ( MenuItem item ) {
View menuItemView = findViewById ( item . getItemId ());
PopupMenu popup = new PopupMenu ( this , menuItemView );
popup . getMenuInflater () . inflate ( R . menu . popup_menu , popup . getMenu ());
popup . show ();
popup
. getMenu ()
. findItem ( R . id . privacy_settings )
. setVisible ( googleMobileAdsConsentManager . isPrivacyOptionsRequired ());
popup . setOnMenuItemClickListener (
popupMenuItem - > {
if ( popupMenuItem . getItemId () == R . id . privacy_settings ) {
pauseGame ();
// Handle changes to user consent .
googleMobileAdsConsentManager . showPrivacyOptionsForm (
this ,
formError - > {
if ( formError != null ) {
Toast . makeText ( this , formError . getMessage (), Toast . LENGTH_SHORT ) . show ();
}
resumeGame ();
});
return true ;
} else if ( popupMenuItem . getItemId () == R . id . ad_inspector ) {
MobileAds . openAdInspector (
this ,
error - > {
// Error will be non - null if ad inspector closed due to an error .
if ( error != null ) {
Toast . makeText ( this , error . getMessage (), Toast . LENGTH_SHORT ) . show ();
}
});
return true ;
}
return false ;
});
return super . onOptionsItemSelected ( item );
}
private void showInterstitial () {
// Show the ad if it's ready . Otherwise restart the game .
if ( interstitialAd != null ) {
interstitialAd . show ( this );
} else {
startGame ();
if ( googleMobileAdsConsentManager . canRequestAds ()) {
loadAd ();
}
}
}
private void startGame () {
// Hide the button , and kick off the timer .
retryButton . setVisibility ( View . INVISIBLE );
createTimer ( GAME_LENGTH_MILLISECONDS );
gamePaused = false ;
gameOver = false ;
}
private void resumeGame () {
if ( gameOver || ! gamePaused ) {
return ;
}
// Create a new timer for the correct length .
gamePaused = false ;
createTimer ( timerMilliseconds );
}
private void pauseGame () {
if ( gameOver || gamePaused ) {
return ;
}
countDownTimer . cancel ();
gamePaused = true ;
}
private void initializeMobileAdsSdk () {
if ( isMobileAdsInitializeCalled . getAndSet ( true )) {
return ;
}
// Set your test devices .
MobileAds . setRequestConfiguration (
new RequestConfiguration . Builder ()
. setTestDeviceIds ( Arrays . asList ( TEST_DEVICE_HASHED_ID ))
. build ());
new Thread (
() - > {
// Initialize the Google Mobile Ads SDK on a background thread .
MobileAds . initialize ( this , initializationStatus - > {});
// Load an ad on the main thread .
runOnUiThread (() - > loadAd ());
})
. start ();
}
}
MainActivity.kt
package com . google . android . gms . example . interstitialexample
import android.os.Bundle
import android.os.CountDownTimer
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.PopupMenu
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.android.gms.ads. *
import com.google.android.gms.ads.interstitial.InterstitialAd
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
import com.google.android.gms.example.interstitialexample.databinding.ActivityMainBinding
import java.util.concurrent.atomic.AtomicBoolean
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity () {
private val isMobileAdsInitializeCalled = AtomicBoolean ( false )
private lateinit var binding : ActivityMainBinding
private lateinit var googleMobileAdsConsentManager : GoogleMobileAdsConsentManager
private var interstitialAd : InterstitialAd ? = null
private var countdownTimer : CountDownTimer ? = null
private var gamePaused = false
private var gameOver = false
private var adIsLoading : Boolean = false
private var timerMilliseconds = 0 L
override fun onCreate ( savedInstanceState : Bundle ? ) {
super . onCreate ( savedInstanceState )
binding = ActivityMainBinding . inflate ( layoutInflater )
val view = binding . root
setContentView ( view )
// Log the Mobile Ads SDK version .
Log . d ( TAG , "Google Mobile Ads SDK Version : " + MobileAds . getVersion ())
googleMobileAdsConsentManager = GoogleMobileAdsConsentManager . getInstance ( this )
googleMobileAdsConsentManager . gatherConsent ( this ) { consentError - >
if ( consentError != null ) {
// Consent not obtained in current session .
Log . w ( TAG , "$ { consentError . errorCode }: $ { consentError . message }")
}
// Kick off the first play of the "game ".
startGame ()
if ( googleMobileAdsConsentManager . canRequestAds ) {
initializeMobileAdsSdk ()
}
if ( googleMobileAdsConsentManager . isPrivacyOptionsRequired ) {
// Regenerate the options menu to include a privacy setting .
invalidateOptionsMenu ()
}
}
// This sample attempts to load ads using consent obtained in the previous session .
if ( googleMobileAdsConsentManager . canRequestAds ) {
initializeMobileAdsSdk ()
}
// Create the "retry " button , which triggers an interstitial between game plays .
binding . retryButton . visibility = View . INVISIBLE
binding . retryButton . setOnClickListener { showInterstitial () }
}
override fun onCreateOptionsMenu ( menu : Menu ? ): Boolean {
menuInflater . inflate ( R . menu . action_menu , menu )
menu ? . findItem ( R . id . action_more ) ? . apply {
isVisible = googleMobileAdsConsentManager . isPrivacyOptionsRequired
}
return super . onCreateOptionsMenu ( menu )
}
override fun onOptionsItemSelected ( item : MenuItem ): Boolean {
val menuItemView = findViewById<View> ( item . itemId )
val activity = this
PopupMenu ( this , menuItemView ) . apply {
menuInflater . inflate ( R . menu . popup_menu , menu )
show ()
setOnMenuItemClickListener { popupMenuItem - >
when ( popupMenuItem . itemId ) {
R . id . privacy_settings - > {
pauseGame ()
// Handle changes to user consent .
googleMobileAdsConsentManager . showPrivacyOptionsForm ( activity ) { formError - >
if ( formError != null ) {
Toast . makeText ( activity , formError . message , Toast . LENGTH_SHORT ) . show ()
}
resumeGame ()
}
true
}
// Handle other branches here .
else - > false
}
}
return super . onOptionsItemSelected ( item )
}
}
private fun loadAd () {
// Request a new ad if one isn't already loaded .
if ( adIsLoading || interstitialAd != null ) {
return
}
adIsLoading = true
val adRequest = AdRequest . Builder () . build ()
InterstitialAd . load (
this ,
AD_UNIT_ID ,
adRequest ,
object : InterstitialAdLoadCallback () {
override fun onAdFailedToLoad ( adError : LoadAdError ) {
Log . d ( TAG , adError . message )
interstitialAd = null
adIsLoading = false
val error =
"domain : $ { adError . domain }, code : $ { adError . code }, " + "message : $ { adError . message } "
Toast . makeText (
this @MainActivity ,
"onAdFailedToLoad () with error $ error ",
Toast . LENGTH_SHORT ,
)
. show ()
}
override fun onAdLoaded ( ad : InterstitialAd ) {
Log . d ( TAG , "Ad was loaded . ")
interstitialAd = ad
adIsLoading = false
Toast . makeText ( this @MainActivity , "onAdLoaded ()", Toast . LENGTH_SHORT ) . show ()
}
},
)
}
// Create the game timer , which counts down to the end of the level
// and shows the "retry " button .
private fun createTimer ( milliseconds : Long ) {
countdownTimer ? . cancel ()
countdownTimer =
object : CountDownTimer ( milliseconds , 50 ) {
override fun onTick ( millisUntilFinished : Long ) {
timerMilliseconds = millisUntilFinished
binding . timer . text = "seconds remaining : $ { millisUntilFinished / 1000 + 1 } "
}
override fun onFinish () {
gameOver = true
binding . timer . text = "done ! "
binding . retryButton . visibility = View . VISIBLE
}
}
countdownTimer ? . start ()
}
// Show the ad if it's ready . Otherwise restart the game .
private fun showInterstitial () {
if ( interstitialAd != null ) {
interstitialAd ? . fullScreenContentCallback =
object : FullScreenContentCallback () {
override fun onAdDismissedFullScreenContent () {
Log . d ( TAG , "Ad was dismissed . ")
// Don't forget to set the ad reference to null so you
// don't show the ad a second time .
interstitialAd = null
}
override fun onAdFailedToShowFullScreenContent ( adError : AdError ) {
Log . d ( TAG , "Ad failed to show . ")
// Don't forget to set the ad reference to null so you
// don't show the ad a second time .
interstitialAd = null
}
override fun onAdShowedFullScreenContent () {
Log . d ( TAG , "Ad showed fullscreen content . ")
// Called when ad is dismissed .
}
}
interstitialAd ? . show ( this )
} else {
startGame ()
if ( googleMobileAdsConsentManager . canRequestAds ) {
loadAd ()
}
}
}
// Hide the button , and kick off the timer .
private fun startGame () {
binding . retryButton . visibility = View . INVISIBLE
createTimer ( GAME_LENGTH_MILLISECONDS )
gamePaused = false
gameOver = false
}
private fun pauseGame () {
if ( gameOver || gamePaused ) {
return
}
countdownTimer ? . cancel ()
gamePaused = true
}
private fun resumeGame () {
if ( gameOver || ! gamePaused ) {
return
}
createTimer ( timerMilliseconds )
gamePaused = true
}
private fun initializeMobileAdsSdk () {
if ( isMobileAdsInitializeCalled . getAndSet ( true )) {
return
}
// Set your test devices .
MobileAds . setRequestConfiguration (
RequestConfiguration . Builder () . setTestDeviceIds ( listOf ( TEST_DEVICE_HASHED_ID )) . build ()
)
CoroutineScope ( Dispatchers . IO ) . launch {
// Initialize the Google Mobile Ads SDK on a background thread .
MobileAds . initialize ( this @MainActivity ) {}
runOnUiThread {
// Load an ad on the main thread .
loadAd ()
}
}
}
// Resume the game if it's in progress .
public override fun onResume () {
super . onResume ()
resumeGame ()
}
public override fun onPause () {
super . onPause ()
pauseGame ()
}
companion object {
// This is an ad unit ID for a test ad . Replace with your own interstitial ad unit ID .
private const val AD_UNIT_ID = "ca - app - pub - 3940256099942544 / 1033173712 "
private const val GAME_LENGTH_MILLISECONDS = 3000 L
private const val TAG = "MainActivity "
// Check your logcat output for the test device hashed ID e . g .
// "Use RequestConfiguration . Builder () . setTestDeviceIds ( Arrays . asList ( "ABCDEF012345 "))
// to get test ads on this device " or
// "Use new ConsentDebugSettings . Builder () . addTestDeviceHashedId ( "ABCDEF012345 ") to set this as
// a debug device ".
const val TEST_DEVICE_HASHED_ID = "ABCDEF012345 "
}
}
ตัวอย่างใน GitHub
เรื่องราวความสำเร็จ
ขั้นตอนถัดไป