Xamarin Forms Grid 中的 AdMob Smart Banner 自动高度未显示

AdMob SmartBanner in Xamain Forms Grid with Auto height not showing up

我按照 this 教程创建了一个 Hello World Xamarin Forms 应用程序并添加了代码以添加 AdMob 智能横幅广告。在我收到一封来自 AdMob 的电子邮件说 "Restricted Ad Serving" 之前,这一切都很好。所以我拿出我的旧代码在模拟器中给它一个 运行,广告根本没有出现,甚至没有显示白色 space(尽管我仍然可以看到空白 space在 App Store 版本中)。

所以我按照相同的教程创建了一个空白 'Hello World' 应用程序。广告根本没有出现。我验证了一切。

XAML -

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <!-- Place new controls here -->
    <Label Text="Welcome to Xamarin.Forms!" 
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />
    <ctrl:GoogleAdView Grid.Row="1"/>
</Grid>

然后出于好奇,我为广告行指定了一些随机高度,瞧,广告出现了。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="50"/>
    </Grid.RowDefinitions>
    <!-- Place new controls here -->
    <Label Text="Welcome to Xamarin.Forms!" 
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />
    <ctrl:GoogleAdView Grid.Row="1"/>
</Grid>

以下是我的项目的详细信息 (Android) -

我们在 Xamarin Forms 中使用 AdMob 的方式有什么变化吗?

我总是不得不在我的智能横幅控件上设置一个 Height。我的布局有点不同,因为我的广告控件位于 ViewCell 内,但高度逻辑应该与您的 RowDefinition.Height 相似。尝试以下方法(我使用 Xamarin.Essentials 插件来访问 DeviceDisplay.MainDisplayInfo 但还有其他方法可以获取这些值)

    public static int GetSmartBannerHeight() {
        DisplayInfo metrics = DeviceDisplay.MainDisplayInfo;

        double heightDp = metrics.Height / metrics.Density;

        if (heightDp <= 400) {
            return 32;
        }

        if (heightDp <= 720) {
            return 50;
        }

        return 90;
    }

接受的答案很棒。当没有互联网连接时,问题就来了。你留下了一个空白 space。要解决这个问题,请考虑使用名为 Xam.Plugin.Connectivity 的插件。您可以使用它在初始化期间检查连接状态,还可以处理 ConnectivityChanged 事件,以帮助您在没有互联网连接时将高度设置为零,或者在设备已连接时将高度设置为合适的高度。另请注意,您需要启用这两个 android 权限:ACCESS_NETWORK_STATEACCESS_WIFI_STATE。您可以在以下位置启用它们:右键单击 android 项目 > 属性 > Android 清单 > 所需权限。示例:

public MyPage()
{
    InitializeComponent();

    if(CrossConnectivity.Current.IsConnected)
    {
        AdContainer.HeightRequest = //Set appropriate height;
    }
    CrossConnectivity.Current.ConnectivityChanged += ConnectionHasChanged;
}


private void ConnectionHasChanged(object sender, ConnectivityChangedEventArgs e)
{
    if (e.IsConnected)
    {
        AdContainer.HeightRequest = //Set appropriate height;
    }
    else
    {
        AdContainer.HeightRequest = 0;
    }
}