Androidアプリ開発

アプリ広告配信サービスの自動切換え

Androidアプリ開発
この記事は約20分で読めます。

こんにちは、まっさん(@Tera_Msaki)です。

この記事はAndroidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Javaでの開発経験、XML構文規則、Androidのアプリ開発経験がある方を対象としています。
Androidのアプリ開発でお役にたててれば、嬉しいです。
(これからAndroidのアプリ開発やJavaでの開発を始めたい方への案内は、記事の最後で紹介します)

◎テーマ
アプリ広告が配信されない場合にアプリ広告配信サービスを切り替えてアプリ広告を表示したい

◎ポイント

AdMob広告配信は無効なトラフィック問題による広告配信の制限やストックしてる広告がない場合など、広告が配信されないことが多々あります。
アプリ側でアプリ広告配信サービスの広告配信状態を確認して、アプリ広告配信サービスを切り替えることで、アプリ広告を表示することが可能です。

◎利用するアプリ広告配信サービス

①AdMob
優先で選択します。
リスナー(AdListener)を使用して、onAdFailedToLoadメソッドを使用してアプリ広告が配信されているか判断します。

②アイモバイル社のi-mobile
AdMobでアプリ広告が配信されていない場合に選択します。
リスナー(setImobileSdkAdListener)を使用して、onAdReadyCompletedメソッド を使用してアプリ広告が配信されているか判断します。

③ファンコミュニケーションズ社のnend
i-mobileでアプリ広告が配信されていない場合に選択します。

アプリ広告配信サービスの切り替えの順番ですが、i-mobileのSDKの仕組み上、ActivityのUIスレッドでしかインスタンス化できないため、AdMob → i-mobile → nendとしています。

◎実装の前提条件

・AdMob、i-mobile、nendのSDKが組み込みされていること。
・パートナー登録が完了し、アプリ及び広告枠(広告ユニット)が登録されていること。

◎レイアウトXML(activity_main.xml)

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:nendsdk="http://schemas.android.com/apk/res-auto"
	:

    <com.google.android.gms.ads.AdView
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        ads:adSize="SMART_BANNER"
        ads:adUnitId="@string/adUnitId1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>
    <jp.co.imobile.sdkads.android.ImobileInlineView
        android:id="@+id/imobile"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        pid="@string/IMOBILE_BANNER_PID" mid="@string/IMOBILE_BANNER_MID" sid="@string/IMOBILE_BANNER_SID" />
    <net.nend.android.NendAdView
        android:id="@+id/nend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        nendsdk:NendApiKey="@string/apiKey"
        nendsdk:NendSpotId="@string/spotID"
        nendsdk:NendAdjustSize="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

※adUnitId1は、strings.xmlに定義します
※IMOBILE_BANNER_PIDやIMOBILE_BANNER_MIDやIMOBILE_BANNER_SIDは、strings.xmlに定義します
※apiKeyやspotIDは、strings.xmlに定義します

◎Java AdMobクラスのコーディング(AdMob.java)

	:
public class AdMob {
    private static final boolean        DEBUG = false;
    private static final String         TAG = AdMob.class.getSimpleName();
    private int                         errorCode;

    //コンストラクタ
    public AdMob(Context context, AdView adView) {
        MobileAds.initialize(context, initializationStatus -> {
            if (DEBUG) Log.d(TAG,"MobileAds:onInitialComplete");
        });
        AdRequest adRequest = new AdRequest.Builder().build();
        adView.loadAd(adRequest);
        adView.setAdListener(new AdListener() {
            @Override
            public void onAdImpression() {
                if (DEBUG) Log.d(TAG, "onAdImpression");
                super.onAdImpression();
            }
            @Override
            public void onAdClicked() {
                super.onAdClicked();
            }
            @Override
            public void onAdLoaded() {
                if (DEBUG) Log.d(TAG, "Code to be executed when an ad finishes loading.");
            }
            @Override
            public void onAdOpened() {
                if (DEBUG) Log.d(TAG, "Code to be executed when an ad opens an overlay that covers the screen.");
            }
            @Override
            public void onAdClosed() {
                if (DEBUG) Log.d(TAG, "Code to be executed when when the user is about to return to the app after tapping on an ad.");
            }
            @Override
            public void onAdFailedToLoad(@NonNull LoadAdError error) {
                // Gets the domain from which the error came.
                String errorDomain = error.getDomain();
                // Gets the error code. See
                // https://developers.google.com/android/reference/com/google/android/gms/ads/AdRequest#constant-summary
                // for a list of possible codes.
                errorCode = error.getCode();
                // Gets an error message.
                // For example "Account not approved yet". See
                // https://support.google.com/admob/answer/9905175 for explanations of
                // common errors.
                String errorMessage = error.getMessage();
                // Gets additional response information about the request. See
                // https://developers.google.com/admob/android/response-info for more
                // information.
                ResponseInfo responseInfo = error.getResponseInfo();
                // Gets the cause of the error, if available.
                AdError cause = error.getCause();
                // All of this information is available via the error's toString() method.
                if (DEBUG) Log.d(TAG, error.toString());
            }
        });
    }
    //エラーコード取得
    public int getErrorCode() { return errorCode; }
}

◎Java 制御部分のコーディング(MainActivity.java)

	:
    private AdView                      adView;
    private AdMob                       adMob;
    private ImobileInlineView           imobileInlineView;
    private boolean                     imobileAdReceive = false;
    private NendAdView                  nendAdView;
    private final int                   INTERVAL = 100;
	:

    @Override
    protected void onResume() {
        super.onResume();
        context = getApplicationContext();
        if (adView != null) {
            adView.resume();
        } else {
            adView = findViewById(R.id.adView);
        }
        adMob = new AdMob(context, adView);
        //i-mobile広告
        imobileInlineView = findViewById(R.id.imobile);
        ImobileSdkAd.registerSpotInline(this, context.getString(R.string.IMOBILE_BANNER_PID), context.getString(R.string.IMOBILE_BANNER_MID), context.getString(R.string.IMOBILE_BANNER_SID));
        ImobileSdkAd.setImobileSdkAdListener(context.getString(R.string.IMOBILE_BANNER_SID),new ImobileSdkAdListener(){
            @Override
            public void onAdReadyCompleted() {
                //広告の表示準備が完了した際に呼び出されます
                imobileAdReceive = true;
            }
            @Override
            public void onAdShowCompleted() {
                //広告が表示された際に呼び出されます
            }
            @Override
            public void onAdCliclkCompleted() {
                //広告がクリックされた際に呼び出されます
            }
            @Override
            public void onAdCloseCompleted() {
                // 広告が閉じられた際に呼び出されます
            }
            @Override
            public void onFailed(FailNotificationReason reason) {
                // 広告の取得に失敗した際に呼び出されます。
                // (reasonには、失敗理由が設定されます)
            }
        });
        ImobileSdkAd.start(context.getString(R.string.IMOBILE_BANNER_SID));
        ImobileSdkAd.showAd(this, context.getString(R.string.IMOBILE_BANNER_SID), imobileInlineView, true);
	:

        adShow();
    }
	:

    //広告表示
    private void adShow() {
        Handler handler = new Handler(Looper.getMainLooper());
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                if (adMob.getErrorCode() == 0) {
                    //AdMob広告
                    if (nendAdView != null) nendAdView.setVisibility(View.INVISIBLE);
                    if (imobileInlineView != null) imobileInlineView.setVisibility(View.INVISIBLE);
                    if (adView != null) adView.setVisibility(View.VISIBLE);
                } else {
                    if (adView != null) {
                        adView.setVisibility(View.INVISIBLE);
                        adView.destroy();
                    }
                    if (imobileAdReceive) {
                        //i-mobile広告
                        if (nendAdView != null) nendAdView.setVisibility(View.INVISIBLE);
                        if (imobileInlineView != null) imobileInlineView.setVisibility(View.VISIBLE);
                    } else {
                        //nend広告
                        if (imobileInlineView != null) imobileInlineView.setVisibility(View.INVISIBLE);
                        if (nendAdView != null) {
                            nendAdView.resume();
                        } else {
                            nendAdView = findViewById(R.id.nend);
                        }
                        nendAdView.setVisibility(View.VISIBLE);
                    }
                }
                handler.postDelayed(this, INTERVAL);
            }
        };
        handler.post(runnable);
    }
	:

広告表示できているかの判断はリスナーを使用しているため、スレッドをわけてアプリ広告配信サービスの切り替えを実装します。
アプリ広告配信サービスの切り替えのテストは、strings.xmlに定義しているadUnitId1、IMOBILE_BANNER_MID、apiKeyを存在しないコードに変更すれば可能です。

ブログランキング・にほんブログ村へにほんブログ村

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

初めてのAndroidのアプリ開発では、アプリケーション開発経験がない方や、
アプリケーション開発経験がある方でも、JavaやC#などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。

コメント

タイトルとURLをコピーしました