前段时间,自己开发了一款个人的Android应用想上线,但是由于国内的应用商城对个人开发者不是很友好,即使应用已经申请了软件著作权了也不能上线的了,有些应用只能以企业的名义来上线不能以个人的名义来上线(如影视类、新闻资讯类的应用)。无奈之下自己科学上网花25美元注册一个Google开发者账号上线到Google Play商店上,由于政策的原因,Google Play商店里应用下载大部分都是海外用户,所以在Android里接入Google自家的AdMob广告联盟比较好一点。
AdMob广告联盟是Google为商家和开发者推出的一家广告投放和接入的平台,是专门为Android和IOS以及Web平台进行推送广告的平台。AdMob广告联盟也支持中国大陆地区的广告投放和推送,虽然Google的搜索已经退出了中国大陆,但是Google的广告业务在北京和上海还有办公室。和国内的腾讯广告联盟不同的是,该平台的Android端接入广告主要有四种广告类型,一是banner广告(横幅广告),二是插屏广告,三是原生广告,四是激励广告。这与国内腾讯广告联盟少了开屏广告,不过在开发者广告收益方面AdMob广告收益比腾讯广告联盟还要高,仿作弊方面也做的比较好,而且接入的API也比较简单。
AdMob的激励广告和国内其它的广告平台的积分墙有点类似,比较常见在游戏应用里,比如当用户看了一段10s的广告视频就奖励用户一个金币,或者在应用下载安装某个应用就有相应的积分奖励。
首先打开 AdMob广告联盟官网:https://apps.admob.com/ (这个网址在国内必须要科学上网才能访问的了)后使用Google开发者账号进行登录,登录成功后就填写一些个人的信息,比如银行卡收款信息、付款的币种以及个人平邮地址等。初次 登录AdMob是无法添加银行卡收款信息的,需要你的应用的广告收益超过10美元后Google那边会平邮一个快递给你确保你填写的个人地址是否是真实无误,快递里面有一个校验码,当你AdMob官网里面填写这个校验码后就可以添加银行卡收款信息。当你的应用的广告收益超过100美元后才能提现。
填写的个人信息完成后就可以创建应用了,创建应用关联可以选择Google Play和App Store两种途径进行关联,前者是Android应用,后者是IOS应用。创建应用且已经关联了应用后接着就创建广告单元,广告单元有横幅广告、插页式广告以及激励广告三种,暂时还没看到原生的单元广告,可能是个人的等级比较低没有权限创建。如下图。
创建单元广告后把应用ID和广告单元ID记住,后续广告API接入时需要在代码里用到。
以下的这个模块主要是直接摘抄自AdMob广告的接入文档,如果能科学上网的话可以直接访问:https://developers.google.com/admob/android/quick-start 该网址去看最新的接入文档,如果不能科学上网的话可以看以下精简版的摘抄文档。
通过使用指向 Google Maven 代码库的 Gradle 依赖项,应用可以导入 Google 移动广告 SDK。要使用该代码库,您需要在应用的项目级 build.gradle 文件中对其进行引用。请打开该文件,并找到 allprojects 部分:
allprojects {
repositories {
google()
jcenter()
}
}
如果上面的 google() 指令不存在,请添加该指令。
接下来,请打开您应用的应用级 build.gradle 文件,并找到“dependencies”部分。
dependencies {
...
implementation 'com.google.android.gms:play-services-ads:17.2.0'
}
请添加上面的implementation代码行,该代码会指示 Gradle 提取最新版本的移动广告 SDK。添加完该代码后,请保存文件并执行“Gradle sync”。
通过添加下面显示的 标记,即可将您的 AdMob 应用 ID 添加到您的应用的 AndroidManifest.xml 文件中。您可以在 AdMob 界面中找到您的应用 ID。对于 android:value,请插入 AdMob 应用 ID 并加上引号,如下所示。
重要提示:自 Google 移动广告 SDK 17.0.0 版本开始,均须执行此步骤。如果未能添加此 代码,将会导致崩溃,并显示以下消息:“The Google Mobile Ads SDK was initialized incorrectly.”
加载广告之前,请先使用 AdMob 应用 ID 调用 MobileAds.initialize(),以便让应用初始化移动广告 SDK。此操作仅需执行一次,最好是在应用启动时执行。
警告:在调用 MobileAds.initialize() 时,移动广告 SDK 或中介合作伙伴 SDK 可能会预加载广告。如果您需要获得欧洲经济区 (EEA) 用户的同意,设置任何专门用于特定请求的标记(例如 tagForChildDirectedTreatment 或 tag_for_under_age_of_consent),或者在加载广告之前采取任何其他操作,请确保在初始化移动广告 SDK 之前先完成这些操作。
以下示例说明了如何在 Activity 中调用 initialize() 方法:
import com.google.android.gms.ads.MobileAds;
public class MainActivity extends AppCompatActivity {
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Sample AdMob app ID: ca-app-pub-3940256099942544~3347511713
MobileAds.initialize(this, "YOUR_ADMOB_APP_ID");
}
...
}
横幅广告是在应用布局中占据一处位置的矩形图片或文字广告。用户与应用互动时,这类广告会停留在屏幕上,并且可在一段时间后自动刷新。如果您刚开始接触移动广告,建议从横幅广告着手。
导入 Google 移动广告 SDK(可以只导入其自身,也可以将其作为 Firebase 的一部分加以导入)。
要展示横幅广告,首先要将AdView放置到要展示广告的 Activity 或 Fragment 布局中。最简单的放置方法是将其添加到相应的 XML 布局文件中。在以下示例中,AdView位于 Activity 的底部:
请注意设置以下必需属性:
另外,您也可以通过编程方式创建AdView:
AdView adView = new AdView(this);
adView.setAdSize(AdSize.BANNER);
adView.setAdUnitId("ca-app-pub-3940256099942544/6300978111");
// TODO: Add adView to your view hierarchy.
警告:请确保以相同的方式设置广告尺寸和广告单元 ID(即都采用 XML 格式或都以编程方式设置)。
在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。否则,可能会导致您的帐号被暂停。
最简便的测试广告加载方法就是使用以下 Android 横幅广告的专用测试广告单元 ID:ca-app-pub-3940256099942544/6300978111
该测试广告单元 ID 已经过专门配置,可为每个请求返回测试广告,您可以在自己应用的编码、测试和调试过程中随意使用该测试广告单元 ID。只需确保您会在发布应用前用自己的广告单元 ID 替换该测试广告单元 ID 即可。
注意:请在主线程中进行对移动广告 SDK 的所有调用。
AdView放置好后,下一步是加载广告。可使用AdView类中的 loadAd() 方法完成加载。这需要AdRequest参数,该参数包含有关单个广告请求的运行时信息(如定位信息)。
以下示例显示了如何通过 Activity 的 onCreate() 方法加载广告:
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
public class MainActivity extends AppCompatActivity {
private AdView mAdView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MobileAds.initialize(this,
"ca-app-pub-3940256099942544~3347511713");
mAdView = findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
}
}
注意:如果您的广告加载失败,只要您已将广告单元配置为刷新,便无需明确请求再次加载;Google 移动广告 SDK 会遵循您在AdMob界面中指定的任何刷新频率。如果您尚未启用刷新,则需要发出新的请求。
大功告成!您的应用现已可以开始展示横幅广告了。
要进一步自定义您的广告行为,您可以在广告生命周期内加入许多事件,如加载、打开、关闭等等。您可以通过 AdListener 类监听这些事件。
要将 AdListener 用于AdView,只需调用 setAdListener() 方法即可:
mAdView.setAdListener(new AdListener() {
@Override
public void onAdLoaded() {
// Code to be executed when an ad finishes loading.
}
@Override
public void onAdFailedToLoad(int errorCode) {
// Code to be executed when an ad request fails.
}
@Override
public void onAdOpened() {
// Code to be executed when an ad opens an overlay that
// covers the screen.
}
@Override
public void onAdClicked() {
// Code to be executed when the user clicks on an ad.
}
@Override
public void onAdLeftApplication() {
// Code to be executed when the user has left the app.
}
@Override
public void onAdClosed() {
// Code to be executed when the user is about to return
// to the app after tapping on an ad.
}
});
AdListener 中每种可替换的方法均对应广告生命周期内的一个事件。
注意:横幅广告容器的尺寸必须至少与横幅广告一样大。如果您的容器留有内边距,将会有效减小容器大小。如果容器无法容纳横幅广告,则横幅广告不会展示,并且您的日志中会显示以下警告:
W/Ads: Not enough space to show ad. Needs 320x50 dp, but only has 288x495 dp.
下表列出了标准横幅尺寸。
要定义自定义横幅广告尺寸,请设置所需的 AdSize,如下所示:
AdSize adSize = new AdSize(300, 50);
智能横幅广告
作为一种广告单元,智能横幅可在任何屏幕尺寸、任何屏幕方向的各种设备上展示与屏幕等宽的横幅广告。智能横幅广告可以检测设备处于当前屏幕方向时的宽度,并据此创建与之等宽的广告视图。
智能横幅可实现三种广告高度:
通常情况下,在手机上,当屏幕为纵向时,智能横幅广告高度为 50dp;当屏幕为横向时,广告高度为 32dp。在平板电脑上,不论屏幕是纵向还是横向,广告高度通常均为 90 dp。
当图片广告不足以占据所分配的整个空间时,系统会居中放置图片,然后填充两侧剩余的空间。
要在 XML 中使用智能横幅广告,请为广告尺寸指定常量 SMART_BANNER,并将 AdView 的宽度设置为 match_parent。例如:
要以编程方式制作智能横幅广告,请使用 AdSize.SMART_BANNER 作为广告尺寸:
AdView adView = new AdView(this);
adView.setAdSize(AdSize.SMART_BANNER);
插页式广告是全屏广告,它会覆盖其托管应用的整个界面。这些广告通常会在应用流程的自然过渡点(例如活动之间或游戏关卡之间的暂停时段)展示。当应用展示插页式广告时,用户可以选择点按广告,访问其目标网址,也可以将其关闭,返回应用。
导入 Google 移动广告 SDK(可以只导入其自身,也可以将其作为 Firebase 的一部分加以导入)。
插页式广告由InterstitialAd对象来请求和展示。第一步是将InterstitialAd实例化并设置其广告单元 ID。这可在 Activity 的 onCreate() 方法中完成:
import com.google.android.gms.ads.InterstitialAd;
public class MainActivity extends Activity {
private InterstitialAd mInterstitialAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MobileAds.initialize(this,
"ca-app-pub-3940256099942544~3347511713");
mInterstitialAd = new InterstitialAd(this);
mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
}
}
在 Activity 的整个生命周期内,只需使用一个InterstitialAd对象,即可请求并展示多个插页式广告,因此该对象只需构建一次。
在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。否则,可能会导致您的帐号被暂停。
对于 Android 插页式广告,加载测试广告最简便的方法就是使用下面的专用测试广告单元 ID:ca-app-pub-3940256099942544/1033173712
该测试广告单元 ID 已经过专门配置,可为每个请求返回测试广告,您可以在自己应用的编码、测试和调试过程中随意使用该测试广告单元 ID。只需确保您会在发布应用前用自己的广告单元 ID 替换该测试广告单元 ID 即可。
注意:请在主线程中进行对移动广告 SDK 的所有调用。
要加载插页式广告,请调用InterstitialAd对象的 loadAd() 方法。此方法会接受AdRequest对象,将其作为自己的单个参数:
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;
public class MainActivity extends Activity {
private InterstitialAd mInterstitialAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MobileAds.initialize(this,
"ca-app-pub-3940256099942544~3347511713");
mInterstitialAd = new InterstitialAd(this);
mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
mInterstitialAd.loadAd(new AdRequest.Builder().build());
}
}
插页式广告应在应用流程的自然停顿期间(例如,在游戏的不同关卡之间或者在用户完成一项任务之后)展示。要展示插页式广告,请使用 isLoaded() 方法验证广告是否已完成加载,然后再调用 show()。上一个代码示例中的插页式广告可以在按钮的 OnClickListener 中展示,如下所示:
mMyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
} else {
Log.d("TAG", "The interstitial wasn't loaded yet.");
}
}
});
要进一步自定义您的广告行为,您可以在广告生命周期内加入许多事件,如加载、打开、关闭等等。您可以通过 AdListener 类监听这些事件。
要将 AdListener 用于InterstitialAd对象,只需调用 setAdListener() 方法:
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdLoaded() {
// Code to be executed when an ad finishes loading.
}
@Override
public void onAdFailedToLoad(int errorCode) {
// Code to be executed when an ad request fails.
}
@Override
public void onAdOpened() {
// Code to be executed when the ad is displayed.
}
@Override
public void onAdClicked() {
// Code to be executed when the user clicks on an ad.
}
@Override
public void onAdLeftApplication() {
// Code to be executed when the user has left the app.
}
@Override
public void onAdClosed() {
// Code to be executed when the interstitial ad is closed.
}
});
AdListener 中每种可替换的方法均对应广告生命周期内的一个事件。
您可以非常方便地使用 AdListener 类的 onAdClosed() 方法,在展示完上一个插页式广告后加载新的插页式广告:
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MobileAds.initialize(this,
"ca-app-pub-3940256099942544~3347511713");
mInterstitialAd = new InterstitialAd(this);
mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
mInterstitialAd.loadAd(new AdRequest.Builder().build());
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdClosed() {
// Load the next interstitial.
mInterstitialAd.loadAd(new AdRequest.Builder().build());
}
});
}
...
所谓激励广告,指的是用户可以选择与之互动来换取应用内奖励的一种广告。
激励广告由 RewardedAd 对象请求和展示。第一步是将 RewardedAd 实例化。这可在以下代码段中 Activity 的 onCreate() 方法中完成:
import com.google.android.gms.ads.rewarded.RewardedAd;
public class MainActivity extends Activity {
private RewardedAd rewardedAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
rewardedAd = new RewardedAd(this,
"ca-app-pub-3940256099942544/5224354917");
}
}
构造函数需要以下参数:
在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。否则,可能会导致您的帐号被暂停。
对于 Android 激励广告,加载测试广告最简便的方法就是使用下面的专用测试广告单元 ID:ca-app-pub-3940256099942544/5224354917
该测试广告单元 ID 已经过专门配置,可为每个请求返回测试广告,您可以在自己应用的编码、测试和调试过程中随意使用该测试广告单元 ID。只需确保您会在发布应用前用自己的广告单元 ID 替换该测试广告单元 ID 即可。
注意:请在主线程中进行对移动广告 SDK 的所有调用。
要加载激励广告,请调用 RewardedAd 对象的 loadAd() 方法。此方法需要将AdRequest和 RewardedAdLoadCallback 的实例作为参数。
import com.google.android.gms.ads.rewarded.RewardedAd;
public class MainActivity extends Activity {
private RewardedAd rewardedAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
rewardedAd = new RewardedAd(this,
"ca-app-pub-3940256099942544/5224354917");
RewardedAdLoadCallback adLoadCallback = new RewardedAdLoadCallback() {
@Override
public void onRewardedAdLoaded() {
// Ad successfully loaded.
}
@Override
public void onRewardedAdFailedToLoad(int errorCode) {
// Ad failed to load.
}
};
rewardedAd.loadAd(new AdRequest.Builder().build(), adLoadCallback);
}
}
RewardedAdLoadCallback 的 onRewardedAdLoaded() 和 onRewardedAdFailedToLoad() 方法提供的是广告加载操作的结果。
警告:强烈建议您不要尝试使用 onRewardedAdFailedToLoad() 方法加载新广告。如果您必须使用 onRewardedAdFailedToLoad() 加载广告,请务必限制广告加载重试次数,以免在网络连接受限等情况下广告请求连续失败。
在向用户展示激励广告之前,必须为用户提供明确的选项,让用户可以自行选择是否通过观看激励广告内容来换取奖励。激励广告必须始终是一项可由用户自行选择的体验。
要展示 RewardedAd,请使用 isLoaded() 方法来验证广告已加载完成,然后调用 show()。show() 方法需要将 Activity 和 RewardedAdCallback 实例作为参数。Activity 实例应该是在其中展示激励广告的活动。
上一个代码示例中的激励广告可以在按钮的 OnClickListener 中展示,如下所示:
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (rewardedAd.isLoaded()) {
Activity activityContext = ...;
RewardedAdCallback adCallback = new RewardedAdCallback() {
public void onRewardedAdOpened() {
// Ad opened.
}
public void onRewardedAdClosed() {
// Ad closed.
}
public void onUserEarnedReward(@NonNull RewardItem reward) {
// User earned reward.
}
public void onRewardedAdFailedToShow(int errorCode) {
// Ad failed to display
}
};
rewardedAd.show(activityContext, adCallback);
} else {
Log.d("TAG", "The rewarded ad wasn't loaded yet.");
}
}
});
提供给 show() 方法的 RewardedAdCallback 用于接收激励广告事件的通知。RewardedAdCallback 中每个可替换的方法均对应激励广告生命周期内的一个事件。例如,如果要向用户提供他们应获得的奖励,则非常适合使用 onUserEarnedReward() 方法。下面提供了有关每个广告事件方法的其他详细信息。
使用 RewardedAdCallback 预加载下一个激励广告
RewardedAd 是一次性对象。这意味着,在展示激励广告后,就不能再用该对象加载另一个广告了。要请求另一个激励广告,您需要创建一个新的 RewardedAd 对象。
最佳做法是在 RewardedAdCallback 上的 onRewardedAdClosed() 方法中加载另一个激励广告,以便在上一个激励广告关闭后,立即开始加载下一个激励广告:
public RewardedAd createAndLoadRewardedAd() {
RewardedAd rewardedAd = new RewardedAd(this,
"ca-app-pub-3940256099942544/5224354917");
RewardedAdLoadCallback adLoadCallback = new RewardedAdLoadCallback() {
@Override
public void onRewardedAdLoaded() {
// Ad successfully loaded.
}
@Override
public void onRewardedAdFailedToLoad(int errorCode) {
// Ad failed to load.
}
};
rewardedAd.loadAd(new AdRequest.Builder().build(), adLoadCallback);
return rewardedAd;
}
@Override
public void onRewardedAdClosed() {
this.rewardedAd = createAndLoadRewardedAd();
}
要加载多个激励广告,请针对您要加载的每个广告,按照创建激励广告对象和加载广告部分中所述的步骤操作。下面的代码段展示了如何为两个不同的广告展示位置加载两个激励广告。
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.rewarded.RewardedAd;
public class MainActivity extends Activity {
private RewardedAd gameOverRewardedAd;
private RewardedAd extraCoinsRewardedAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
gameOverRewardedAd = createAndLoadRewardedAd(
"ca-app-pub-3940256099942544/5224354917");
extraCoinsRewardedAd = createAndLoadRewardedAd(
"ca-app-pub-3940256099942544/5224354917");
}
public RewardedAd createAndLoadRewardedAd(String adUnitId) {
RewardedAd rewardedAd = new RewardedAd(this, adUnitId);
RewardedAdLoadCallback adLoadCallback = new RewardedAdLoadCallback() {
@Override
public void onRewardedAdLoaded() {
// Ad successfully loaded.
}
@Override
public void onRewardedAdFailedToLoad(int errorCode) {
// Ad failed to load.
}
};
rewardedAd.loadAd(new AdRequest.Builder().build(), adLoadCallback);
return rewardedAd;
}
}
以上就是AdMob广告横幅广告、插屏广告以及激励广告在Android项目里的接入方式,接入完成后上线后就可以在AdMob平台查看应用广告最新的收益情况。如下图。
一般在一个Android应用里的AdMob单元广告收益由高到低的排序是激励广告、插屏广告、横幅广告,所以要善于优化广告位的展示,比如在应用里有些模块需要看10s的激励视频才能使用该模块,这样每天的收益才比较高一点。不过一个应用想要变现盈利单单靠广告是不行的,因为广告本身就收益比较低,建议在应用里加入内购会员制和接入广告的方式,也就是说办理VIP的用户可以免除广告,非VIP的用户可以通过展示广告来进行收益。
———————— The end ————————
如果您觉得这篇博客写的比较好的话,赞赏一杯咖啡吧~~