Xamarin Формирует Адаптивную баннерную рекламу AdMob для Android

#android #xamarin.forms #admob #ads #banner

Вопрос:

Я хочу добавить адаптивный баннер AdMob в нижнюю часть страницы своего приложения, но что бы я ни делал, я не могу заставить его отображаться правильно. У меня нет проблем с загрузкой объявления (и промежуточные объявления, которые у меня есть, тоже работают нормально), но я никогда не могу заставить его правильно позиционироваться. Я перепробовал миллион комбинаций битов кода и свойств и просмотрел все, что смог найти в Интернете, но безрезультатно.

Мой код состоит из трех частей:

Пользовательское представление в общем проекте, унаследованное от класса Frame (несмотря на некоторые рекомендации в Интернете о наследовании от представления, объявления полностью невидимы, если я не унаследовал от фрейма).

 using Xamarin.Forms;

namespace MyApp.Views
{
    public class AdAdaptiveBannerView : Frame
    {
        public AdAdaptiveBannerView()
        {
        }
    }
}
 

Пользовательский визуализатор в проекте Android.

 using Android.Content;
using Android.Gms.Ads;
using Android.Widget;
using System;
using Xamarin.Essentials;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(MyApp.Views.AdAdaptiveBannerView), typeof(MyApp.Droid.AdAdaptiveBanner_Droid))]
namespace MyApp.Droid
{
    public class AdAdaptiveBanner_Droid : ViewRenderer<Views.AdAdaptiveBannerView, AdView>
    {
        public static AdView adView;

        public AdAdaptiveBanner_Droid(Context context) : base(context)
        {
        }

        private AdView CreateAdView()
        {
            adView = new AdView(Android.App.Application.Context)
            {
                AdUnitId = "ca-app-pub-3940256099942544/6300978111", //ca-app-pub-3940256099942544/6300978111 is a banner test unit.
                LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent), //For Adaptive Banner.
                AdSize = AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSize(Android.App.Application.Context, (int)(DeviceDisplay.MainDisplayInfo.Width / DeviceDisplay.MainDisplayInfo.Density))
                //LayoutParameters = new LinearLayout.LayoutParams(LayoutParams.MatchParent, LayoutParams.WrapContent), //For SmartBanner.
                //AdSize = AdSize.SmartBanner
            };

            adView.AdListener = new ListeningRegular();
            adView.LoadAd(new AdRequest.Builder().Build());

            return adView;
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Views.AdAdaptiveBannerView> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null amp;amp; Control == null) SetNativeControl(CreateAdView());
        }
    }

    internal class ListeningRegular : AdListener
    {
        public override void OnAdLoaded()
        {
            Console.WriteLine("Ad has loaded.");
            base.OnAdLoaded();
        }

        public override void OnAdClosed()
        {
            Console.WriteLine("Ad has closed.");
            AdAdaptiveBanner_Droid.adView.Dispose();
            AdAdaptiveBanner_Droid.adView = null;
            AdAdaptiveBanner_Droid.adView.AdListener = null;
            GC.Collect();
            base.OnAdClosed();
        }
    }
}
 

И XAML страницы содержимого в общем проекте (я установил цвет фона на что-то, чтобы мне было легче видеть, что происходит).

 <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:views="clr-MyApp.Views"
             x:Class="MyApp.Pages.Page1">
    <ContentPage.Content>
        <StackLayout>
            <Grid VerticalOptions="EndAndExpand">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <views:AdAdaptiveBannerView BackgroundColor="DeepSkyBlue" />
            </Grid>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>
 

Как я уже сказал, это нормально загружает рекламу, но она всегда обрезает нижнюю часть объявления. Помимо того, что это выглядит глупо, политика Google явно запрещает это.

Он также случайным образом решает при открытии страницы либо заполнить ширину экрана, либо использовать только стандартную ширину баннера, как показано на следующих двух изображениях (взятых с физического Samsung Galaxy S6 под управлением Android 7).

Адаптивное баннерное объявление, заполняющее ширину

и

Адаптивное баннерное объявление, которое не заполняет ширину

Я подумал, что это может быть связано с тем, что GetCurrentOrientationAnchoredAdaptiveBannerAdSize не знал, в какой ориентации находится устройство, и случайным образом выбирал между портретной и альбомной ориентацией, но если я использую GetLandscapeAnchoredAdaptiveBannerAdSize и GetPortraitAnchoredAdaptiveBannerAdSize в зависимости от отображения устройства.MainDisplayInfo.Ориентацию он по-прежнему выбирает случайным образом.

Если я откажусь от попыток использовать Адаптивный баннер и вместо этого использую Умный баннер (раскомментировав две прокомментированные строки во втором фрагменте кода выше и закомментировав две строки над ним), он будет выглядеть так же плохо, со странной границей вокруг него.

введите описание изображения здесь

Он также случайным образом выбирает, какой размер объявления (т. Е. Смотрите, где написано «Это тестовое объявление XxY») для загрузки, хотя я думал, что это должно зависеть от ширины экрана и поэтому всегда должно быть одинаковым.

Я пробовал помещать его в различные контейнеры (например, в сетку, как показано в приведенном выше коде), но ничего. Этот пост уже достаточно длинный; Если бы я описал все, что я пробовал, это заняло бы 50 страниц.

Долгое время у меня складывалось впечатление, что это как-то связано с заполнением, потому что оно наследуется от фрейма (который по умолчанию имеет заполнение 20), но никакая комбинация заполнений (установка значения 0 не приводит к полному исчезновению объявления), полей, вертикальных параметров, горизонтальных параметров, свойств определения строк или чего-либо еще не помогает.

Кроме того, я не знаю, как заставить его реагировать на поворот устройства, так что это еще одна проблема, так как при повороте экрана он выглядит неправильно (и вы можете установить размер объявления только один раз).

Пожалуйста, кто-нибудь может помочь?

Редактировать: Я только что попытался добавить рекламу баннера программно, а не в XAML, и это дает точно такой же результат. Это так расстраивает.

Ответ №1:

После многих часов безделья, похоже, у меня есть решение. Я должен использовать код, лежащий в основе метода getCurrentOrientationAnchoredAdaptiveBannerAdSize (спасибо @youssef mountassir за код), чтобы задать запрос высоты для представления адаптивного баннера на странице содержимого. Я не мог понять, как это сделать внутри визуализатора.

У него все еще иногда есть тонкая черная полоса вверху и внизу, но я подозреваю, что это связано с тестовыми объявлениями.

Что я действительно хочу знать, так это почему я должен это делать, когда, кажется, никто другой этого не должен.

Ответить на мой второй вопрос, то есть как обновить его при вращении устройства, было проще. Я добавляю просмотр рекламы на страницу программно, а затем, когда устройство поворачивается, я заменяю его новым.