Android Admob InterstitialAd 已弃用

Android Admob InterstitialAd Deprecated

com.google.android.gms:play-services-ads 更新为 19.7.0 后 它说 InterstitialAd & RewardedVideoAd & UnifiedNativeAdView 已弃用。

有人能帮忙吗?

经过快速搜索,我发现我们需要使用

public abstract class InterstitialAd extends Object

而不是

public final class InterstitialAd extends Object

所以你需要使用:

com.google.android.gms.ads.interstitial.InterstitialAd

而不是:

come.google.android.gms.ads

这就是我们与新包交互的方式:

public class AdManager 
{
    private var interstitialAd: InterstitialAd? = null
    private var mRewardedVideoAd: RewardedAd? = null
    private var currentNativeAd: NativeAd? = null
    private var builder: AdLoader.Builder? = null



    init {
        RequestConfiguration.Builder().setTestDeviceIds(
            listOf(
                AdRequest.DEVICE_ID_EMULATOR,
                "CE88B9A1CB213EEEA19A2F7E54993908"
            )
        )
    }
    // Create a full screen content callback.
    val fullScreenContentCallback = object : FullScreenContentCallback() {
        override fun onAdFailedToShowFullScreenContent(p0: AdError) {
            super.onAdFailedToShowFullScreenContent(p0)
        }

        override fun onAdShowedFullScreenContent() {
            super.onAdShowedFullScreenContent()
        }

        override fun onAdDismissedFullScreenContent() {
            super.onAdDismissedFullScreenContent()
            interstitialAd = null
            mRewardedVideoAd = null
        }

    }

    fun createInterstitialAd(context: Context) {
     
            InterstitialAd.load(
                context,
                BuildConfig.ADMOB_AD_INTERSTITIAL_UNIT_ID,
                request.build(),
                object : InterstitialAdLoadCallback() {
                    override fun onAdLoaded(ad: InterstitialAd) {
                        interstitialAd = ad
                        interstitialAd?.fullScreenContentCallback = fullScreenContentCallback
                    }

                })
        }
    }

    fun getFullScreenAd(): InterstitialAd? {
        return interstitialAd
    }

    fun getVideoAd(): RewardedAd? {
        return mRewardedVideoAd
    }

    fun loadRewardedVideoAd(context: Context) {
        if (!userManager.getCurrentUser().isPremium) {
            val request = AdRequest.Builder()
     

            RewardedAd.load(
                context,
                BuildConfig.ADMOB_AD_VIDEO_UNIT_ID,
                AdRequest.Builder().build(),
                object : RewardedAdLoadCallback() {
                    override fun onAdLoaded(ad: RewardedAd) {
                        super.onAdLoaded(ad)
                        mRewardedVideoAd = ad;
                        mRewardedVideoAd?.fullScreenContentCallback = fullScreenContentCallback;
                    }
                    override fun onAdFailedToLoad(p0: LoadAdError) {
                        super.onAdFailedToLoad(p0)

                    }
                })
        }
   

    fun loadNativeAd(context: Activity,adFrame:FrameLayout) {
      
            builder = AdLoader.Builder(context, BuildConfig.ADMOB_AD_UNIT_ID_DIALOG_NATIVE)
            builder?.forNativeAd { unifiedNativeAd: NativeAd ->
                val adView: View =
                    context.layoutInflater.inflate(R.layout.ad_unified, null)
                val ad = adView as NativeAdView
                populateUnifiedNativeAdView(unifiedNativeAd, ad)
                adFrame.removeAllViews()
                adFrame.addView(ad)
            }
            val adLoader = builder?.withAdListener(object : AdListener() {
                override fun onAdFailedToLoad(i: LoadAdError) {
                    super.onAdFailedToLoad(i)
                    Log.e("NativeAdFailed", i.toString() + "")
                }
            })?.build()
            val builder = AdManagerAdRequest.Builder()
            adLoader?.loadAd(builder.build())
        }
    }


    private fun populateUnifiedNativeAdView(
        nativeAd: NativeAd,
        adView: NativeAdView
    ) {
        // You must call destroy on old ads when you are done with them,
        // otherwise you will have a memory leak.
        if (currentNativeAd != null) currentNativeAd?.destroy()
        currentNativeAd = nativeAd

        // Set the media view.
        adView.mediaView = adView.findViewById<View>(R.id.ad_media) as com.google.android.gms.ads.nativead.MediaView

        // Set other ad assets.
        adView.headlineView = adView.findViewById(R.id.ad_headline)
        adView.bodyView = adView.findViewById(R.id.ad_body)
        adView.callToActionView = adView.findViewById(R.id.ad_call_to_action)
        adView.iconView = adView.findViewById(R.id.ad_app_icon)
        adView.priceView = adView.findViewById(R.id.ad_price)
        adView.starRatingView = adView.findViewById(R.id.ad_stars)
        adView.storeView = adView.findViewById(R.id.ad_store)
        adView.advertiserView = adView.findViewById(R.id.ad_advertiser)

        // The headline and media content are guaranteed to be in every UnifiedNativeAd.
        (adView.headlineView as TextView).text = nativeAd.headline
        nativeAd.mediaContent?.let {
            adView.mediaView?.setMediaContent(it)

        }

        // These assets aren't guaranteed to be in every UnifiedNativeAd, so it's important to
        // check before trying to display them.
        if (nativeAd.body == null) {
            adView.bodyView?.visibility = View.INVISIBLE
        } else {
            adView.bodyView?.visibility = View.VISIBLE
            (adView.bodyView as TextView).text = nativeAd.body
        }
        if (nativeAd.callToAction == null) {
            adView.callToActionView?.visibility = View.INVISIBLE
        } else {
            adView.callToActionView?.visibility = View.VISIBLE
            (adView.callToActionView as TextView).text = nativeAd.callToAction
        }
        if (nativeAd.icon == null) {
            adView.iconView?.visibility = View.GONE
        } else {
            (adView.iconView as ImageView).setImageDrawable(
                nativeAd.icon?.drawable
            )
            adView.iconView?.visibility = View.VISIBLE
        }
        if (nativeAd.price == null) {
            adView.priceView?.visibility = View.INVISIBLE
        } else {
            adView.priceView?.visibility = View.VISIBLE
            (adView.priceView as TextView).text = nativeAd.price
        }
        if (nativeAd.store == null) {
            adView.storeView?.visibility = View.INVISIBLE
        } else {
            adView.storeView?.visibility = View.VISIBLE
            (adView.storeView as TextView).text = nativeAd.store
        }
        if (nativeAd.starRating == null) {
            adView.starRatingView?.visibility = View.INVISIBLE
        } else {
            nativeAd.starRating?.toDouble()?.let {
                (adView.starRatingView as RatingBar).rating = it.toFloat()
                adView.starRatingView?.visibility = View.VISIBLE
            }


        }
        if (nativeAd.advertiser == null) {
            adView.advertiserView?.visibility = View.INVISIBLE
        } else {
            (adView.advertiserView as TextView).text = nativeAd.advertiser
            adView.advertiserView?.visibility = View.VISIBLE
        }

        // This method tells the Google Mobile Ads SDK that you have finished populating your
        // native ad view with this native ad.
        adView.setNativeAd(nativeAd)
    }
}

使用com.google.android.gms.ads.interstitial.InterstitialAd

而不是

come.google.android.gms.ads

Google 移动广告 SDK 版本 20.0.0 计划于 2021 年初推出,并进行了一些重大更改,以及一些简单的 API 重命名和删除已弃用的 API秒。 您可以在 this link 上查看更多详细信息。 使用 NativeAdView 而不是 UnifiedNativeAdView 等。

当您将 admob sdk 升级到

 implementation 'com.google.firebase:firebase-ads:19.7.0'

您会发现旧的 sdk 方法已被弃用,例如 InterstitialAD

这里很简单,只需按照我的方式加载您的插页式广告并在此处删除弃用,这是我的示例代码,可以更好地请求广告,如果您有任何疑问,请在 activity 的 On start 加载您的添加在下面的评论中知道复制粘贴以下代码:

   public static  AdRequest adRequest;
public static InterstitialAd mInterstitialAd;
public void InterstitialAdmob() {
    InterstitialAd.load(MainActivity.this,getString(R.string.Interstitial), adRequest, new InterstitialAdLoadCallback() {
        @Override
        public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
            // The mInterstitialAd reference will be null until
            // an ad is loaded.
            mInterstitialAd = interstitialAd;
            mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback(){

                @Override
                public void onAdDismissedFullScreenContent() {
                    super.onAdDismissedFullScreenContent();
                    mInterstitialAd=null;

                    //// perform your code that you wants todo after ad dismissed or closed


                }

                @Override
                public void onAdFailedToShowFullScreenContent(com.google.android.gms.ads.AdError adError) {
                    super.onAdFailedToShowFullScreenContent(adError);
                    mInterstitialAd = null;

                    /// perform your action here when ad will not load
                }

                @Override
                public void onAdShowedFullScreenContent() {
                    super.onAdShowedFullScreenContent();
                    mInterstitialAd = null;

                }
            });

        }

        @Override
        public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
            // Handle the error
            mInterstitialAd = null;
            

        }

    });

}

@Override
protected void onStart() {
    super.onStart();
    measyrating.onStart();
    adRequest = new AdRequest.Builder().build();
    InterstitialAdmob();

}

现在只需在按下按钮或点击按钮时展示您的广告

  @Override
public void onBackPressed() {

    if (mInterstitialAd!=null){
        mInterstitialAd.show(MainActivity.this);
    }
    else{

        if (doubleBackToExitPressedOnce) {
            if (mBottomNavigationView.getSelectedItemId() == R.id.navigation_doc)
            {
                super.onBackPressed();

            }
            else

            {

                mBottomNavigationView.setSelectedItemId(R.id.navigation_doc);
            }
            return;
        }

        this.doubleBackToExitPressedOnce = true;
        if (this.drawer.isDrawerOpen(GravityCompat.START)) {

            this.drawer.closeDrawer(GravityCompat.START);

        }


        if (itempositionselected==0){

            loadFragment(new DocxFileFragment());

        }
        else {


        }

        if (!searchView.isIconified()) {

            searchView.setIconified(true);

        }
        Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();

        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                doubleBackToExitPressedOnce=false;
            }
        }, 2000);
    }


}

There are many breaking changes coming in version 20.0.0. Version 19.7.0 introduced many new APIs, and deprecated or renamed many classes in preparation for version 20.0.0.

此代码说明如何在 v 19.7.0 中集成插页式广告

class Web : AppCompatActivity() {
    private var mInterstitialAd: InterstitialAd? = null

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

        // load ad
        loadAd();

        toNextLevel()
    }

    // load ad
    private fun loadAd() {
        InterstitialAd.load(
            this@Web,
            "ca-app-pub-3940256099942544/1033173712",
            AdRequest.Builder().build(),
            object : InterstitialAdLoadCallback() {
                override fun onAdLoaded(interstitialAd: InterstitialAd) {
                    // The mInterstitialAd reference will be null until
                    // an ad is loaded.
                    mInterstitialAd = interstitialAd
                    mInterstitialAd?.fullScreenContentCallback =
                        object : FullScreenContentCallback() {
                            override fun onAdDismissedFullScreenContent() {
                                super.onAdDismissedFullScreenContent()
                                mInterstitialAd = null

                                //// perform your code that you wants to do after ad dismissed or closed
                            }

                            override fun onAdFailedToShowFullScreenContent(adError: AdError) {
                                super.onAdFailedToShowFullScreenContent(adError)
                                mInterstitialAd = null

                                /// perform your action here when ad will not load
                            }

                            override fun onAdShowedFullScreenContent() {
                                super.onAdShowedFullScreenContent()
                                this@Web.mInterstitialAd = null
                            }
                        }
                }

                override fun onAdFailedToLoad(loadAdError: LoadAdError) {
                    // Handle the error
                    mInterstitialAd = null
                }
            })
    }

    private fun toNextLevel() {
        // Show the interstitial if it is ready. Otherwise, proceed to the next level
        // without ever showing it
        if (mInterstitialAd != null) {
            mInterstitialAd?.show(this@Web)
        } else {
            nextLevel()

            // in case you want to load a new ad
            requestNewInterstitial()
        }
    }

    private fun nextLevel() {
        TODO("Not yet implemented")
    }

    private fun requestNewInterstitial() {
        if (mInterstitialAd == null) {
            loadAd()
        }
    }
}

下一页包含新版本插页式广告的示例和详细信息

https://developers.google.com/admob/android/interstitial

下面是一个完整的工作示例,基于上面我使用的当前版本com.google.android.gms:play-services-ads:20.2.0

    public class BriefDisplayActivity extends AppCompatActivity {
    
    InterstitialAd briefInterstitialAd;


    AdRequest adRequest_I = new AdRequest.Builder().build();

    InterstitialAd.load(this,"ca-app-pub-3940256099942544/1033173712", adRequest_I,
            new InterstitialAdLoadCallback() {
                @Override
                public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                    // The mInterstitialAd reference will be null until
                    // an ad is loaded.
                    BriefDisplayActivity.this.briefInterstitialAd = interstitialAd;
                    Log.i(TAG, "onAdLoaded");
                    briefInterstitialAd.show(BriefDisplayActivity.this);
                }

                @Override
                public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                    // Handle the error
                    Log.i(TAG, loadAdError.getMessage());
                    BriefDisplayActivity.this.briefInterstitialAd = null;
                }
            });
            
    }