【はじめてのAndroidアプリ開発】インタースティシャル広告を使ってみよう


【はじめてのAndroidアプリ開発】インタースティシャル広告を使ってみよう

Androidのアプリ開発をはじめようと考えている方、もしくははじめたばかりの方向けにお届けしている 【はじめてのAndroidアプリ開発】 シリーズ。 今回は 『インタースティシャル広告』の使い方をご紹介します。

インタースティシャル広告とは、アプリやWebサイトにアクセスした際にポップアップで画面全体に表示される広告のことです。

アプリの収益最大化を考えている方にとって、インタースティシャル広告は必須項目ですよね。

★本稿はこんな方に役立ちます★

  • Android アプリ開発初心者
  • アプリの収益化を考えている方
  • インタースティシャル広告を検討されている方
  • クイズアプリを考えている方

★開発環境★

・ Android Studio 3.4
・ Java
・ エミュレーター Android 9 (Pie)
・ インタースティシャル広告(AdMob)
目次
  1. インタースティシャル広告
  2. インタースティシャル広告とは
  3. インタースティシャル広告のメリット
  4. インタースティシャル広告が使われている例
  5. インタースティシャル広告を利用できるプロバイダー
  6. インタースティシャル広告を使ってみよう
  7. インタースティシャル広告の教材
  8. ベースとなるクイズアプリ
  9. インタースティシャル広告を使う準備
  10. インタースティシャル広告のセットアップ
  11. インタースティシャル広告の注意事項
  12. まとめ

インタースティシャル広告

インタースティシャル広告とは

画像クリックで拡大

インタースティシャルInterstitial広告、日本語に訳すとすきま・・・広告。インタースティシャル広告は、ウェブページやアプリで画面を移動する時に、画面全体に表示される広告手法で、 アプリの収益を支える代表的なテクニックの一つ。

バナー広告に比べると広告面積が大きいため、情報量が多く、思わずユーザーはタップ、となりやすい広告設計です。皆様も一度は、画面全体に表示される広告をタップしたことありませんか?

広告を表示させる流れとしては、広告表示させたい画面遷移のポイントに広告プログラムをセットすることでインタースティシャル広告を表示することが可能となります。

例えば上図の例でいえば、 ゲームオーバーになって再びゲームを再開する前にインタースティシャル広告を表示する設定。 ゲームやアプリ内作業の節目にインタースティシャル広告を入れると、ユーザーの使用感を損なうことなく自然な形で広告を扱うことが可能。上記以外の広告を入れる代表的なタイミングとしては、以下のようなケースが考えられるでしょう。

  • ゲーム・リトライ
  • 続きを見る
  • ヒントを見る
  • 答えを見る
  • ダウンロード

上記のタイミングでインタースティシャル広告を入れると、ユーザーは「次の作業をしたい」というモチベーションがあるため、嫌われにくい広告表示となりそうです。

  • 応募完了
  • 保存完了
  • 送信完了

このタイミングでインタースティシャル広告を入れた場合、ユーザーは「入力内容を確認したい」というモチベーションがありますので、 ユーザーにとっては負担の少ない広告となりそう。

インタースティシャル広告を入れるタイミングは、実際にいくつかのアプリをインストールして、自分でアプリを使ってみて表示内容を確認してみるのが一番だと思います。

インタースティシャル広告のメリット

バナー広告、動画リワード広告といくつかの広告手法がある中で、インタースティシャル広告をあえて利用するメリットをまとめておきます。

高いCPM

広告手法 CPM
バナー $ 0.45
オリジナル $ 3
インタースティシャル $ 9
動画リワード $ 14

参考データ

IT系の広告コンサルティングを手掛ける アビシェークさんのまとめによると、 インタースティシャル広告は動画リワード広告に次ぐ 2番目に高い CPM と言われています。

CPM ・・・ 広告 1000回あたりの報酬額

画面遷移(画面移動)の伴うアプリであれば 、インタースティシャル広告がアプリの収益最大化に寄与してくれるかもしれませんね。

プレイ画面を損なわない広告

image

left img: App/ Count Timer ~ Simple Counter ~

バナー広告や差込形のネイティブ広告に比べるとインタースティシャル広告は、画面遷移のタイミングで表示されますので、アプリのプレイ画面を損なうことなく広告表示することが可能。

例えばゲーム等で、画面にたくさん機能やテキストを表示したい、しかし広告枠も設けたい、そうした場面でインタースティシャル広告は役立ってくるでしょう。

広告の強いインパクト

image

img: App/ Color Road

画面遷移の際にいきなり画面全体に広告が表示されますので、「おっ!?」とユーザーの興味を引き、そしてたくさんの文字や画像を見せて更に興味を引き、その結果タップ、という傾向に。またアプリ「Color Road」 のように使用中のアプリと似たアニメーション画像が表示されると、ユーザーは思わずゲームの続きと思って広告をタップ。この結果インタースティシャル広告は、他の広告に比べて、 CPM が高い傾向になっていると考えられますね。

インタースティシャル広告が使われている例

image

img: Android App 駐車場の王

DrawShow では、作成中の画面からメニュー画面に戻る際にインタースティシャル広告。その他のものはゲームをリトライする際にインタースティシャル広告が表示。バナー広告や動画リワード広告との組み合わせ方も参考になるアプリ達です。また横画面専用の「駐車場の王」では、画面を 2カラムにし、左にインタースティシャル広告、右にメニューと工夫した表示方法も参考になります。

インタースティシャル広告を利用できるプロバイダー

image

  • AdMob
  • i-mobile
  • InMobi
  • STARTAPP
  • Appnext
  • App Samurai

「広告」というと Google の AdMob を思い浮かべる方が多いと思いますが、その他インタースティシャル広告を提供しているプロバイダーを検索してみるとたくさんあります。

サービスプロバイダーによって広告内容やクリック単価、エリア力などに違いが。アプリ開発初心者として押さえておきたいポイントとしては、SDK の導入のしやすさ、それから情報量でしょう。いくら魅力的なプロバイダーであっても導入できなかったり、導入後バグが生じるようでは収益に悪影響を及ぼします。その点やはり AdMob は強い。

アプリへの導入手順やサンプルの量、それから広告を実装した後の統計情報なら全体的にバランスが取れている AdMob がいいですね。

今回は AdMob を使って、アプリ内にインタースティシャル広告を表示させる方法をご紹介していきます。

インタースティシャル広告を使ってみよう

以下の開発環境で、インタースティシャル広告をアプリにセットする手順をご紹介していきます。

【開発環境】

  • Android Studio
  • AdMob
  • クイズアプリ内にインタースティシャル広告をセット

インタースティシャル広告の教材

image

img: GitHub/ Google Sample

AdMob のインタースティシャル広告の設定手順は、Google 公式ページにも紹介されています。詳しく書かれていますが、初めてインタースティシャル広告を使う方にとってはチョット不安ですよね。

そんな時は一から広告設定を行っていくのではなく、既に広告表示がセットされているプログラムを引用して、とりあえず自分でインタースティシャル広告を表示させる、という方法が分かりやすいかもしれません。

プログラムの例については、GitHub で公開されているインタースティシャル広告のが参考になると思います。プロジェクトをダウンロードして一度 Android Studio で起動し、様子を確認してみましょう。

アプリの流れとしては、 startGame()されると広告が読み込まれ(loadAd())、 retryボタンをタップすると広告表示メソッド showInterstitial() がロード、そしてインタースティシャル広告の表示、という流れ。 各工程を細かくメソッドで分けているため少しわかりにくいプログラムとなっています。

次は公式ドキュメントに沿って、クイズアプリにインタースティシャル広告を設定する方法をご紹介していきます。

ベースとなるクイズアプリ

画像クリックで拡大

インタースティシャル広告は、バナー広告と違って画面遷移(画面移動)の伴うアプリが事前に必要。今回はクイズアプリをベースに、 クイズをリトライする際に広告表示できるよう設定していきたいと思います。

ベースアプリ: クイズアプリ

画像クリックで拡大

上図のようにクイズ終了後、「もう1回やる」を 選択した場合にインタースティシャル広告を表示。

インタースティシャル広告を使う準備

画像クリックで拡大

アプリにインタースティシャル広告を導入する際は、まずは AdMob のセットアップが必要となってきます。公式チュートリアルに従って、必要な SDK 等を設定。

画像クリックで拡大

【build.gradle(アプリ)】

implementation 'com.google.android.gms:play-services-ads:17.2.0'
編集後のbuild.gradle(アプリレベル)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.oshimamasara.myinterstitialdemo"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.google.android.gms:play-services-ads:17.2.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test🏃1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

build.gradle にコードを追加した後は、 SYNC NOW しておきましょう。

次は AndroidManifest.xml の編集。

画像クリックで拡大

<!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
<meta-data
   android:name="com.google.android.gms.ads.APPLICATION_ID"
   android:value="ca-app-pub-3940256099942544~3347511713"/>
編集後の AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.oshimamasara.myinterstitialdemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

    </application>

</manifest>

インタースティシャル広告のセットアップ

image

公式リファレンスに従って、クイズアプリにインタースティシャル広告をセットしていきたいと思います。

画像クリックで拡大

編集後の MainActivity

package com.oshimamasara.myinterstitialdemo;

import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.ads.InterstitialAd;
import com.google.android.gms.ads.MobileAds;

import java.util.Random;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button btn_one, btn_two, btn_three;
    TextView tv_question;

    private Question question = new Question();

    private String answer;
    private int questionLength = question.questions.length;
    private InterstitialAd mInterstitialAd;

    Random random;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("TAG", "★onCreate");
        random = new Random();

        btn_one = (Button)findViewById(R.id.btn_one);
        btn_one.setOnClickListener(this);
        btn_two = (Button)findViewById(R.id.btn_two);
        btn_two.setOnClickListener(this);
        btn_three = (Button)findViewById(R.id.btn_three);
        btn_three.setOnClickListener(this);

        tv_question = (TextView)findViewById(R.id.tv_question);

        MobileAds.initialize(this,
                "ca-app-pub-3940256099942544~3347511713");

        mInterstitialAd = new InterstitialAd(this);
        mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");

        NextQuestion(random.nextInt(questionLength));
        Log.d("TAG", "★QUIZ START");
    }

    @Override
    public void onClick(View v) {
        Log.d("TAG", "★onClick()");
        switch (v.getId()){
            case R.id.btn_one:
                if(btn_one.getText() == answer){
                    Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                    NextQuestion(random.nextInt(questionLength));
                }else{
                    GameOver();
                }
                break;

            case R.id.btn_two:
                if(btn_two.getText() == answer){
                    Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                    NextQuestion(random.nextInt(questionLength));
                }else{
                    GameOver();
                }
                break;

            case R.id.btn_three:
                if(btn_three.getText() == answer){
                    Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                    NextQuestion(random.nextInt(questionLength));
                }else{
                    GameOver();
                }
                break;
        }
    }

    private void GameOver(){
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
        alertDialogBuilder
                .setMessage("不正解\uD83D\uDE2D")
                .setCancelable(false)
                .setPositiveButton("もう一回やる", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startActivity(new Intent(getApplicationContext(), MainActivity.class));
                        // 広告
                    }
                })
                .setNegativeButton("アプリを閉じる", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        System.exit(0);
                    }
                });
        alertDialogBuilder.show();
    }

    private void NextQuestion(int num){
        tv_question.setText(question.getQuestion(num));
        btn_one.setText(question.getchoice1(num));
        btn_two.setText(question.getchoice2(num));
        btn_three.setText(question.getchoice3(num));
        answer = question.getCorrectAnswer(num);
    }
}

サンプルコードをクイズアプリにコピペしていきます。 ここでの作業はアプリでインタースティシャル広告を使うための準備プログラム。 インタースティシャル広告の機能が記録されているクラス: InterstitialAd をインスタンス化し、利用できるようにセット。 そして45 行目の部分では、 広告を識別するためのユニット ID() を読み込み。

画像クリックで拡大

編集後の MainActivity

package com.oshimamasara.myinterstitialdemo;

import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.ads.InterstitialAd;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.AdRequest;

import java.util.Random;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
   Button btn_one, btn_two, btn_three;
   TextView tv_question;

   private Question question = new Question();

   private String answer;
   private int questionLength = question.questions.length;
   private InterstitialAd mInterstitialAd;

   Random random;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       Log.d("TAG", "★onCreate");
       random = new Random();

       btn_one = (Button)findViewById(R.id.btn_one);
       btn_one.setOnClickListener(this);
       btn_two = (Button)findViewById(R.id.btn_two);
       btn_two.setOnClickListener(this);
       btn_three = (Button)findViewById(R.id.btn_three);
       btn_three.setOnClickListener(this);

       tv_question = (TextView)findViewById(R.id.tv_question);

       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());  //広告読み込み

       NextQuestion(random.nextInt(questionLength));
       Log.d("TAG", "★QUIZ START");
   }

   @Override
   public void onClick(View v) {
       Log.d("TAG", "★onClick()");
       switch (v.getId()){
           case R.id.btn_one:
               if(btn_one.getText() == answer){
                   Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                   NextQuestion(random.nextInt(questionLength));
               }else{
                   GameOver();
               }
               break;

           case R.id.btn_two:
               if(btn_two.getText() == answer){
                   Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                   NextQuestion(random.nextInt(questionLength));
               }else{
                   GameOver();
               }
               break;

           case R.id.btn_three:
               if(btn_three.getText() == answer){
                   Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                   NextQuestion(random.nextInt(questionLength));
               }else{
                   GameOver();
               }
               break;
       }
   }

   private void GameOver(){
       AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
       alertDialogBuilder
               .setMessage("不正解\uD83D\uDE2D")
               .setCancelable(false)
               .setPositiveButton("もう一回やる", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {
                       startActivity(new Intent(getApplicationContext(), MainActivity.class));
                       // 広告
                   }
               })
               .setNegativeButton("アプリを閉じる", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {
                       System.exit(0);
                   }
               });
       alertDialogBuilder.show();
   }

   private void NextQuestion(int num){
       tv_question.setText(question.getQuestion(num));
       btn_one.setText(question.getchoice1(num));
       btn_two.setText(question.getchoice2(num));
       btn_three.setText(question.getchoice3(num));
       answer = question.getCorrectAnswer(num);
   }
}

こちらは広告表示するために必要な「事前広告読み込み」プログラム。 この事前読み込みを行うことで、スムーズな広告表示を実現しています。 またプログラムを組んでいて「あれ広告表示されない」 と思った時は、 loadAd() が読み込まれていないケースが多いので、注意しておきましょう。

画像クリックで拡大

編集後の MainActivity

package com.oshimamasara.myinterstitialdemo;

import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.InterstitialAd;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.AdRequest;

import java.util.Random;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
   Button btn_one, btn_two, btn_three;
   TextView tv_question;

   private Question question = new Question();

   private String answer;
   private int questionLength = question.questions.length;
   private InterstitialAd mInterstitialAd;

   Random random;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       Log.d("TAG", "★onCreate");
       random = new Random();

       btn_one = (Button)findViewById(R.id.btn_one);
       btn_one.setOnClickListener(this);
       btn_two = (Button)findViewById(R.id.btn_two);
       btn_two.setOnClickListener(this);
       btn_three = (Button)findViewById(R.id.btn_three);
       btn_three.setOnClickListener(this);

       tv_question = (TextView)findViewById(R.id.tv_question);

       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());  //広告読み込み


       NextQuestion(random.nextInt(questionLength));
       Log.d("TAG", "★QUIZ START");
   }

   @Override
   public void onClick(View v) {
       Log.d("TAG", "★onClick()");
       switch (v.getId()){
           case R.id.btn_one:
               if(btn_one.getText() == answer){
                   Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                   NextQuestion(random.nextInt(questionLength));
               }else{
                   GameOver();
               }
               break;

           case R.id.btn_two:
               if(btn_two.getText() == answer){
                   Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                   NextQuestion(random.nextInt(questionLength));
               }else{
                   GameOver();
               }
               break;

           case R.id.btn_three:
               if(btn_three.getText() == answer){
                   Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                   NextQuestion(random.nextInt(questionLength));
               }else{
                   GameOver();
               }
               break;
       }
   }

   private void GameOver(){
       AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
       alertDialogBuilder
               .setMessage("不正解\uD83D\uDE2D")
               .setCancelable(false)
               .setPositiveButton("もう一回やる", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {
                       startActivity(new Intent(getApplicationContext(), MainActivity.class));
                       // インタースティシャル広告 表示
                       if (mInterstitialAd.isLoaded()) {
                           mInterstitialAd.show();
                       } else {
                           Log.d("TAG", "The interstitial wasn't loaded yet.");
                       }
                   }
               })
               .setNegativeButton("アプリを閉じる", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {
                       System.exit(0);
                   }
               });
       alertDialogBuilder.show();

   }

   private void NextQuestion(int num){
       tv_question.setText(question.getQuestion(num));
       btn_one.setText(question.getchoice1(num));
       btn_two.setText(question.getchoice2(num));
       btn_three.setText(question.getchoice3(num));
       answer = question.getCorrectAnswer(num);
   }

}

広告の事前読み込みの後は、広告の表示プログラム。基本的に mInterstitialAd.show(); だけで広告を表示することはできますが、 公式ドキュメントの様に

if (mInterstitialAd.isLoaded()) { ・・・

if文を設けることで、事前読み込み有無のチェックをかけることが可能。ここで一旦エミュレーターを起動して、インタースティシャル広告は表示されるかチェックしてみましょう。

image

クイズを間違えた後、 「もう1回やる」をタップすると、テスト用のインタースティシャル広告が表示されると思います。そして広告を閉じると再びクイズがスタート、 onCreate() されます。

画像クリックで拡大

表面的に使う機会は少ないかもしれませんが、インタースティシャル広告の挙動に合わせてイベントを追加することもできます。 公式チュートリアルを参考に、 下記コードを上図のようにコピペ。

追加コード

mInterstitialAd.setAdListener(new AdListener() {
    @Override
    public void onAdLoaded() {
        Log.d("TAG", "★onAdLoaded()");
    }

    @Override
    public void onAdFailedToLoad(int errorCode) {
        Log.d("TAG", "★onAdFailedToLoad()");
    }

    @Override
    public void onAdOpened() {
        Log.d("TAG", "★onAdOpened()");
        Toast.makeText(MainActivity.this, "広告が表示されます", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onAdClicked() {
        Log.d("TAG", "★onAdClicked()");
        Toast.makeText(MainActivity.this, "広告ページを開きます", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onAdLeftApplication() {
        Log.d("TAG", "★onAdLeftApplication()");
    }

    @Override
    public void onAdClosed() {
        Log.d("TAG", "★onAdClosed()");
        Toast.makeText(MainActivity.this, "広告ページ閉じます", Toast.LENGTH_SHORT).show();
    }
});

編集後の MainActivity

package com.oshimamasara.myinterstitialdemo;

import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.InterstitialAd;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.AdRequest;

import java.util.Random;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button btn_one, btn_two, btn_three;
    TextView tv_question;

    private Question question = new Question();

    private String answer;
    private int questionLength = question.questions.length;
    private InterstitialAd mInterstitialAd;

    Random random;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("TAG", "★onCreate");
        random = new Random();

        btn_one = (Button)findViewById(R.id.btn_one);
        btn_one.setOnClickListener(this);
        btn_two = (Button)findViewById(R.id.btn_two);
        btn_two.setOnClickListener(this);
        btn_three = (Button)findViewById(R.id.btn_three);
        btn_three.setOnClickListener(this);

        tv_question = (TextView)findViewById(R.id.tv_question);

        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 onAdLoaded() {
                Log.d("TAG", "★onAdLoaded()");
            }

            @Override
            public void onAdFailedToLoad(int errorCode) {
                Log.d("TAG", "★onAdFailedToLoad()");
            }

            @Override
            public void onAdOpened() {
                Log.d("TAG", "★onAdOpened()");
                Toast.makeText(MainActivity.this, "広告が表示されます", Toast.LENGTH_SHORT).show();

            }

            @Override
            public void onAdClicked() {
                Log.d("TAG", "★onAdClicked()");
                Toast.makeText(MainActivity.this, "広告ページを開きます", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAdLeftApplication() {
                Log.d("TAG", "★onAdLeftApplication()");
            }

            @Override
            public void onAdClosed() {
                Log.d("TAG", "★onAdClosed()");
                Toast.makeText(MainActivity.this, "広告ページ閉じます", Toast.LENGTH_SHORT).show();
            }
        });

        NextQuestion(random.nextInt(questionLength));
        Log.d("TAG", "★QUIZ START");
    }

    @Override
    public void onClick(View v) {
        Log.d("TAG", "★onClick()");
        switch (v.getId()){
            case R.id.btn_one:
                if(btn_one.getText() == answer){
                    Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                    NextQuestion(random.nextInt(questionLength));
                }else{
                    GameOver();
                }
                break;

            case R.id.btn_two:
                if(btn_two.getText() == answer){
                    Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                    NextQuestion(random.nextInt(questionLength));
                }else{
                    GameOver();
                }
                break;

            case R.id.btn_three:
                if(btn_three.getText() == answer){
                    Toast.makeText(MainActivity.this, "正解\uD83D\uDE0A", Toast.LENGTH_LONG).show();
                    NextQuestion(random.nextInt(questionLength));
                }else{
                    GameOver();
                }
                break;
        }
    }

    private void GameOver(){
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
        alertDialogBuilder
                .setMessage("不正解\uD83D\uDE2D")
                .setCancelable(false)
                .setPositiveButton("もう一回やる", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        startActivity(new Intent(getApplicationContext(), MainActivity.class));
                        // インタースティシャル広告 表示
                        if (mInterstitialAd.isLoaded()) {
                            mInterstitialAd.show();
                        } else {
                            Log.d("TAG", "The interstitial wasn't loaded yet.");
                        }
                    }
                })
                .setNegativeButton("アプリを閉じる", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        System.exit(0);
                    }
                });
        alertDialogBuilder.show();
    }

    private void NextQuestion(int num){
        tv_question.setText(question.getQuestion(num));
        btn_one.setText(question.getchoice1(num));
        btn_two.setText(question.getchoice2(num));
        btn_three.setText(question.getchoice3(num));
        answer = question.getCorrectAnswer(num);
    }
}

この状態で先ほど同様アプリを起動してみると、インタースティシャル広告の動きが logcat で確認。また必要に応じてプログラムを編集すると、各タイミングでイベントを追加することも可能となります。

インタースティシャル広告の注意事項

画像クリックで拡大

AdMob のインタースティシャル広告を利用する際は、AdMobの利用規約に従う必要が。いくつか注意事項はあるものの、間違えやすいポイントとしては広告表示のタイミングが挙げられます。

上図の上段は先程ご紹介したインタースティシャル広告事例の流れで OK ですが、下の段のフローはアウトです。 アウトの理由は、「アプリを起動した際」、「アプリを閉じる前」に広告を表示すると、ユーザーのアプリ使用感が著しく損なわれるためです。 こうした 「アプリを起動した際」、「アプリを閉じる前」に広告やお知らせを表示させたい場合は、 AdMob のインタースティシャル広告以外の方法を取る必要があります。

最新のアプリ開発スキルが身に付く

CodeCampの無料体験はこちら

まとめ

今回はアプリ収益の足がかりとなる「インタースティシャル広告」の使い方をご紹介させていただきました。実際にインタースティシャル広告を導入しているアプリを見てみると、バナー広告や動画リワード広告、それから 課金で広告非表示など複数のビジネスモデルを取り込んでいるアプリをよく見かけました。また「広告表示ばかりで使いにくいな」とユーザーに思われないよう、「広告のタイミング」や「アプリ自身の面白さ」が重要になってくると感じた次第です。

「自分でもアプリ開発できるのかな?」「こんなアプリ欲しいけど、どうすれば作れるんだ?」と悩んでおられる方。一度プログラミングスクールの CodeCamp を頼ってみませんか?

「オンライン × マンツーマン」形式の CodeCamp には、 Android アプリ開発や Java に精通した現役エンジニアの講師が在籍しています。しかし、経済的にちょっと難しいかなと思われている方は

受講費用 < 取得スキル

となるか、一度無料体験で確認してみませんか? CodeCamp では随時無料体験を実施していますので、ご興味ある方は 公式ページ から確認してみてください。


関連記事

オシママサラ
この記事を書いた人
オシママサラ
\ 無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp