AdMob广告未在Xamarin Android应用中显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AdMob广告未在Xamarin Android应用中显示相关的知识,希望对你有一定的参考价值。

我最近设法完成并将我的第一个android应用程序部署到Google Play,现在我正在尝试添加AdMob。

经过一些错误的启动,几次清理和重建我正处于应用程序正在构建的位置,但我无法显示广告。

所以,我创建了一个名为AdMobView的内容视图;

using Xamarin.Forms;

namespace MyApplication
{
    public partial class AdMobView : ContentView
    {
        public AdMobView()
        {
        }
    }
}

然后下课;

using Android.Gms.Ads;
using Xamarin.Forms;
using MyApplication;
using Xamarin.Forms.Platform.Android;


[assembly: ExportRenderer(typeof(AdMobView), typeof(AdMobRenderer))]

namespace MyApplication
{
    public class AdMobRenderer : ViewRenderer <AdMobView, AdView> 
    {
        protected override void    OnElementChanged(ElementChangedEventArgs<AdMobView> e)
        {
            base.OnElementChanged(e);

            if (Control == null)
            {
                var ad = new Android.Gms.Ads.AdView(Forms.Context);
                ad.AdSize = Android.Gms.Ads.AdSize.Banner;
                ad.AdUnitId = "<the AdUnit id>";

                var requestbuilder = new Android.Gms.Ads.AdRequest.Builder();
                ad.LoadAd(requestbuilder.Build());

                SetNativeControl(ad);
            }
        }
    }
}

在我希望广告显示的XAML中,我添加了

<controls:AdMobView WidthRequest="320" HeightRequest="50" />

同样在这个XAML中,我为控件添加了一个xmln

xmlns:controls="clr-namespace:MyApplication;assembly=MyApplication"

在我添加的MainActivity.cs中

MobileAds.Initialize(ApplicationContext, "<the AdUnit id>");

在AssemblyInfo.cs中我添加了;

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessNetworkState)]

在AndroidManifest.xml中我添加了;

    <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" />

因此,正如我所说,这种构建很好,并且在真实设备和模拟器中以调试模式运行,但广告应该显示的区域中没有任何内容。我只能看到正常的背景 - 甚至没有“空白”框。

如果有人有任何想法,你可以节省我几个不眠之夜!

答案

好的,我已经设法让它工作。 如果其他人都在苦苦挣扎,我将在这里发布完整的代码,因为我没有找到一个独立工作的教程,不得不从几个来源拼凑起来......

Android清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"   package="<your package name>" 
      android:versionCode="<your version code>" android:versionName="<your version number>" android:installLocation="auto">
<uses-sdk android:minSdkVersion="16" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:label="<your app title>" 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" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
</application>

MainActivity.cs:

 using Android.Gms.Ads;
 .
 .
 .
 MobileAds.Initialize(ApplicationContext, "<your unit id>");
 LoadApplication(new App());

重要说明 - 确保这是应用单元ID,而不是看起来类似的应用ID。单元ID是格式为ca-app-pub-9nnnnnnnnnnnnnn / nnnnnnnnnn的应用程序ID看起来很相似但是有一个〜而不是/如果你在主活动中使用了LoadApplication,请确保这是在Initialize之后 - 这就是我正在制作的一个小学生错误。在VS2015中,这实际上有一个绿色下划线,上面有一条消息说明它已被弃用,但我发现它仍然需要提供广告。

创建一个名为AdMobView.cs的视图:

using Xamarin.Forms;

namespace FightJudgeAssistant
{
    public class AdMobView : View
    {

    }
}

在Visual Studio中创建视图时,它会放入不同的Using语句。你可以摆脱所有这些,只需使用Xamarin.Forms

创建一个名为AdViewRenderer.cs的类:

using Android.Widget;
using Android.Gms.Ads;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using FightJudgeAssistant;

[assembly: ExportRenderer(typeof(mynamespace.AdMobView),     typeof(AdMobRenderer))]

namespace mynamespace
{
public class AdMobRenderer : ViewRenderer<mynamespace.AdMobView, Android.Gms.Ads.AdView>
{
    protected override void OnElementChanged(ElementChangedEventArgs<mynamespace.AdMobView> e) 
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            var ad = new Android.Gms.Ads.AdView(Forms.Context);
            ad.AdSize = Android.Gms.Ads.AdSize.Banner;
            ad.AdUnitId = "<your unit id>";

            var requestbuilder = new Android.Gms.Ads.AdRequest.Builder();
            ad.LoadAd(requestbuilder.Build());

            SetNativeControl(ad);
        }
    }
}

}

在屏幕上,您要显示广告(在我的情况下,它是网格视图中的XAML):

<ContentPage.Content>
<Grid x:Name="controlGrid" RowSpacing="1" ColumnSpacing="1">

        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        .
        .
        .
        .
        <controls:AdMobView Grid.Row="6"/>
    </Grid>

我在上面没有显示的网格行中有其他内容。您会注意到我已将第6行的行高设置为“自动”而不是“*”,以确保广告占用所需的空间。

还在ContentPage部分中添加了以下XMLNS:

xmlns:controls="clr-namespace:mynamespace;assembly=myAssemblyname>

这就是它!为了测试这个工作我使用ca-app-pub-3940256099942544/6300978111专门用于测试横幅广告

以上是关于AdMob广告未在Xamarin Android应用中显示的主要内容,如果未能解决你的问题,请参考以下文章

Admob横幅广告未在Android P中加载

admob 广告未在 Android 应用程序 apk 中显示

admob 广告未在 Android 应用程序 apk 中显示

Xamarin Android Admob 测试广告仅在设备上显示一次

admob 广告未在 flash 中使用 milkmangames 扩展显示

admob 广告未在 flash 中使用 milkmangames 扩展显示