Android Admob InterstitialAd 已弃用

问题描述

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

有人可以帮忙吗?

解决方法

快速搜索后,我在firebase doc page中找到了我们需要使用的

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)
    }
}
,

版本 20.0.0 中有许多重大更改。版本 19.7.0 引入了许多新的 API,并弃用或重命名了许多类,为 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",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()
        }
    }
}
,

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

代替

come.google.android.gms.ads

,

当您将 admob sdk 升级到

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

你会发现旧的 sdk 方法像 InterstitialAD 一样被弃用

这里很简单,只需按照我的方式加载您的插页式广告并在此处删除弃用,这是我的示例代码以获得更好的广告请求加载您的添加在您的活动开始时如果您有任何疑问请在下面的评论中告诉我复制粘贴下面的代码:

   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);
    }


}
,

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

,

以下页面提供了新版插页式广告的示例和详细信息

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,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;
                }
            });
            
    }