Androidアプリ開発

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

この記事は約21分で読めます。
記事内に広告が含まれています。
スポンサーリンク

こんにちは、まっさん(@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としています。

<strong>重要</strong>
重要

2024年3月で広告配信サービスは終了しました

実装の前提条件

・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に定義します

AdMobクラス

AdMobの広告表示を制御するクラスです。

	:
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; }
}

各広告の表示制御

ActivityのonResumeで広告をロードして、広告表示の切り替えを行います。

	:
    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アプリです。

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちらから、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

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

最近、メインPCを買い換えました💛ちょっとした小物が気になりますね♪

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

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

未経験者からシステムエンジニアを目指すのに最適かと、まずは無料相談から♪

未経験者からプログラマーを目指すのに最適かと、まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています、お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適かと、まずは無料オンライン相談から♪

参考になったら、💛をポッチとしてね♪

スポンサーリンク
msakiをフォローする
スポンサーリンク

コメント欄

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