A Freaking AdMob ad in a Monogame project

I’m close to publishing my first Xamarin Monogame app and now I’m putting in ads to monetize it. I knew this would be tricky, but after hours of sifting through bad examples and misleading forum posts, I was pulling my hair out. “Why is this soooo hard?” Finally, I found a sample that actually worked. It was too complicated of course, so I simplified it and I am presenting the results here for you. What you see below is the bare minimum code to get ads working in a Monogame project.  Enjoy!

Step 1: put in required activities and permissions.  My android manifest looks like this:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="AdMobInMonogame.AdMobInMonogame" android:versionCode="1" android:versionName="1.0">
  <uses-sdk />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.INTERNET" />
  <application android:label="AdMobInMonogame" android:icon="@drawable/Icon">
    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
    <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
  </application>
</manifest>

The android activity look like this:

using Android.App;
using Android.Gms.Ads;
using Android.OS;
using Android.Views;
using Android.Widget;

namespace AdMobInMonogame
{
    [Activity(Label = "AdMobInMonogame" , MainLauncher = true)]
    public class Activity1 : Microsoft.Xna.Framework.AndroidGameActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            var game = new MyGame();
            var gameView = (View)game.Services.GetService(typeof(View));

            // A container to show the add at the bottom of the page
            var adContainer = new LinearLayout(this);
            adContainer.Orientation = Orientation.Horizontal;
            adContainer.SetGravity(GravityFlags.CenterHorizontal | GravityFlags.Bottom);
            adContainer.SetBackgroundColor(Android.Graphics.Color.Transparent); // Need on some devices, not sure why

            // A layout to hold the ad container and game view
            var mainLayout = new FrameLayout(this);
            mainLayout.AddView(gameView);
            mainLayout.AddView(adContainer);
            SetContentView(mainLayout);

            // The actual ad
            var bannerAd = new AdView(this)
            {
                AdUnitId = "ca-app-pub-3940256099942544/6300978111", // Get this id from admob "Monetize" tab
                AdSize = AdSize.Banner,
            };

            bannerAd.LoadAd(new AdRequest.Builder()
                .AddTestDevice("DEADBEEF9A2078B6AC72133BB7E6E177") // Prevents generating real impressions while testing
                .Build());

            // Give the game methods to show/hide the ad.
            game.ShowAd = () => adContainer.AddView(bannerAd);
            game.HideAd = () => adContainer.RemoveView(bannerAd);

            game.Run();
        }
    }
}

And finally, the game class is set up to do a simple demonstration that turns the add on or off every 3 seconds:

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace AdMobInMonogame
{
    public class MyGame : Game
    {
        GraphicsDeviceManager _graphics;
        double _secondsPassed = 0;
        bool _adIsVisible = false;

        // Methods back into the Android activity to control ads
        public Action ShowAd { get; set; }
        public Action HideAd { get; set; }

        public MyGame()
        {
            _graphics = new GraphicsDeviceManager(this);
        }

        protected override void Draw(GameTime gameTime)
        {
            // Some simple code to turn the add on and off every three seconds
            _secondsPassed += gameTime.ElapsedGameTime.TotalSeconds;
            if(_secondsPassed > 3)
            {
                _secondsPassed = 0;
                if (_adIsVisible) HideAd();
                else ShowAd();
                _adIsVisible = !_adIsVisible;
            }

            GraphicsDevice.Clear(Color.CornflowerBlue);
            base.Draw(gameTime);
        }
    }
}

One Comment

  1. Thanks! It works!

    This is the only tutorial I could find on the world wide web about AdMob banners in MonoGame. AdMobBuddy is great but it only works for Interstital and Rewarded Ads, not banners. Now I only need to get this working on iOS as well. I think I can use your code as inspiration. Thanks again!

    Like

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s