こんにちは、まっさん(@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としています。
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を習得するのに最適かと、まずは無料オンライン相談から♪
参考になったら、💛をポッチとしてね♪
コメント欄