第一步是将 Android PAL SDK 添加到您的应用中。
将 Android PAL SDK 添加为库
从 18.0.0 版开始,PAL SDK 托管在 Google 的 Maven 制品库中, 可以按如下方式添加到您的应用中:
app/build.gradle
...
dependencies {
implementation 'com.google.android.gms:play-services-pal:20.2.0'
...
}
或者,您也可以从 Google 的 Maven 制品库下载 PAL SDK,然后手动将其添加到您的应用。
生成 Nonce
“Nonce”是由 PAL 使用 NonceLoader
生成的单个加密字符串。
PAL SDK 要求每个新的视频流请求附带新的
生成的 Nonce。不过,Nonce 可重复用于
同一直播要使用 PAL SDK 生成 Nonce,请将
MyActivity.java
。如需查看使用 PAL 生成 Nonce 的示例应用,
请从
GitHub
首先,您需要导入 PAL SDK,创建一些私有属性来存储
NonceLoader
和 NonceManager
,然后初始化 NonceLoader。
我们建议您仅创建 NonceLoader
类的一个实例,
每次用户会话,除非您的应用包含多个页面或等效页面
。这将使网页 Correlator (&correlator
)保持不变
网页的生命周期或用户会话的整个生命周期您仍然可以控制
视频流 Correlator (&scor
),应针对每个新的视频流重置一次。
同一广告串的所有广告请求都应具有相同的 NonceLoader
和广告串相关值,以便频次上限和竞争排除功能正常运行。
import android.app.Activity;
import android.os.Bundle;
import com.google.ads.interactivemedia.pal.NonceLoader;
import com.google.ads.interactivemedia.pal.NonceManager;
import com.google.ads.interactivemedia.pal.NonceRequest;
import com.google.ads.interactivemedia.pal.ConsentSettings;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import java.util.HashSet;
import java.util.Set;
public class MainActivity extends Activity {
...
private NonceLoader nonceLoader;
private NonceManager nonceManager = null;
private ConsentSettings consentSettings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The default value for allowStorage() is false, but can be
// changed once the appropriate consent has been gathered. The
// getConsentToStorage() method is a placeholder for the publisher's own
// method of obtaining user consent, either by integrating with a CMP or
// based on other methods the publisher chooses to handle storage consent.
boolean isConsentToStorage = getConsentToStorage();
videoView = findViewById(R.id.video_view);
videoView.setOnTouchListener(this::onVideoViewTouch);
consentSettings = ConsentSettings.builder()
.allowStorage(isConsentToStorage)
.build();
// It is important to instantiate the NonceLoader as early as possible to
// allow it to initialize and preload data for a faster experience when
// loading the NonceManager. A new NonceLoader will need to be instantiated
//if the ConsentSettings change for the user.
nonceLoader = new NonceLoader(this, consentSettings);
...
}
接下来,创建一个函数以触发 Nonce 生成。您只需要一个 Nonce
。出于测试目的,
可以在点击测试应用中的按钮时调用此函数。通过
此处设置的 NonceRequest
参数是示例参数。您应该将
根据自己的应用特性确定参数。
此函数会异步触发 Nonce 生成,因此您需要实现 AsyncTask
来处理 Nonce 请求的成功或失败:
public void generateNonceForAdRequest() {
Set supportedApiFrameWorksSet = new HashSet();
// The values 2, 7, and 9 correspond to player support for VPAID 2.0,
// OMID 1.0, and SIMID 1.1.
supportedApiFrameWorksSet.add(2);
supportedApiFrameWorksSet.add(7);
supportedApiFrameWorksSet.add(9);
NonceRequest nonceRequest = NonceRequest.builder()
.descriptionURL("https://example.com/content1")
.iconsSupported(true)
.omidPartnerVersion("6.2.1")
.omidPartnerName("Example Publisher")
.playerType("ExamplePlayerType")
.playerVersion("1.0.0")
.ppid("testPpid")
.sessionId("Sample SID")
.supportedApiFrameworks(supportedApiFrameWorksSet)
.videoPlayerHeight(480)
.videoPlayerWidth(640)
.willAdAutoPlay(true)
.willAdPlayMuted(false)
.build();
NonceCallbackImpl callback = new NonceCallbackImpl();
nonceLoader
.loadNonceManager(nonceRequest)
.addOnSuccessListener(callback)
.addOnFailureListener(callback);
}
private class NonceCallbackImpl implements OnSuccessListener<NonceManager>, OnFailureListener {
@Override
public void onSuccess(NonceManager manager) {
nonceManager = manager;
String nonceString = manager.getNonce();
Log.i("PALSample", "Generated nonce: " + nonceString);
// from here you would trigger your ad request and move on to initialize content
}
@Override
public void onFailure(Exception error) {
Log.e("PALSample", "Nonce generation failed: " + error.getMessage());
}
}
创建 Nonce 管理器后,可以随时使用以下代码检索 Nonce
nonceManager.getNonce()
。
将 Nonce 附加到广告请求中
要使用生成的 Nonce,请在广告代码中附加 givn
参数和
Nonce 值。
/**
* The ad tag for your ad request, for example:
* https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external\
* /single_ad_samples&ciu_szs=300x250&impl=s&gdfp_req=1&env=vp&output=vast&unviewed_position_start=1\
* &cust_params=deployment%3Ddevsite%26sample_ct%3Dlinear&correlator=
*
* For more sample ad tags, see
* developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/tags
*/
private static final String DEFAULT_AD_TAG = "Your ad tag";
...
@Override
public void onSuccess(NonceManager manager) {
nonceManager = manager;
String nonceString = manager.getNonce();
Log.i("PALSample", "Generated nonce: " + nonceString);
// Append the nonce to the ad tag URL.
makeAdRequest(DEFAULT_AD_TAG + "&givn=" + nonceString);
}
跟踪播放事件
最后,您需要为播放器实现各种事件处理脚本。对于 您可以将这些对象附加到按钮点击事件中, 实现,那么这些事件将由相应的播放器事件触发:
public void sendAdClick() {
if (nonceManager != null) {
nonceManager.sendAdClick();
}
}
public void sendPlaybackStart() {
if (nonceManager != null) {
nonceManager.sendPlaybackStart();
}
}
public void sendPlaybackEnd() {
if (nonceManager != null) {
nonceManager.sendPlaybackEnd();
}
}
public void onVideoViewTouch(MotionEvent e) {
if (nonceManager != null) {
nonceManager.sendTouch(e);
}
}
以下是实现中调用各个函数的时机:
sendPlaybackStart()
:视频播放会话开始时sendPlaybackEnd()
:视频播放结束时sendAdClick()
:每当观看者点击广告时sendTouch()
:每次与播放器互动时
(可选)通过第三方广告服务器发送 Google Ad Manager 信号
在设置第三方广告服务器以便与 Google Ad Manager 配合使用时,请参阅 添加到服务器的文档,以捕获并转发每个广告中的 Nonce 值 请求。所提供的示例是一个包含 Nonce 参数的广告请求网址 已包含在内。Nonce 参数会从 PAL SDK 传播到 中介服务器,然后上传到 Ad Manager,从而提高创收能力。
配置您的第三方广告服务器,以在该服务器的 向 Ad Manager 发送广告请求下面是在 第三方广告服务器:
'https://pubads.serverside.net/gampad/ads?givn=%%custom_key_for_google_nonce%%&...'
有关详情,请参阅 Google Ad Manager 服务器端实施 指南。
Ad Manager 会查找 givn=
以标识 Nonce 值。第三方广告服务器需要支持自己的某些宏(例如 %%custom_key_for_google_nonce%%
),并将其替换为您在上一步中提供的 Nonce 查询参数。详细了解如何实现这一目标
。