高级设置
广告位
您可以为每个广告单元设置广告位名称 (例如 “Rewarded VideoLevels”、“INTER_levelEnd” 或 “RewardedVideoCoinStore”)。 这可以帮助您汇总不同广告位类别的统计数据。 下面的片段展示了如何为不同的广告格式设置广告位名称。
横幅 / MREC
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»" )
原生广告 (Ad Placer)
MaxAdPlacerSettings settings = new MaxAdPlacerSettings( "«ad-unit-ID»" );settings.setPlacement( "«placement»" );
val settings = MaxAdPlacerSettings( "«ad-unit-ID»" )settings.placement = "«placement»"
静音
您可以在启动应用时将某些 SDK 平台的音频设为关闭。 通过 AppLovin SDK 支持该功能的平台包括 Google 竞价和 Google AdMob、AppLovin、DT Exchange、Google Ad Manager、LINE、Mintegral、腾讯和 Verve。 对于其他平台,请咨询平台客户团队,了解此功能是否可用以及使用方法。
下面的代码片段展示了如何在支持静音的平台中设置静音:
AppLovinSdk sdk = AppLovinSdk.getInstance( context );sdk.getSettings().setMuted( true ); // to mutesdk.getSettings().setMuted( false ); // to unmute
val sdk = AppLovinSdk.getInstance( context )sdk.settings.setMuted( true ) // to mutesdk.settings.setMuted( false ) // to unmute
启用详细日志
在 SDK 设置对象中设置布尔标记,以启用详细日志:
通过编程方式
AppLovinSdk.getInstance( context ).getSettings().setVerboseLogging( true );
AppLovinSdk.getInstance( context ).settings.setVerboseLogging( true )
Android Manifest
您还可以编辑应用程序的 Android Manifest 文件,以启用详细日志。
为此,请按照下列方式添加 <meta-data>
元素:
<application>⋮ <meta-data android:name="applovin.sdk.verbose_logging" android:value="true" />⋮</application>
验证
要验证是否已成功启用详细日志,请查看 AppLovin SDK 日志初始化部分中是否有 Verbose Logging On: true
行。
AppLovin SDKVersion: 11.4.2⋮Verbose Logging On: true⋮
AppLovin SDK 的日志标签为 “/AppLovinSdk: [AppLovinSdk]
”。
Creative ID 和平台名称
您可以调取各个聚合平台已展示广告的 Creative ID 和平台名称。 请参阅 the Creative Debugger documentation 了解更多信息。
DSP 名称
要调取 AppLovin Exchange 投放的 MAX 广告的 DSP 名称,请调用广告的 getDspName()
方法:
@Overridepublic 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() )}
展示层级用户收入 API
从 SDK 版本 10.3.0 开始,您可以在客户端访问展示级别的用户收入数据, 并且使用此数据来比较不同的来源和 campaign。您也可以使用 MAX User Revenue API 访问此数据。需要访问此数据的 MMP,请参阅针对 MMP 的展示层级用户收入 API 文档。
您可以针对所有受支持的平台与 Adjust 等移动监测合作伙伴分享展示层级广告收入数据。
您可以在所有广告生命周期回传中调取收入金额。
为此,请创建一个 MaxAdRevenueListener
,安装它的 onAdRevenuePaid()
方法,然后将该监听器传递至 setRevenueListener()
。
以下示例展示了如何在 “ad revenue paid” 回传中执行此操作:
@Overridevoid onAdRevenuePaid(final MaxAd ad){ double revenue = ad.getRevenue(); // In USD
// Miscellaneous data String countryCode = AppLovinSdk.getInstance( context ).getConfiguration().getCountryCode(); // "US" for the United States, etc - Note: Do not confuse this with currency code which is "USD" String networkName = ad.getNetworkName(); // Display name of the network that showed the ad String adUnitId = ad.getAdUnitId(); // The MAX Ad Unit ID MaxAdFormat adFormat = ad.getFormat(); // The ad format of the ad (e.g. BANNER, MREC, INTERSTITIAL, REWARDED) String placement = ad.getPlacement(); // The placement this ad's postbacks are tied to String networkPlacement = ad.getNetworkPlacement(); // The placement ID from the network that showed the ad}
override fun onAdRevenuePaid(ad: MaxAd){ val revenue = ad.revenue // In USD
// Miscellaneous data val countryCode = AppLovinSdk.getInstance( context ).configuration.countryCode // "US" for the United States, etc - Note: Do not confuse this with currency code which is "USD" val networkName = ad.networkName // Display name of the network that showed the ad val adUnitId = ad.adUnitId // The MAX Ad Unit ID val adFormat = ad.format // The ad format of the ad (e.g. BANNER, MREC, INTERSTITIAL, REWARDED) val placement = ad.placement // The placement this ad's postbacks are tied to val networkPlacement = ad.networkPlacement // The placement ID from the network that showed the ad}
您还可以获取收入值的精确度评估,如下所示:
String revenuePrecision = ad.getRevenuePrecision();
val revenuePrecision = ad.revenuePrecision
该精确度采用下列值之一:
"publisher_defined"
- 收入金额为开发者指定的价格
"exact"
- 收入金额为实时竞价的结果
"estimated"
- 收入金额基于 Auto-CPM 或 FB 竞价估算
"undefined"
- 未定义收入金额,也没有足够的数据来估算
""
- 收入和精确度无效(例如在测试模式下)
建立广告请求回传
要监听广告请求的发出,请设置一个 MaxAdRequestListener
,安装它的 onAdRequestStarted()
方法,然后将该监听器传递至 setRequestListener()
。
以下示例展示了如何在 “ad request started” 回传中执行此操作:
@Overridepublic void onAdRequestStarted(final String adUnitId){ // Ad request started here}
override fun onAdRequestStarted(adUnitId: String){ // Ad request started here}
选择性初始化
您可以针对指定广告单元初始化 SDK。 此时,SDK 只会初始化您为指定广告单元配置的广告平台。 如果未指定任何广告单元,SDK 会假定当前会话需要您的所有广告单元。 此时,SDK 会初始化您为这些广告单元配置的全部平台。 以下示例展示了如何实施此功能:
AppLovinSdkSettings settings = new AppLovinSdkSettings( context );List<String> adUnitIds = new ArrayList<>();adUnitIds.add( "«ad-unit-ID-1»" );adUnitIds.add( "«ad-unit-ID-2»" );settings.setInitializationAdUnitIds( adUnitIds );
AppLovinSdk sdk = AppLovinSdk.getInstance( settings, context );sdk.setMediationProvider( "max" );sdk.initializeSdk( new AppLovinSdk.SdkInitializationListener() { @Override public void onSdkInitialized(final AppLovinSdkConfiguration config) { ⋮ }} );
val settings = AppLovinSdkSettings( context )settings.initializationAdUnitIds = arrayListOf( "«ad-unit-ID-1»", "«ad-unit-ID-2»" )
val sdk = AppLovinSdk.getInstance( settings, context );sdk.mediationProvider = "max"sdk.initializeSdk({ config -> ⋮})
Waterfall Information API
Waterfall Information API 可向您展示广告的当前瀑布流 (已加载或加载失败的广告)。 API 会返回瀑布流中每则广告的广告加载状态、延迟、配置信息和聚合平台信息。 如果瀑布流中的广告加载失败,API 会提供错误信息。
Android SDK 10.3.5 及之后的版本均支持该 API。
AdLoadState 值
值 | 解释 |
---|---|
0 | 未尝试加载广告 |
1 | 广告已加载 |
2 | 广告加载失败 |
示例
- Java
- Kotlin
- 输出
@Overridepublic 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 ); }}
@Overridepublic 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: ControlWaterfall latency was: 6668 millisecondsNetwork -> 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}]
自定义横幅 / MREC 广告刷新
您可以通过 API 自定义横幅和 MREC 广告的刷新间隔,就像在广告单元 UI 中进行配置一样。 刷新间隔最短不能低于 10 秒,最长不能超过 120 秒。 超出这些限制的值将被忽略。 以下代码示例展示了如何自定义刷新间隔:
// Where adView is an instance of MaxAdViewadView.setExtraParameter( "ad_refresh_seconds", «ad-refresh-rate» );
// Where adView is an instance of MaxAdViewadView.setExtraParameter( "ad_refresh_seconds", «ad-refresh-rate» )