如何通过AdMob增加你Android APP的收入
Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)
在本教程中,你将学习如何集成 AdMob,这样你就可以通过写Android APP赚钱,谁不想要钱?Google的AdMob是市场上最大的移动广告平台。
通过Android APP有许多不同的赚钱方式,包括:付费下载,付费订阅,应用内购买和展示广告。 虽然你可以组合这些方式,但还是建议你选择一种方式。在本教程中,你将学到通过展示广告来增加收入。
你将创建的广告类型包括横幅广告,插页式广告和本地快递广告。 我会解释每种广告,并展示如何在你APP中实现它们。但在此之前,我们先来看看如何集成移动广告SDK并进行初始化。
创建一个Android Studio项目
在Android Studio中,创建一个名为MainActivity
的新项目 。
加入移动广告 SDK
要开始将AdMob集成到你的APP,你需要先将移动广告SDK添加到你APP module级的 build.gradle
文件中:
compile 'com.google.android.gms:play-services-ads:11.0.2'
如果你要将Firebase集成到APP中,那么你应该使用Firebase的SDK:
compile 'com.google.firebase:firebase-ads:11.0.2'
如果你需要Firebase的入门帮助,请查看Envato Tuts +上的一些Firebase教程:
添加SDK后确保你同步了该项目,同步是为了从网络获取数据。
初始化MobileAds
你需要先初始化MobileAds SDK,然后才能在Android APP上加载广告,因此请尽早进行。我们创建一个继承Application
的类,然后我们在onCreate()
方法中初始化MobileAds
SDK ,因为该方法在APP启动时仅被调用一次。
import com.google.android.gms.ads.MobileAds; import android.app.Application; public class App extends Application { @Override public void onCreate() { super.onCreate(); MobileAds.initialize(this, "ca-app-pub-3940256099942544/6300978111"); } }
MobileAds
类的静态方法initialize()
的第二个参数应该是你从AdMob申请的app ID。这里,我们使用Google提供的公开app ID进行演示。
修改清单文件
我们需要将创建的类添加到我们的AndroidManifest.xml文件中 。
<application android:name=".App"> </application>
而且,在这个文件中,请确保申请了INTERNET
权限以便能收到Google广告。
<!-- Include required permissions for Google Mobile Ads to run. --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
在下面的代码片段中,我们在AndroidManifest中添加了 AdActivity
。
<activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" />
AdActivty由SDK提供。在用户点击广告时触发横幅广告以供观看,而插页式广告也是用户点击后显示。
1.横幅广告
横幅广告遮住了当前可见屏幕的一部分。换句话说,你的APP和广告中的任何内容都会一起显示在屏幕上。 这样可以改善用户体验,因为用户可以在广告展示时继续使用你的APP,而不像插页式广告那样(只是挂起,我们很快就会遇到)。请注意,横幅广告可以是文字或图片。
我们来看看如何实现横幅广告。
在布局中添加横幅广告
AdView
是自定义的ViewGroup
,它包含了横幅广告,因此我们需要修改我们的activity_banner_ad.xml布局文件以包含此视图。
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.chikeandroid.tutsplus_admob.MainActivity"> <TextView android:text="Hello World" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <com.google.android.gms.ads.AdView android:id="@+id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" ads:adSize="BANNER" ads:adUnitId="ca-app-pub-3940256099942544/6300978111"> </com.google.android.gms.ads.AdView> </RelativeLayout>
我们可以使用属性ads:adSize
来调整AdView
大小,然后将其值设置为BANNER
。ads:adSize属性的其他值还有 LARGE_BANNER
,FULL_BANNER
和SMART_BANNER
等。
ads:adUnitId
AdView
属性设置为Google提供的示例广告单元。如果你想从广告中赚钱,你必须更新与你帐户相关联的广告单元!
广告单元ID唯一标识了广告展示位置,您可以在AdMob管理控制台中找到它。此ID将告诉AdMob你APP上显示的广告以及显示格式(图片,文字或视频)。
加载广告
为了显示广告,我们需要先请求,然后在AdView上显示,该AdView
是在BannerAdActivity
类中创建的。
import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdView; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class BannerAdActivity extends AppCompatActivity { private AdView mAdView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAdView = (AdView) findViewById(R.id.adView); AdRequest adRequest = new AdRequest.Builder() .addTestDevice(AdRequest.DEVICE_ID_EMULATOR) .build(); mAdView.loadAd(adRequest); } }
我们使用构建器创建了AdRequest实例来请求广告。然后,我们使用该addTestDevice()
方法,设备ID作为参数传入,以便设备接收测试广告,这个设备在我们的例子中是模拟器。 我们最后调用了AdView
的loadAd()
方法,然后在后台线程中加载广告(以免阻止UI /主线程)。
测试广告
现在,我们运行项目并查看结果。



从上面的屏幕截图,我们看到测试的横幅广告显示在视图的下方。现在可以点击广告与广告进行互动。
用AdListener监听广告事件
现在来看看在广告中观察到的事件或回调。下面是可用的事件:
-
onAdLoaded
():在检索广告时触发此方法 -
onAdOpened()
:打开广告时调用此方法。 -
onAdClosed()
:广告关闭触发此方法 -
onAdLeftApplication()
:当用户离开APP时调用此方法。 -
onAdFailedToLoad(int errorCode)
:当广告请求失败时触发此方法。该代码可以是ERROR_CODE_NETWORK_ERROR
,ERROR_CODE_INVALID_REQUEST
,ERROR_CODE_NO_FILL
,或ERROR_CODE_INTERNAL_ERROR
。
// ... @Override protected void onCreate(Bundle savedInstanceState) { // ... mAdView.setAdListener(new AdListener() { @Override public void onAdLoaded() { super.onAdLoaded(); Toast.makeText(MainActivity.this, "onAdLoaded()", Toast.LENGTH_SHORT).show(); } @Override public void onAdOpened() { super.onAdOpened(); Toast.makeText(MainActivity.this, "onAdOpened()", Toast.LENGTH_SHORT).show(); } @Override public void onAdClosed() { super.onAdClosed(); Toast.makeText(MainActivity.this, "onAdClosed()", Toast.LENGTH_SHORT).show(); } @Override public void onAdFailedToLoad(int i) { super.onAdFailedToLoad(i); Toast.makeText(MainActivity.this, "onAdFailedToLoad()", Toast.LENGTH_SHORT).show(); } @Override public void onAdLeftApplication() { super.onAdLeftApplication(); Toast.makeText(MainActivity.this, "onAdLeftApplication()", Toast.LENGTH_SHORT).show(); } }); } @Override public void onPause() { // This method should be called in the parent Activity's onPause() method. if (mAdView != null) { mAdView.pause(); } super.onPause(); } @Override public void onResume() { super.onResume(); // This method should be called in the parent Activity's onResume() method. if (mAdView != null) { mAdView.resume(); } } @Override public void onDestroy() { // This method should be called in the parent Activity's onDestroy() method. if (mAdView != null) { mAdView.destroy(); } super.onDestroy(); } }
添加监听器后,再次运行该项目并与广告进行交互。观看我们创建的toasts,调用事件,然后观察它。
2. 插页式广告
我们已经看到显示横幅广告是多么的容易。现在来看看如何创建插页式广告。
插页式广告是覆盖你APP整个屏幕的广告,没有APP其他视图的展示空间(我们稍后将会看到)。由于这会覆盖整个屏幕,并且如果网速较慢,还需要一些时间来加载广告,你需要注意不要刺激到用户。 为了避免这种情况,理想情况下,这些插页式广告应在APP的自然中断期间显示,例如游戏中的各个级别之间,而不是在用户处于任务的中间时显示。
import com.google.android.gms.ads.AdListener; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.InterstitialAd; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; public class InterstitialAdActivity extends AppCompatActivity { private InterstitialAd mInterstitialAd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loadInterstitialAd(); } private void loadInterstitialAd() { mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712"); mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdLoaded() { super.onAdLoaded(); Toast.makeText(MainActivity.this, "onAdLoaded()", Toast.LENGTH_SHORT).show(); if(mInterstitialAd.isLoaded()) { mInterstitialAd.show(); } } @Override public void onAdFailedToLoad(int i) { super.onAdFailedToLoad(i); Toast.makeText(MainActivity.this, "onAdFailedToLoad()", Toast.LENGTH_SHORT).show(); } }); AdRequest adRequest = new AdRequest.Builder().build(); mInterstitialAd.loadAd(adRequest); } }
在上面的代码中,我们声明并初始化了InterstitialAdActivity
类中的InterstitialAd
实例。我们将Google提供的广告单元id作为 setAdUnitId
()方法的参数。
就像我们在横幅广告中所做的一样,我们想要监听广告事件,所以我们设定一个监听器来触发重载方法onAdLoaded()
和 onAdFailedToLoad(int i)
。我们使用AdRequest
构建器创建AdRequest类的实例来请求广告 ,然后调用方法loadAd()
,将刚才创建的请求作为参数传递给该方法。 我们使用方法isLoaded()
来确定广告何时加载,然后调用方法show()
来显示广告。
你也可以增加AdListener
,就像在横幅广告中那样操作。
测试广告
现在,我们可以运行APP并查看结果。



在上面的屏幕截图中,你可以看到我们的测试插页式广告。
3. 原生广告快递(Native Ads Express)
Native Ads Express可让你(发布者)自定义广告的外观和风格,使其自适应你的APP。 此定制通过定义你AdMob帐户中定义自己的字体,颜色,大小等CSS模板来完成的。你不能更改图像,描述和标题,因为这些都是由广告客户设置的。
NativeExpressAdView
中的自定义广告可以在你的APP中显示。
将NativeExpressAdView
引入到你的布局中
下面我们在布局文件中添加NativeExpressAdView
(是一种ViewGroup
)。将android:layout_height
和 android:layout_width
属性设置为wrap_content
。 ads:adSize
属性设置为"320x300"
,我们会使用谷歌提供的NativeExpress广告单元ID(仅用于演示目的)。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ads="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.chikeandroid.tutsplus_admob.BannerAdActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Native Express Ad!" /> <com.google.android.gms.ads.NativeExpressAdView android:id="@+id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" ads:adSize="320x300" ads:adUnitId="ca-app-pub-3940256099942544/2177258514"> </com.google.android.gms.ads.NativeExpressAdView> </RelativeLayout>
加载广告
接下来,我们构建AdRequest
并开始加载要显示的广告。我们还要添加代码来响应Activity生命周期回调。你也可以添加一个 AdListener
,就像我们为横幅广告做的那样。
import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.NativeExpressAdView; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class NativeExpressAdActivity extends AppCompatActivity { NativeExpressAdView mNativeExpressAdView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_native_ad); mNativeExpressAdView = (NativeExpressAdView) findViewById(R.id.adView); AdRequest.Builder adRequestBuilder = new AdRequest.Builder(); adRequestBuilder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR); mNativeExpressAdView.loadAd(adRequestBuilder.build()); } @Override public void onResume() { super.onResume(); mNativeExpressAdView.resume(); } @Override public void onPause() { mNativeExpressAdView.pause(); super.onPause(); } @Override public void onDestroy() { mNativeExpressAdView.destroy(); super.onDestroy(); } }
测试广告
现在,你可以运行APP,就能查看你的Native Express广告了。



创建你自己的AdMob帐户
现在我们已经了解了不同类型的广告,你可以开始将其集成到您的APP中了。 要真正开始展示广告和赚钱,你还需要一个AdMob帐户,其中包含与广告客户相关联的真实广告单元ID。AdMob帐户只需访问AdMob网站即可注册!



结语
在本教程中,你学到了AdMob以及如何在Android中集成不同的AdMob广告类型,例如横幅广告,插页式广告和本地快递广告。
要了解Android上关于AdMob的更多信息,请参阅官方文档。与此同时,请查看关于Android APP开发的其他教程!