maximephan
maximephan

Reputation: 43

Is it possible to integrate AdMob in an Android app using Uno Platform

I have a few UWP apps I would like to migrate to Android.

I already migrated some using Xamarin.Forms I have discovered Uno Platform that seems to be great. But I didn't find any information about integration AdMob advertisement in an Android project using Uno Platform.

Has anyone done it already?

Upvotes: 2

Views: 595

Answers (2)

Martin Zikmund
Martin Zikmund

Reputation: 39072

Yes, it is possible and I have been able to get it working in my Uno Platform app on Android and iOS. I am planning to write a blogpost about getting AdMob and AdSense running on Android, iOS and WASM, and publish a Uno Platform library on NuGet that will do all the heavy lifting for you, so stay tuned :-) .

For now, here is a unedited, raw version of the control I am using currently. It requires that you install the Google Play Services Ads NuGet packages in the Android project and in the iOS project.

Android

#if __ANDROID__
using Android.Gms.Ads;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.Text;
using Uno.UI;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace SmsTicket.Core.Controls
{
    public partial class AdControl : ContentControl
    {
        public AdControl()
        {
            var adView = new AdView(ContextHelper.Current);
            adView.AdSize = AdSize.SmartBanner;
            adView.AdUnitId = "YOUR AD UNIT ID";
            HorizontalContentAlignment = HorizontalAlignment.Stretch;
            VerticalContentAlignment = VerticalAlignment.Stretch;
            var adParams = new LinearLayout.LayoutParams(
                LayoutParams.WrapContent, LayoutParams.WrapContent);
            adView.LayoutParameters = adParams;           
            adView.LoadAd(new AdRequest.Builder().AddTestDevice("YOUR TEST DEVICE ID").Build());
            Content = adView;
        }
    }
}
#endif

iOS

#if __IOS__
using Google.MobileAds;
using System;
using System.Collections.Generic;
using System.Text;
using UIKit;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml;
using CoreGraphics;

namespace SmsTicket.Core.Controls
{
    public partial class AdControl : ContentControl
    {
        public AdControl()
        {
            HorizontalContentAlignment = HorizontalAlignment.Stretch;
            VerticalContentAlignment = VerticalAlignment.Stretch;
            Background = SolidColorBrushHelper.Red;
            Width = AdSizeCons.LargeBanner.Size.Width;
            Height = AdSizeCons.LargeBanner.Size.Height;
            Windows.UI.Xaml.Window.Current.Activated += Current_Activated;
        }

        private void LoadAd()
        {
            if (!(Content is BannerView))
            {
                var adView = new BannerView(AdSizeCons.LargeBanner)
                {
                    AdUnitID = "YOUR AD UNIT ID",
                    RootViewController = GetVisibleViewController()
                };
                adView.LoadRequest(GetRequest());
                Content = adView;
            }
        }

        Request GetRequest()
        {
            var request = Request.GetDefaultRequest();
            // Requests test ads on devices you specify. Your test device ID is printed to the console when
            // an ad request is made. GADBannerView automatically returns test ads when running on a
            // simulator. After you get your device ID, add it here
            request.TestDevices = new[] { Request.SimulatorId.ToString(), "YOUR TEST DEVICE ID" };
            return request;
        }

        UIViewController GetVisibleViewController()
        {
            UIViewController rootController;
            if (UIApplication.SharedApplication.KeyWindow == null)
            {
                return null;
            }
            else
            {
                rootController = UIApplication.SharedApplication.KeyWindow.RootViewController;
            }

            if (rootController.PresentedViewController == null)
                return rootController;

            if (rootController.PresentedViewController is UINavigationController)
            {
                return ((UINavigationController)rootController.PresentedViewController).VisibleViewController;
            }

            if (rootController.PresentedViewController is UITabBarController)
            {
                return ((UITabBarController)rootController.PresentedViewController).SelectedViewController;
            }

            return rootController.PresentedViewController;
        }

        private void Current_Activated(object sender, Windows.UI.Core.WindowActivatedEventArgs e)
        {
            LoadAd();
        }
    }
}
#endif

Also make sure to include the Ad control only conditionally (as I have provided only Android and iOS version here).

Upvotes: 6

matfillion
matfillion

Reputation: 867

Uno Platform won't block you from using any third party (especially not on mobile). If there is a xamarin binding you can use it as-is in your code, just like you would use it in a Xamarin.Forms app. If it's a library affecting the view you will most likely create a custom control and interact with the third-party classes via C#.

If there's no xamarin binding for a library, you can create one following microsoft documentation.

Good news! For admob there is a microsoft-supported binding nuget and it has been used in an uno application in the past.

Upvotes: 0

Related Questions