広告ユニットごとに placement 名を設定できます(例:「Rewarded VideoLevels」、「INTER_levelEnd」、「RewardedVideoCoinStore」)。 これにより、さまざまな placement カテゴリの統計情報を収集するのに役立ちます。 以下のスニペットは、さまざまな広告フォーマットで placement 名を設定する方法を示しています。
banner および MREC の場合は、banner または MREC をロードする前に placement 名を設定する必要があります。
adView.setPlacement( "«placement»" );
adView.loadAd();
adView.setPlacement( "«placement»" )
adView.loadAd()
interstitial.showAd( "«placement»" );
interstitial.showAd( "«placement»" )
rewardedAd.showAd( "«placement»" );
rewardedAd.showAd( "«placement»" )
nativeAdLoader.setPlacement( "«placement»" );
nativeAdLoader.setPlacement( "«placement»" )
MaxAdPlacerSettings settings = new MaxAdPlacerSettings( "«ad-unit-ID»" );
settings.setPlacement( "«placement»" );
val settings = MaxAdPlacerSettings( "«ad-unit-ID»" )
settings.placement = "«placement»"
アプリの起動時に、一部のメディエーション対象のSDKネットワークで音声をミュートに設定できます。 AppLovin SDK経由でこの機能をサポートしているネットワークは以下の通りです。
その他のネットワークについては、この機能が利用可能かどうか、およびアクセス方法について、各ネットワークのアカウントチームにお問い合わせください。
以下のコードスニペットは、この機能をサポートしているネットワークで音声をミュートにする方法を示しています。
AppLovinSdk sdk = AppLovinSdk.getInstance( context );
sdk.getSettings().setMuted( true ); // ミュートにする場合
sdk.getSettings().setMuted( false ); // ミュートを解除する場合
val sdk = AppLovinSdk.getInstance( context )
sdk.settings.setMuted( true ) // ミュートにする場合
sdk.settings.setMuted( false ) // ミュートを解除する場合
広告をロードする前にミュート状態を設定してください。 一部のネットワーク(Google biddingやGoogle AdMobなど)は、広告ロード前のミュート状態に応じて、ミュートまたはミュート解除された動画を返します。
注意:広告をミュートにすると、広告収益が低下する可能性があります。
SDKの設定オブジェクトでブーリアンフラグを設定することで、詳細ログ(verbose logs)を有効にできます。
AppLovinSdk.getInstance( context ).getSettings().setVerboseLogging( true );
AppLovinSdk.getInstance( context ).settings.setVerboseLogging( true )
アプリケーションのAndroid Manifestファイルを編集することでも、詳細ログを有効にできます。
以下のように <meta-data> 要素を追加してください。
<application>
⋮
<meta-data android:name="applovin.sdk.verbose_logging" android:value="true" />
⋮
</application>
詳細ログが有効になっていることを確認するには、AppLovin SDKログの初期化セクションで Verbose Logging On: true と表示されている行を確認してください。
AppLovin SDK
Version: 12.4.2
⋮
Verbose Logging On: true
⋮
AppLovin SDKは、ログに「/AppLovinSdk: [AppLovinSdk]」というタグを付与します。
メディエーション対象ネットワークから、表示された広告のcreative IDとネットワーク名を取得できます。 詳細については、Creative Debuggerのドキュメントを参照してください。
AppLovin Exchangeから配信されたMAX広告のDSP名を取得するには、広告の getDspName() メソッドを呼び出します。
@Override
public void onAdLoaded(final MaxAd ad)
{
System.out.println( "AppLovin Exchange DSP name: " + ad.getDspName() );
}
override fun onAdLoaded(maxAd: MaxAd)
{
println( "AppLovin Exchange DSP Name: " + maxAd.getDspName() )
}
クライアント側でインプレッションレベルのユーザー収益データにアクセスできます。 このデータを使用して、異なるソースやキャンペーンを比較できます。 また、MAXのuser revenue APIを使用してこのデータにアクセスすることもできます。 このデータへのアクセスを希望するMMPは、MMP向けインプレッションレベルユーザー収益APIのドキュメントをご確認ください。
サポートされているすべてのネットワークについて、Adjustなど、選択したモバイル計測パートナー(MMP)とインプレッションレベルの広告収益データを共有できます。
収益額は、すべての広告ライフサイクルコールバックで取得できます。
これを行うには、MaxAdRevenueListener を作成し、その onAdRevenuePaid() メソッドを実装して、そのリスナーを setRevenueListener() に渡します。
以下の例は、このような「広告収益支払い(ad revenue paid)」コールバックを実装する方法を示しています。
@Override
public void onAdRevenuePaid(final MaxAd ad)
{
double revenue = ad.getRevenue(); // 米ドル(USD)表記
// その他のデータ
String countryCode = AppLovinSdk.getInstance( context ).getConfiguration().getCountryCode(); // 米国の場合は "US" など - 注意:通貨コードである "USD" と混同しないでください
String networkName = ad.getNetworkName(); // 広告を表示したネットワークの表示名
String adUnitId = ad.getAdUnitId(); // MAX広告ユニットID
MaxAdFormat adFormat = ad.getFormat(); // 広告の広告フォーマット(例:BANNER, MREC, INTERSTITIAL, REWARDED)
String placement = ad.getPlacement(); // この広告のポストバックが紐付けられている placement
String networkPlacement = ad.getNetworkPlacement(); // 広告を表示したネットワーク側の placement ID
}
override fun onAdRevenuePaid(ad: MaxAd)
{
val revenue = ad.revenue // 米ドル(USD)表記
// その他のデータ
val countryCode = AppLovinSdk.getInstance( context ).configuration.countryCode // 米国の場合は "US" など - 注意:通貨コードである "USD" と混同しないでください
val networkName = ad.networkName // 広告を表示したネットワークの表示名
val adUnitId = ad.adUnitId // MAX広告ユニットID
val adFormat = ad.format // 広告の広告フォーマット(例:BANNER, MREC, INTERSTITIAL, REWARDED)
val placement = ad.placement // この広告のポストバックが紐付けられている placement
val networkPlacement = ad.networkPlacement // 広告を表示したネットワーク側の placement ID
}
エラーが発生した場合、ad.getRevenue()/ad.revenue の値は -1 になることがあります。
以下の例に示すように、収益値の精度評価(precision)を取得することもできます。
String revenuePrecision = ad.getRevenuePrecision();
val revenuePrecision = ad.revenuePrecision
この精度(precision)は、以下のいずれかの値をとります。
"publisher_defined""exact""estimated""undefined"""広告リクエストをリッスンするには、MaxAdRequestListener を設定し、その onAdRequestStarted() メソッドを実装して、そのリスナーを setRequestListener() に渡します。
以下の例は、このような「広告リクエスト開始(ad request started)」コールバックを実装する方法を示しています。
@Override
public void onAdRequestStarted(final String adUnitId)
{
// ここで広告リクエストが開始されます
}
override fun onAdRequestStarted(adUnitId: String)
{
// ここで広告リクエストが開始されます
}
AppLovinSdkInitializationConfiguration で広告ユニットを指定することにより、特定の広告ユニットでSDKを初期化できます。
これを行うと、SDKは指定された広告ユニット用に設定されたネットワークのみを初期化します。
広告ユニットを指定しない場合、SDKは現在のセッションですべての広告ユニットが必要であると想定します。
その場合、それらの広告ユニット用に設定されたすべてのネットワークを初期化します。
以下の例は、この機能を実装する方法を示しています。
AppLovinSdkInitializationConfiguration.Builder initConfigBuilder = AppLovinSdkInitializationConfiguration.builder( «your-SDK-key» );
initConfigBuilder.setMediationProvider( AppLovinMediationProvider.MAX );
List<String> adUnitIds = new ArrayList<>();
adUnitIds.add( "«ad-unit-ID-1»" );
adUnitIds.add( "«ad-unit-ID-2»" );
initConfigBuilder.setAdUnitIds( adUnitIds ).build();
AppLovinSdk.getInstance( this ).initialize( initConfigBuilder, new AppLovinSdk.SdkInitializationListener()
{
@Override
public void onSdkInitialized(final AppLovinSdkConfiguration sdkConfig)
{
⋮
}
} );
val adUnitIds = arrayListOf("«ad-unit-ID-1»", "«ad-unit-ID-2»")
val initConfigBuilder = AppLovinSdkInitializationConfiguration.Builder(«your-SDK-key»)
.setMediationProvider(AppLovinMediationProvider.MAX)
.setAdUnitIds(adUnitIds)
.build()
AppLovinSdk.getInstance(this).initialize(initConfigBuilder) { sdkConfig ->
⋮
}
SDKキーは、AppLovinダッシュボードの Account > General > Keys セクションで確認できます。
Selective initを使用する場合、MAXは、明示的に指定しなかった広告ユニットを現在のセッションでの広告配信から除外します。
テストモードを有効にしている場合、Selective initは効果がありません。
Waterfall Information APIは、広告(ロードされた広告、またはロードに失敗した広告)の現在のwaterfallに関する情報を提供します。 このAPIは、waterfall内の各広告の広告ロード状態、レイテンシ、認証情報、およびメディエーション対象ネットワーク情報を返します。 waterfall内の広告のロードが失敗した場合、APIはエラー情報を提供します。
| 値 | 説明 |
|---|---|
| 0 | 広告ロード未試行 (Ad Load Not Attempted) |
| 1 | 広告ロード完了 (Ad Loaded) |
| 2 | 広告ロード失敗 (Ad Failed To Load) |
@Override
public void onAdLoaded(final MaxAd ad)
{
MaxAdWaterfallInfo waterfall = ad.getWaterfall();
if ( waterfall == null ) return;
System.out.println( "Waterfall Name: " + waterfall.getName() + " and Test Name: " + waterfall.getTestName() );
System.out.println( "Waterfall latency was: " + waterfall.getLatencyMillis() + " milliseconds" );
String waterfallInfoStr;
for ( MaxNetworkResponseInfo networkResponse : waterfall.getNetworkResponses() )
{
waterfallInfoStr = "Network -> " + networkResponse.getMediatedNetwork() +
"\n...adLoadState: " + networkResponse.getAdLoadState() +
"\n...latency: " + networkResponse.getLatencyMillis() + " milliseconds" +
"\n...credentials: " + networkResponse.getCredentials();
if ( networkResponse.getError() != null )
{
waterfallInfoStr += "\n...error: " + networkResponse.getError();
}
System.out.println( waterfallInfoStr );
}
}
@Override
public void onAdLoadFailed(final String adUnitId, final MaxError error)
{
MaxAdWaterfallInfo waterfall = error.getWaterfall();
if ( waterfall == null ) return;
System.out.println( "Waterfall Name: " + waterfall.getName() + " and Test Name: " + waterfall.getTestName() );
System.out.println( "Waterfall latency was: " + waterfall.getLatencyMillis() + " milliseconds" );
for ( MaxNetworkResponseInfo networkResponse : waterfall.getNetworkResponses() )
{
System.out.println( "Network -> " + networkResponse.getMediatedNetwork() +
"...latency: " + networkResponse.getLatencyMillis() +
"...credentials: " + networkResponse.getCredentials() + " milliseconds" +
"...error: " + networkResponse.getError() );
}
}
override fun onAdLoaded(ad: MaxAd?) {
val waterfall = ad?.waterfall ?: return
println( "Waterfall Name: " + waterfall.name + " and Test Name: " + waterfall.testName )
println( "Waterfall latency was: " + waterfall.latencyMillis + " milliseconds" )
var waterfallInfoStr: String
for ( networkResponse in waterfall.networkResponses ) {
waterfallInfoStr = "Network -> ${ networkResponse.mediatedNetwork }" +
"\n...adLoadState: ${ networkResponse.adLoadState }" +
"\n...latency: ${ networkResponse.latencyMillis } milliseconds" +
"\n...credentials: ${ networkResponse.credentials }"
if ( networkResponse.error != null ) {
waterfallInfoStr += "\n...error: ${ networkResponse.error }"
}
println( waterfallInfoStr )
}
}
override fun onAdLoadFailed(adUnitId: String?, error: MaxError?) {
val waterfall = error?.waterfall ?: return
println( "Waterfall Name: " + waterfall.name + " and Test Name: " + waterfall.testName )
println( "Waterfall latency was: " + waterfall.latencyMillis + " milliseconds" )
for ( networkResponse in waterfall.networkResponses ) {
println( "Network -> ${ networkResponse.mediatedNetwork }" +
"...latency: ${ networkResponse.latencyMillis } milliseconds" +
"...credentials: ${ networkResponse.credentials }" +
"...error: ${ networkResponse.error }" )
}
}
Waterfall Name: Default Waterfall and Test Name: Control
Waterfall latency was: 6668 milliseconds
Network -> MaxMediatedNetworkInfo{name=ironSource, adapterClassName=com.applovin.mediation.adapters.IronSourceMediationAdapter, adapterVersion=7.1.10.1.0, sdkVersion=7.1.10.1}
...adLoadState: FAILED_TO_LOAD
...latency: 1542 milliseconds
...credentials: Bundle[{app_key=88a0872d, placement_id=0}]
...error: MaxAdapterError{errorCode=-5200, errorMessage="Unspecified Error", thirdPartySdkErrorCode=510, thirdPartySdkErrorMessage="Load failed - Failed to load Interstitial ad"}
Network -> MaxMediatedNetworkInfo{name=Mintegral, adapterClassName=com.applovin.mediation.adapters.MintegralMediationAdapter, adapterVersion=15.7.61.0, sdkVersion=MAL_15.7.61}
...adLoadState: AD_LOADED
...latency: 4676 milliseconds
...credentials: Bundle[{app_id=118244, app_key=57205cd060e7e051e5bcccaae6bd2b64, placement_id=515486}]
Network -> MaxMediatedNetworkInfo{name=ironSource, adapterClassName=com.applovin.mediation.adapters.IronSourceMediationAdapter, adapterVersion=7.1.10.1.0, sdkVersion=7.1.10.1}
...adLoadState: AD_LOAD_NOT_ATTEMPTED
...latency: -1 milliseconds
...credentials: Bundle[{app_key=88a0872d, placement_id=1171359}]
waterfallが空の場合、MaxError.getWaterfall() は null を返します。
その場合、waterfallのプロパティを調査することはできません。
ただし、以下のように getRequestLatencyMillis() メソッドを呼び出すことで、空のwaterfallに対する広告ロードレイテンシを取得できます。
@Override
public void onAdLoaded(final MaxAd ad)
{
System.out.println("Successful ad load latency: " + ad.getRequestLatencyMillis() + " ms");
}
@Override
public void onAdLoadFailed(final String adUnitId, final MaxError error)
{
System.out.println("Failed ad load latency: " + error.getRequestLatencyMillis() + " ms");
}
override fun onAdLoaded(ad: MaxAd)
{
println( "Successful ad load latency: " + ad.getRequestLatencyMillis() + " ms" )
}
override fun onAdLoadFailed(adUnitId: String, error: MaxError)
{
println( "Failed ad load latency: " + error.getRequestLatencyMillis() + " ms" )
}
広告ユニットUIで設定できるのと同様に、APIを介してbannerおよびMRECの広告更新(refresh)間隔をカスタマイズできます。 許容される最小および最大の更新間隔は、それぞれ10秒と120秒です。 MAXはこれらの制限外の値を無視します。 以下のコードサンプルは、これらの更新間隔をカスタマイズする方法を示しています。
// adView が MaxAdView のインスタンスである場合
adView.setExtraParameter( "ad_refresh_seconds", «ad-refresh-rate» );
// adView が MaxAdView のインスタンスである場合
adView.setExtraParameter( "ad_refresh_seconds", «ad-refresh-rate» )