Android开发-在Android应用里接入AdMob广告进行变现的实现

2023-11-19

前 言

前段时间,自己开发了一款个人的Android应用想上线,但是由于国内的应用商城对个人开发者不是很友好,即使应用已经申请了软件著作权了也不能上线的了,有些应用只能以企业的名义来上线不能以个人的名义来上线(如影视类、新闻资讯类的应用)。无奈之下自己科学上网花25美元注册一个Google开发者账号上线到Google Play商店上,由于政策的原因,Google Play商店里应用下载大部分都是海外用户,所以在Android里接入Google自家的AdMob广告联盟比较好一点。

AdMob广告联盟是Google为商家和开发者推出的一家广告投放和接入的平台,是专门为Android和IOS以及Web平台进行推送广告的平台。AdMob广告联盟也支持中国大陆地区的广告投放和推送,虽然Google的搜索已经退出了中国大陆,但是Google的广告业务在北京和上海还有办公室。和国内的腾讯广告联盟不同的是,该平台的Android端接入广告主要有四种广告类型,一是banner广告(横幅广告),二是插屏广告,三是原生广告,四是激励广告。这与国内腾讯广告联盟少了开屏广告,不过在开发者广告收益方面AdMob广告收益比腾讯广告联盟还要高,仿作弊方面也做的比较好,而且接入的API也比较简单。

AdMob的激励广告和国内其它的广告平台的积分墙有点类似,比较常见在游戏应用里,比如当用户看了一段10s的广告视频就奖励用户一个金币,或者在应用下载安装某个应用就有相应的积分奖励。

接入前的准备工作
  1. 科学上网(这个没得说,在国内的话只有科学上网才能访问的了AdMob官网);
  2. 有Google开发者账号,没有的话注册一个。P.S.如何注册Google开发者账号详情可以看这位大神写的这篇博客:https://www.jianshu.com/p/7c97aa9c5fb6 ;
  3. 应用已经上线到Google Play商店,没有上线的话应用无法关联AdMob创建广告的应用ID。P.S.如何把Android应用上线到Google Play商店详情可以看这位大神写的这篇博客:https://www.jianshu.com/p/e40e78a279b7 。
AdMob广告的配置

首先打开 AdMob广告联盟官网:https://apps.admob.com/ (这个网址在国内必须要科学上网才能访问的了)后使用Google开发者账号进行登录,登录成功后就填写一些个人的信息,比如银行卡收款信息、付款的币种以及个人平邮地址等。初次 登录AdMob是无法添加银行卡收款信息的,需要你的应用的广告收益超过10美元后Google那边会平邮一个快递给你确保你填写的个人地址是否是真实无误,快递里面有一个校验码,当你AdMob官网里面填写这个校验码后就可以添加银行卡收款信息。当你的应用的广告收益超过100美元后才能提现。

填写的个人信息完成后就可以创建应用了,创建应用关联可以选择Google Play和App Store两种途径进行关联,前者是Android应用,后者是IOS应用。创建应用且已经关联了应用后接着就创建广告单元,广告单元有横幅广告、插页式广告以及激励广告三种,暂时还没看到原生的单元广告,可能是个人的等级比较低没有权限创建。如下图。
在这里插入图片描述

创建单元广告后把应用ID和广告单元ID记住,后续广告API接入时需要在代码里用到。

AdMob广告的API的接入

以下的这个模块主要是直接摘抄自AdMob广告的接入文档,如果能科学上网的话可以直接访问:https://developers.google.com/admob/android/quick-start 该网址去看最新的接入文档,如果不能科学上网的话可以看以下精简版的摘抄文档。

导入移动广告 SDK

通过使用指向 Google Maven 代码库的 Gradle 依赖项,应用可以导入 Google 移动广告 SDK。要使用该代码库,您需要在应用的项目级 build.gradle 文件中对其进行引用。请打开该文件,并找到 allprojects 部分:

项目级 build.gradle 示例(节选)
allprojects {
    repositories {
        google()
        jcenter()
    }
}

如果上面的 google() 指令不存在,请添加该指令。
接下来,请打开您应用的应用级 build.gradle 文件,并找到“dependencies”部分。

应用级 build.gradle 示例(节选)
dependencies {
    ...
    implementation 'com.google.android.gms:play-services-ads:17.2.0'
}

请添加上面的implementation代码行,该代码会指示 Gradle 提取最新版本的移动广告 SDK。添加完该代码后,请保存文件并执行“Gradle sync”。

更新您的 AndroidManifest.xml

通过添加下面显示的 标记,即可将您的 AdMob 应用 ID 添加到您的应用的 AndroidManifest.xml 文件中。您可以在 AdMob 界面中找到您的应用 ID。对于 android:value,请插入 AdMob 应用 ID 并加上引号,如下所示。

<manifest>
    <application>
        <!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="YOUR_ADMOB_APP_ID"/>
    </application>
</manifest>

重要提示:自 Google 移动广告 SDK 17.0.0 版本开始,均须执行此步骤。如果未能添加此 代码,将会导致崩溃,并显示以下消息:“The Google Mobile Ads SDK was initialized incorrectly.”

初始化 MobileAds

加载广告之前,请先使用 AdMob 应用 ID 调用 MobileAds.initialize(),以便让应用初始化移动广告 SDK。此操作仅需执行一次,最好是在应用启动时执行。

警告:在调用 MobileAds.initialize() 时,移动广告 SDK 或中介合作伙伴 SDK 可能会预加载广告。如果您需要获得欧洲经济区 (EEA) 用户的同意,设置任何专门用于特定请求的标记(例如 tagForChildDirectedTreatment 或 tag_for_under_age_of_consent),或者在加载广告之前采取任何其他操作,请确保在初始化移动广告 SDK 之前先完成这些操作。

以下示例说明了如何在 Activity 中调用 initialize() 方法:

示例 MainActivity(节选)
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

要展示横幅广告,首先要将AdView放置到要展示广告的 Activity 或 Fragment 布局中。最简单的放置方法是将其添加到相应的 XML 布局文件中。在以下示例中,AdView位于 Activity 的底部:

  • main_activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        tools:context=".MainActivity">

        <TextView android:text="@string/hello_world"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <com.google.android.gms.ads.AdView
            xmlns:ads="http://schemas.android.com/apk/res-auto"
            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 - 将此属性设置为要使用的广告尺寸。如果您不想使用该常量定义的标准尺寸,可改为设置一个自定义尺寸。有关详情,请参阅下面的“横幅广告尺寸”部分。
  • ads:adUnitId - 将此属性设置为为您应用中展示广告的广告单元指定的唯一标识符。如果您要在不同的活动中展示横幅广告,则其中每个都需要一个广告单元。

另外,您也可以通过编程方式创建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() 方法加载广告:

  • MainActivity(节选)
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。例如:

<com.google.android.gms.ads.AdView
  xmlns:ads="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  ads:adSize="SMART_BANNER"
  ads:adUnitId="ca-app-pub-3940256099942544/6300978111">
</com.google.android.gms.ads.AdView>

要以编程方式制作智能横幅广告,请使用 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 来重新加载

您可以非常方便地使用 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());
        }

    });
}
...
一些最佳做法
  • 考虑插页式广告是否为适合您应用的恰当广告类型。
    在具有自然过渡点的应用中,插页式广告的效果最好。此类过渡点通常存在于应用内的任务结束时,例如分享完图片或完成一个游戏关卡时。用户希望可以在操作过程中休息一下,因此这时展示插页式广告不会影响用户体验。请务必考虑在应用流程的哪些时间点展示插页式广告,以及用户可能会以什么方式响应。
  • 务必在展示插页式广告时暂停操作。
    插页式广告类型多样,包括文字广告、图片广告和视频广告等。确保应用在展示插页式广告时,也会暂停使用某些资源,以便供广告使用,这一点十分重要。例如,当您发出展示插页式广告的调用后,请务必暂停应用产生的所有音频输出。您可以在 onAdClosed() 事件处理脚本中恢复声音播放,该处理脚本会在用户结束与广告的互动之后被调用。此外,请考虑在广告展示时暂停所有密集计算任务(例如游戏循环)。这将确保用户不会遇到图像无响应/响应慢或者视频卡顿的现象。
  • 留出充足的加载时间。
    确保在恰当的时间展示插页式广告十分重要,同样,确保用户无需等待广告加载也十分重要。在您打算调用 show() 前,请事先通过调用 loadAd() 加载广告,这可确保应用在广告展示时间到来前已将插页式广告完全加载就绪。
  • 不要向用户展示太多广告。
    虽然提高插页式广告在应用中的展示频率似乎是增加收入的绝佳方式,但这么做也会影响用户体验并降低点击率。确保用户不会频繁受到干扰,使其可以享受使用应用的过程。
激励广告的接入

所谓激励广告,指的是用户可以选择与之互动来换取应用内奖励的一种广告。

前提条件
  • Google 移动广告 SDK 17.2.0 或更高版本。
创建激励广告对象

激励广告由 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");
    }

}

构造函数需要以下参数:

  • 一个 Activity 上下文
  • 用于加载激励广告的广告单元 ID
务必用测试广告进行测试

在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。否则,可能会导致您的帐号被暂停。

对于 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 ————————

如果您觉得这篇博客写的比较好的话,赞赏一杯咖啡吧~~
在这里插入图片描述


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android开发-在Android应用里接入AdMob广告进行变现的实现 的相关文章

  • 通过数据绑定将字符串传递到包含的布局不起作用

    我正在尝试使用 Android 数据绑定功能将一个简单的字符串从我的主布局传递到布局 它编译得很好 但传递给包含的值实际上并未传递 即 它没有出现在我的布局中
  • Android 主机意图过滤器通配符

    是否可以在 android host 属性上使用通配符 就像是 android host site com android pathPattern android pathPrefix m android scheme http gt Or
  • Android中如何使用洪水填充算法?

    我是Android编程新手 最近尝试编写一个简单的应用程序 仅供练习 在这个中 我想在用户点击时为图像着色 但我不知道如何开始 我读过不同的主题 其中提到使用 洪水填充 算法 我在网上找到了它 但我不知道如何将它放入我的简单应用程序中 我找
  • 使用 Google Places Autocomplete API 的 REQUEST_DENIED 响应

    我正在开发 Android 应用程序 它使用谷歌的地点自动完成 API 当尝试点击以下网址时 我得到的答复如下 预测 状态 REQUEST DENIED 我从下面的链接获得了 API 密钥Google API 控制台 http code g
  • 应用程序实例是否始终在任何活动之前创建?

    在 Android 中 您可以通过扩展 Application 类并在 Manifest 中声明名称来提供您自己的 Application 类实现 我的问题是 这个实现是否总是在初始活动之前创建 或者活动可以在应用程序实例有时间创建之前启动
  • Android Studio:lambda 不起作用[重复]

    这个问题在这里已经有答案了 当尝试使用 lambda 表达式时 我遇到了一些 Gradle 构建错误 错误 41 100 错误 source 1 7 不支持 lambda 表达式 使用 source 8 或更高版本来启用 lambda 表达
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • 如何使用闹钟音量和 setAudioAttributes 来播放铃声?

    所以我正在尝试了解音频属性 这是我到目前为止所拥有的 alarm getSound will return a proper URI to pick a ringtone Ringtone tone RingtoneManager getR
  • React Native Android 发布 apk 是调试,而不是发布

    我有一个现有的 Android 应用程序 我已根据以下内容将 React Native v0 30 活动添加到项目中docs http facebook github io react native releases next docs i
  • 为什么按钮上的 maxWidth 不起作用以及如何解决它?

    我的布局上有两个按钮 在大屏幕设备 平板电脑 上我想限制它们的宽度 这样它们看起来就不会很荒谬 我希望使用 maxWidth 属性 但它显然在我的场景中没有任何作用 这是布局定义 按钮使用布局的整个宽度 忽略 maxWidth 中的任何值
  • Android-工具栏中的SearchView

    我只想在我的应用程序中添加 searchview 但我不想搜索任何东西 只是我想要用户输入的查询 到目前为止 我尝试了这段代码 但是当我运行我的应用程序时它崩溃了 Update 我尝试了这个 但即使我的应用程序崩溃了 main menu x
  • jar 中的 apklib 有什么优点?

    我正在关注这个问题 https stackoverflow com questions 6059502 whats the difference between apklib and jar files但它并没有完全回答我的问题 jar 中
  • android 中camera.setParameters 失败

    我已将相机功能包含在我的应用程序中 我还在市场上推出了该应用程序 我从一位用户那里收到一条错误消息 称他在打开相机时遇到错误 我已经在 2 1 的设备上测试了该应用程序 我从用户那里得到的错误是使用 Nexus One 它主要运行 2 2
  • ACCESS_BACKGROUND_LOCATION 不适用于低于 Q (29) 的 Android 版本

    我的应用程序面向 Android API 28 根据文档 https developer android com preview privacy location target android 10 我应该要求ACCESS BACKGROU
  • 使用嵌套的 hashmap 参数发送 volley 请求

    我正在使用 android volley 框架向我的服务器发送 jsonobject 请求 get 请求工作正常 现在我想发送一个带有请求参数的 post 请求 该请求参数是嵌套的 hashmap 我重写 getparams 方法 但它期望
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • Android 中的 Google Places API - 适用于个人用户的 API_KEY

    我已经浏览了与在 Android 应用程序中使用 Places API 相关的 Android 文档和其他博客 到处都建议使用 API KEY 来调用 REST 服务 API KEY 在整个项目 应用程序中都是相同的 每天的请求数限制为 1
  • 在状态栏下方显示DialogFragment内容

    我试图显示高度和宽度均具有 match parent 的 DialogFragment 但碰巧在顶部 DialogFragment 显示在 StatusBar 下方 DialogFragment 正在应用一些默认值来填充底部 右侧 左侧和顶
  • 具有矢量可绘制的 ImageView 的 Resources$NotFoundException

    我遇到了崩溃 Resources NotFoundException用于在活动创建时绘制的矢量 21 日前崩溃 安卓工作室2 1 支持库24 0 0 Gradle插件2 1 0 目标SDK 23 最小SDK 15 buildTools版本
  • 如何以编程方式创建活动转换?

    我想以编程方式创建一个动画 以从触摸屏点启动具有缩放效果的活动 接下来我模拟缩放输入效果

随机推荐

  • IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)

    来源 http suo im 5X5Rql 满满的都是干货 所有插件都是在 ctrl alt s 里的plugins 里进行搜索安装 1 CodeGlance 代码迷你缩放图插件 2 Codota 代码提示工具 扫描你的代码后 根据你的敲击
  • android检测新版本并下载安装的方法

    很多客户端程序都有检测是否有更新的功能 本文大体介绍了其实现过程 此功能模块也是开源中国客户端中的源码 个人感觉用到的安卓基础知识还是比较全面的 很适合初学者学习进阶 检查App更新 param context param isShowMs
  • Win10 64bit系统中VS2015与OpenCV3.2配置开发环境

    1 将OpenCV解压到D盘根目录 个人认为纯英文目录比较保险 2 VS2015建立控制台工程 设置为64位debug开发环境 3 配置工程属性 在可执行目录 executable directories 中 确认已包含opencv包里的b
  • VRTK4.0 学习Day3

    假装是第三天吧 我这里的情况是 勾选了这个支持之后 会将下方这个XR Plug in Managerment就下好了 我还打开了那个保龄球的那个项目 那里面的这个XR Plug in Managerment是没有的 也不要去导入 我导入之后
  • windows下搭建编译chromium的开发环境

    本篇为windows下搭建编译chromium的方法 mac篇 mac下搭建编译chromium的开发环境 二七 CSDN博客 linux篇 linux 搭建和编译 chromium 环境 二七 CSDN博客 注意 搭建部署chromium
  • js 将一维数组转成二维数组

    开发时遇上一个将一维数组转换成二维数据结构的要求 记录一下工具函数 说明 这是一个函数 直接复制到
  • 接口测试这么玩才明白

    接口测试作为当下提升测试效能的利器 逐步被大家所认同 但同时很多团队在落地接口自动化时 又会感觉效果不是很明显 投入了大量的时间 写了很多脚本 但是效果并不是很明显 其中有各种问题 结合某团队的现状 分享一些实践经验 仅供参考 引入接口测试
  • Java解析XML的四种方法详解

    XML现在已经成为一种通用的数据交换格式 它的平台无关性 语言无关性 系统无关性 给数据集成与交互带来了极大的方便 对于XML本身的语法知识与技术细节 需要阅读相关的技术文献 这里面包括的内容有DOM Document Object Mod
  • c语言下列编程段的错误,C语言编程题目(有错误)

    问题描述 C语言编程题目 有错误 输入精度e 用下列公式求cosx的近似值 精确到最后一项的绝对值小雨e 要求调用和定义函数funcos e x 求余弦函数的近似值 cosx x的0次方 0 x的2次方 2 x的4次方 4 x的6次方 6
  • 58同城 -- 前端一面

    面我的是一个小哥哥 面试体验挺好的 大概进行了35分钟左右 自我介绍 面试内容 为什么向做前端 怎么学习的前端 本人非科班哈 然后问我项目 直接问项目 没问笔试令我有点意外 问我印象最深的项目 印象最深的功能 遇到的难点 前端存储的区别 C
  • python格式化字符串 时间戳 转 UTC(2023-01-11T16:00:00Z)格式时间

    前言 公司前端的时间参数分为两类 一种是时间戳传参 另一种是 2023 01 11T16 00 00Z UTC 时间传参 有些脚本需要用到datatime datatime因此要整理一下相关方法 获取时间戳 my timestamp tim
  • mysql引擎机制_Mysql存储引擎以及锁机制

    一 常用命令 1 查看引擎 默认为InnoDB 查看mysql提供的存储引擎 show engienes 查看mysql当前默认的存储引擎 show variables like storage engine 查看某张表用了什么引擎 sho
  • 解决css中上下外边距(margin)在父元素中溢出的问题

    两个办法 给父元素添加overflow hidden 即可 给父元素添加透明边框border 1px solid transparent 给父元素添加伪元素 before after content display table 改变光标的颜
  • Unity Application.OpenURL Unity打开网页链接

    一般情况下 在电脑上使用Application OpenURL可以正常打开网页 但是如果网页以www开头 例如www baidu com 在电脑上可以正常打开 但是发布成apk后就没有反应了 此时应将Application OpenURL
  • 怎样管理计算机启动项,启动项管理,详细教您电脑开机启动项怎么设置

    电脑开机启动项 就是电脑开机的时候系统会在前台或者后台运行的程序 一般我们主要说的是windows系统的开机启动项 在Windows的配置文件也会加载一些自动运行的程序 那电脑开机启动项怎么设置 下面 小编给大家介绍设置电脑开机启动项的步骤
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • ESP32C3 移植ST7735 LVGL

    关于lvgl LVGL是一个C语言编写的免费的开源图形库 其提供了用于嵌入式GUI的各种元素 用户可以利用丰富的图形库资源 在消耗极低内存的情况下构建视觉效果丰富多彩的GUI 只需 64kB 闪存和 8kB RAM 就足以满足简单的用户界面
  • vue构建路由,报错Cannot read properties of undefined (reading ‘forEach‘)

    构建vue路由 这个foreach报错 意味着有一个进入循环的值为null 如果看了其他文章的标准还没有解决的话 建议加一个routes constantRoutes 即在定义router时手动加上一个routes属性 完整的代码 App
  • Linux 如何设置开机自启动脚本

    Linxu开机自启动脚本 一 CentOS系统和Redhat系统如下 1 修改 etc rc d rc local为 bin bash THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES It is
  • Android开发-在Android应用里接入AdMob广告进行变现的实现

    前 言 前段时间 自己开发了一款个人的Android应用想上线 但是由于国内的应用商城对个人开发者不是很友好 即使应用已经申请了软件著作权了也不能上线的了 有些应用只能以企业的名义来上线不能以个人的名义来上线 如影视类 新闻资讯类的应用 无