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

时间:2017-03-26 18:07:25

标签: android visual-studio xamarin admob

我最近设法将我的第一个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" />

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

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

2 个答案:

答案 0 :(得分:2)

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

Android Manifest:

<?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-9nnnnnnnnnnnnnnn / NNNNNNNNNN app id看起来很相似,但有一个〜而不是一个/ 如果您在主活动中使用LoadApplication,请确保这是在Initialize之后 - 这就是我正在制作的一个小学生错误。在VS2015中,这实际上有一个绿色下划线,上面有一条消息说明它已被弃用,但我发现广告仍需要提供。

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

using Xamarin.Forms;

namespace FightJudgeAssistant
{
    public class AdMobView : View
    {

    }
}

在Visual Studio中创建视图时,它会放入不同的Using语句。你可以摆脱所有这些,只需使用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行的行高设置为&#34; auto&#34;而不是&#34; *&#34;确保广告占用所需的空间。

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

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

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

答案 1 :(得分:0)

这应该仍然有效。您需要更改广告初始化的方式。

来自

MobileAds.Initialize(ApplicationContext, "<your unit id>");

<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="YourAppID"/>

将其放入您的应用清单