您可以为每个广告单元设置广告位名称 (例如 “Rewarded VideoLevels”、“INTER_levelEnd” 或 “RewardedVideoCoinStore”)。 这可以帮助您汇总不同广告位类别的统计数据。 下面的片段展示了如何为不同的广告格式设置广告位名称。
对于 banner 和 MREC,您必须在加载 banner 或 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»" )
MaxAdPlacerSettings settings = new MaxAdPlacerSettings( "«ad-unit-ID»" );
settings.setPlacement( "«placement»" );
val settings = MaxAdPlacerSettings( "«ad-unit-ID»" )
settings.placement = "«placement»"
您可以在启动应用时将某些 mediation SDK network 的音频设为静音。 通过 AppLovin SDK 支持此功能的 network 如下:
对于其他 network,请咨询您的 network 账户团队,了解此功能是否可用以及如何访问。
下面的代码片段展示了如何在支持此功能的 network 中静音音频:
AppLovinSdk sdk = AppLovinSdk.getInstance( context );
sdk.getSettings().setMuted( true ); // to mute
sdk.getSettings().setMuted( false ); // to unmute
val sdk = AppLovinSdk.getInstance( context )
sdk.settings.setMuted( true ) // to mute
sdk.settings.setMuted( false ) // to unmute
在加载广告之前设置静音状态。 有些 network (如 Google bidding 和 Google AdMob) 会基于广告加载前的静音状态返回静音或未静音的视频。
注意:静音广告可能会导致广告收入下降。
在 SDK 设置对象中设置布尔标记,以启用详细日志:
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]”。
您可以调取各个聚合 network 已展示广告的 Creative ID 和 network 名称。 请参阅 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() )
}
您可以在客户端访问 impression 层级的用户收入数据。 您可以使用此数据来比较不同的来源 and campaign。 您也可以使用 MAX 用户收入 API 访问此数据。 需要访问此数据的 MMP,请参阅针对 MMP 的 impression 层级用户收入 API 文档。
您可以针对所有受支持的 network 与 Adjust 等移动监测合作伙伴分享 impression 层级广告收入数据。
您可以在所有广告生命周期回传中调取收入金额。
为此,请创建一个 MaxAdRevenueListener,实现它的 onAdRevenuePaid() 方法,然后将该监听器传递至 setRevenueListener()。
以下示例展示了如何在 “ad revenue paid” 回传中执行此操作:
@Override
public void 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
}
出现错误时,ad.getRevenue()/ad.revenue 的值可能为 -1。
您还可以获取收入值的精确度评估,如下所示:
String revenuePrecision = ad.getRevenuePrecision();
val revenuePrecision = ad.revenuePrecision
该精确度采用下列值之一:
"publisher_defined""exact""estimated""undefined"""要监听广告请求,请设置 MaxAdRequestListener,实现其 onAdRequestStarted() 方法,并将该监听器传递给 setRequestListener()。
以下示例展示了如何实现此类 “ad request started” 回传:
@Override
public void onAdRequestStarted(final String adUnitId)
{
// Ad request started here
}
override fun onAdRequestStarted(adUnitId: String)
{
// Ad request started here
}
您可以通过在 AppLovinSdkInitializationConfiguration 中指定广告单元,来使用特定的广告单元初始化 SDK。
如果这样做,SDK 将仅初始化您为所指定广告单元配置的 network。
如果您未指定任何广告单元,SDK 将假定当前会话需要您的所有广告单元。
在这种情况下,它会初始化您为这些广告单元配置的所有 network。
以下示例展示了如何实现此功能:
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 ->
⋮
}
您可以在 AppLovin dashboard 的 Account > General > Keys 部分找到您的 SDK key。
当您使用选择性初始化时,MAX 会在当前会话中排除任何您未明确指定的广告单元来展示广告。
当您启用 测试模式 时,选择性初始化将不起作用。
waterfall 信息 API 可向您展示广告的当前 waterfall (已加载或加载失败的广告)。 API 会返回 waterfall 中每则广告的广告加载状态、延迟、配置信息和聚合 network 信息。 如果 waterfall 中的广告加载失败,API 会提供错误信息。
| 值 | 解释 |
|---|---|
| 0 | 未尝试加载广告 |
| 1 | 广告已加载 |
| 2 | 广告加载失败 |
@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" )
}
您可以通过 API 自定义 banner 和 MREC 广告的刷新间隔,就像在广告单元 UI 中配置它们一样。 允许的最小和最大刷新间隔分别为 10 秒和 120 秒。 MAX 会忽略这些限制之外的值。 以下代码示例展示了如何自定义这些刷新间隔:
// Where adView is an instance of MaxAdView
adView.setExtraParameter( "ad_refresh_seconds", «ad-refresh-rate» );
// Where adView is an instance of MaxAdView
adView.setExtraParameter( "ad_refresh_seconds", «ad-refresh-rate» )