为什么我写的代码没有问题,但应用程序没有出现广告?
Why no ads appear in my application although I write the code correctly?
我正在尝试向我的 xamarin android 应用添加广告。
我按照视频来做到这一点。
但是当我完成时,我发现了一个 warning ( 'MobileAds.Initialize(Context, string)' is obsolete: 'deprecated' )
,并且当我试图启动该程序时,广告不起作用。
我尝试了大部分解决方案,但我的应用中没有出现任何广告。
这是主要的代码activity
using System;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Gms.Ads;
namespace App1.Droid
{
[Activity(Label = "App1", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
MobileAds.Initialize(ApplicationContext, "ca-app-pub-3192508017252023~9595491677");
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
这是AndroidManifest的代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1" android:versionName="1.0" package="com.companyname.app1">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application android:label="App1.Android" android:theme="@style/MainTheme">
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3192508017252023~9595491677"/>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
这是 MainPage 的代码 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"
x:Class="App1.MainPage"
xmlns:ads="clr-namespace:App1.Controls">
<StackLayout BackgroundColor="White">
<RelativeLayout>
<Grid RowSpacing="0">
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
</Grid>
<StackLayout Grid.Row="0">
<Label />
<Button />
</StackLayout>
</RelativeLayout>
<StackLayout HorizontalOptions="EndAndExpand">
<ads:Ad_control_view BackgroundColor="Red"
HorizontalOptions="EndAndExpand"
Grid.Row="1"
>
</ads:Ad_control_view>
</StackLayout>
</StackLayout>
这是 class AdmobControl
using System;
using System.Collections.Generic;
using System.Text;
using Xamarin.Forms;
namespace App3.Controls
{
public class AdmobControl :View
{
public static readonly BindableProperty AdUnitIdProperty = BindableProperty.Create(
nameof(AdUnitId),
typeof(string),
typeof(AdmobControl),
string.Empty);
public string AdUnitId
{
get => (string)GetValue(AdUnitIdProperty);
set => SetValue(AdUnitIdProperty, value);
}
}
}
这是Ad_control_view
using System;
using System.Collections.Generic;
using System.Text;
using Xamarin.Forms;
namespace App1.Controls
{
public class Ad_control_view:View
{
}
}
这是Ad_view_render
using Android.App;
using Android.Content;
using Android.Gms.Ads;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using App1.Controls;
using App1.Droid;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly:ExportRenderer(typeof(Ad_control_view),typeof(Ad_view_render))]
namespace App1.Droid
{
public class Ad_view_render:ViewRenderer<Ad_control_view,AdView>
{
public Ad_view_render(Context context):base(context)
{
}
string ad_unit_id = "ca-app-pub-3192508017252023/5820253414";
AdSize ad_size = AdSize.SmartBanner;
AdView ad_view;
private AdView Create_Ad_view()
{
if (ad_view != null)
return ad_view;
ad_view = new AdView(Context)
{
AdSize = ad_size,
AdUnitId = ad_unit_id
};
var ad_params = new LinearLayout.LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent);
ad_view.LayoutParameters = ad_params;
ad_view.LoadAd(new AdRequest.Builder().Build());
return ad_view;
}
protected override void OnElementChanged(ElementChangedEventArgs<Ad_control_view> e)
{
base.OnElementChanged(e);
if (Control==null&& e.NewElement!=null)
{
SetNativeControl(Create_Ad_view());
}
}
}
}
最后,这是警告信息
Severity Code Description Project File Line Suppression State
Warning CS0618 'MobileAds.Initialize(Context, string)' is obsolete:
'deprecated' App1.Android C:\Users\Abo
Ali\source\repos\App1\App1\App1.Android\MainActivity.cs 20 Active
使用最新版本的 AdMob,您将在不传递应用程序 ID 的情况下进行初始化(应用程序 ID 将从 AndroidManifest 中提取):
base.OnCreate(bundle);
MobileAds.Initialize(this);
从 Visual Studio Nuget 包的 Xamarin.GooglePlayServices.Ads.Lite 版本 119.1.0 开始,我会更准确地回答这个问题。
MobileAds.Initialize(AndroidContext, "APP_ID") 已弃用。
所以您所要做的就是删除或注释那行代码,然后将这行代码添加到您的 AndroidManifest.xml
<manifest>
<application>
<!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ADMOB_APP_ID"/>
</application>
</manifest>
此包之前的所有版本都需要 MainActivity 的 OnCreate 方法中的代码行 Class。
希望这个回答对您有所帮助!
我正在尝试向我的 xamarin android 应用添加广告。
我按照视频来做到这一点。
但是当我完成时,我发现了一个 warning ( 'MobileAds.Initialize(Context, string)' is obsolete: 'deprecated' )
,并且当我试图启动该程序时,广告不起作用。
我尝试了大部分解决方案,但我的应用中没有出现任何广告。
这是主要的代码activity
using System;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Gms.Ads;
namespace App1.Droid
{
[Activity(Label = "App1", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
MobileAds.Initialize(ApplicationContext, "ca-app-pub-3192508017252023~9595491677");
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
这是AndroidManifest的代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1" android:versionName="1.0" package="com.companyname.app1">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application android:label="App1.Android" android:theme="@style/MainTheme">
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3192508017252023~9595491677"/>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
这是 MainPage 的代码 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"
x:Class="App1.MainPage"
xmlns:ads="clr-namespace:App1.Controls">
<StackLayout BackgroundColor="White">
<RelativeLayout>
<Grid RowSpacing="0">
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="Auto"></RowDefinition>
</Grid.RowDefinitions>
</Grid>
<StackLayout Grid.Row="0">
<Label />
<Button />
</StackLayout>
</RelativeLayout>
<StackLayout HorizontalOptions="EndAndExpand">
<ads:Ad_control_view BackgroundColor="Red"
HorizontalOptions="EndAndExpand"
Grid.Row="1"
>
</ads:Ad_control_view>
</StackLayout>
</StackLayout>
这是 class AdmobControl
using System;
using System.Collections.Generic;
using System.Text;
using Xamarin.Forms;
namespace App3.Controls
{
public class AdmobControl :View
{
public static readonly BindableProperty AdUnitIdProperty = BindableProperty.Create(
nameof(AdUnitId),
typeof(string),
typeof(AdmobControl),
string.Empty);
public string AdUnitId
{
get => (string)GetValue(AdUnitIdProperty);
set => SetValue(AdUnitIdProperty, value);
}
}
}
这是Ad_control_view
using System;
using System.Collections.Generic;
using System.Text;
using Xamarin.Forms;
namespace App1.Controls
{
public class Ad_control_view:View
{
}
}
这是Ad_view_render
using Android.App;
using Android.Content;
using Android.Gms.Ads;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using App1.Controls;
using App1.Droid;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly:ExportRenderer(typeof(Ad_control_view),typeof(Ad_view_render))]
namespace App1.Droid
{
public class Ad_view_render:ViewRenderer<Ad_control_view,AdView>
{
public Ad_view_render(Context context):base(context)
{
}
string ad_unit_id = "ca-app-pub-3192508017252023/5820253414";
AdSize ad_size = AdSize.SmartBanner;
AdView ad_view;
private AdView Create_Ad_view()
{
if (ad_view != null)
return ad_view;
ad_view = new AdView(Context)
{
AdSize = ad_size,
AdUnitId = ad_unit_id
};
var ad_params = new LinearLayout.LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent);
ad_view.LayoutParameters = ad_params;
ad_view.LoadAd(new AdRequest.Builder().Build());
return ad_view;
}
protected override void OnElementChanged(ElementChangedEventArgs<Ad_control_view> e)
{
base.OnElementChanged(e);
if (Control==null&& e.NewElement!=null)
{
SetNativeControl(Create_Ad_view());
}
}
}
}
最后,这是警告信息
Severity Code Description Project File Line Suppression State Warning CS0618 'MobileAds.Initialize(Context, string)' is obsolete: 'deprecated' App1.Android C:\Users\Abo Ali\source\repos\App1\App1\App1.Android\MainActivity.cs 20 Active
使用最新版本的 AdMob,您将在不传递应用程序 ID 的情况下进行初始化(应用程序 ID 将从 AndroidManifest 中提取):
base.OnCreate(bundle);
MobileAds.Initialize(this);
从 Visual Studio Nuget 包的 Xamarin.GooglePlayServices.Ads.Lite 版本 119.1.0 开始,我会更准确地回答这个问题。
MobileAds.Initialize(AndroidContext, "APP_ID") 已弃用。
所以您所要做的就是删除或注释那行代码,然后将这行代码添加到您的 AndroidManifest.xml
<manifest>
<application>
<!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ADMOB_APP_ID"/>
</application>
</manifest>
此包之前的所有版本都需要 MainActivity 的 OnCreate 方法中的代码行 Class。
希望这个回答对您有所帮助!