Ngoài các định dạng gốc do hệ thống xác định, nhà xuất bản Ad Manager có thể
tạo định dạng quảng cáo gốc riêng bằng cách xác định danh sách tuỳ chỉnh chứa các
thành phần. Những định dạng này được gọi là định dạng quảng cáo gốc tuỳ chỉnh và có thể dùng với quảng cáo đặt trước. Điều này cho phép nhà xuất bản chuyển dữ liệu có cấu trúc tuỳ ý đến các ứng dụng của họ. Những quảng cáo này được biểu thị bằng đối tượng
NativeCustomFormatAd.
Tải định dạng quảng cáo gốc tuỳ chỉnh
Hướng dẫn này giải thích cách tải và hiển thị định dạng quảng cáo gốc tuỳ chỉnh.
Tải quảng cáo gốc tuỳ chỉnh
Giống như quảng cáo gốc,
định dạng quảng cáo gốc tuỳ chỉnh được tải bằng lớp AdLoader:
Java
AdLoader adLoader = new AdLoader.Builder(this, "/21775744923/example/native") .forCustomFormatAd("12387226", new NativeCustomFormatAd.OnCustomFormatAdLoadedListener() { @Override public void onCustomFormatAdLoaded(NativeCustomFormatAd ad) { // Show the custom format and record an impression. } }, new NativeCustomFormatAd.OnCustomClickListener() { @Override public void onCustomClick(NativeCustomFormatAd ad, String s) { // Handle the click action } }) .forCustomFormatAd("12406343", new NativeCustomFormatAd.OnCustomFormatAdLoadedListener() { @Override public void onCustomFormatAdLoaded(NativeCustomFormatAd ad) { // Show the custom format and record an impression. } }, new NativeCustomFormatAd.OnCustomClickListener() { @Override public void onCustomClick(NativeCustomFormatAd ad, String s) { // Handle the click action } }) .build();
Kotlin
val adLoader = AdLoader.Builder(this, "/21775744923/example/native") .forCustomFormatAd( "12387226", { customFormatAd -> // Show the custom format and record an impression. }, { customFormatAd, s -> // Handle the click action }) .forCustomFormatAd( "12406343", { customFormatAd -> // Show the custom format and record an impression. }, { customFormatAd, s -> // Handle the click action }) .build()
Phương thức forCustomFormatAd định cấu hình AdLoader để yêu cầu các định dạng quảng cáo gốc tuỳ chỉnh. Bạn có thể gọi phương thức này nhiều lần cho nhiều mã định dạng tuỳ chỉnh. Phương thức này chấp nhận các tham số sau:
- Mã định dạng quảng cáo gốc tuỳ chỉnh mà
AdLoadersẽ yêu cầu. Mỗi định dạng quảng cáo gốc tuỳ chỉnh đều được liên kết với một mã nhận dạng. Thông số này cho biết định dạng mà ứng dụng của bạn muốnAdLoadergửi yêu cầu. OnCustomFormatAdLoadedListenerđược gọi khi quảng cáo đã tải thành công.OnCustomClickListener(không bắt buộc) được gọi khi người dùng nhấn hoặc nhấp vào quảng cáo. Để biết thêm thông tin về trình nghe này, hãy xem phần "Xử lý lượt nhấp và lượt hiển thị".
Vì một đơn vị quảng cáo có thể được thiết lập để phân phát nhiều định dạng mẫu quảng cáo, nên forCustomFormatAd có thể được gọi nhiều lần với nhiều mã định dạng riêng biệt để chuẩn bị trình tải quảng cáo cho nhiều hơn một định dạng quảng cáo gốc tuỳ chỉnh có thể có.
Mã định dạng quảng cáo gốc tuỳ chỉnh
Bạn có thể tìm thấy mã định dạng dùng để xác định định dạng quảng cáo gốc tuỳ chỉnh trong giao diện người dùng Ad Manager trong mục Quảng cáo gốc bên trong trình đơn thả xuống Phân phối:

Mỗi mã định dạng quảng cáo gốc tuỳ chỉnh đều xuất hiện bên cạnh tên của định dạng đó. Khi nhấp vào một trong các tên, bạn sẽ được chuyển đến màn hình chi tiết cho thấy thông tin về các trường của định dạng:

Tại đây, bạn có thể thêm, chỉnh sửa và xoá từng trường. Lưu ý Tên của từng thành phần. Tên là khoá dùng để lấy dữ liệu cho mỗi thành phần khi hiển thị định dạng quảng cáo gốc tuỳ chỉnh.
Hiển thị định dạng quảng cáo gốc tuỳ chỉnh
Định dạng quảng cáo gốc tuỳ chỉnh khác với định dạng do hệ thống xác định ở chỗ nhà xuất bản có quyền xác định danh sách thành phần riêng để tạo nên một quảng cáo. Do đó, quy trình hiển thị quảng cáo gốc tuỳ chỉnh sẽ khác với quy trình hiển thị định dạng quảng cáo do hệ thống xác định ở một số điểm sau:
- Bạn có thể sử dụng thành phần văn bản và thành phần hình ảnh thông qua phương thức getter
getText()vàgetImage(). Các phương thức này lấy tên trường làm tham số. - Do không có lớp
ViewGroupchuyên biệt để đăng ký với Google, nên bạn cần ghi lại lượt hiển thị và lượt nhấp theo cách thủ công. - Quảng cáo gốc tuỳ chỉnh có nội dung nghe nhìn
nullnếu quảng cáo không chứa thành phần video.
Dưới đây là một hàm mẫu hiển thị NativeCustomFormatAd:
Java
public void displayCustomFormatAd (ViewGroup parent, NativeCustomFormatAd customFormatAd) { // Inflate a layout and add it to the parent ViewGroup. LayoutInflater inflater = (LayoutInflater) parent.getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View adView = inflater.inflate(R.layout.custom_format_ad, parent); // Locate the TextView that will hold the value for "Headline" and // set its text. TextView myHeadlineView = (TextView) adView.findViewById(R.id.headline); myHeadlineView.setText(customFormatAd.getText("Headline")); // Locate the ImageView that will hold the value for "MainImage" and // set its drawable. Button myMainImageView = (ImageView) adView.findViewById(R.id.main_image); myMainImageView.setImageDrawable( customFormatAd.getImage("MainImage").getDrawable()); ... // Continue locating views and displaying assets until finished. ... }
Kotlin
public fun displayCustomFormatAd (parent: ViewGroup, customFormatAd: NativeCustomFormatAd) { val adView = layoutInflater .inflate(R.layout.ad_simple_custom_format, null) val myHeadlineView = adView.findViewById<TextView>(R.id.headline) myHeadlineView.setText(customFormatAd.getText("Headline")); // Locate the ImageView that will hold the value for "MainImage" and // set its drawable. val myMainImageView = adView.findViewById(R.id.main_image); myMainImageView.setImageDrawable( customFormatAd.getImage("MainImage").drawable); ... // Continue locating views and displaying assets until finished. ... }
Video gốc cho định dạng quảng cáo gốc tuỳ chỉnh
Khi tạo định dạng tuỳ chỉnh, bạn có thể chọn đặt định dạng đó đủ điều kiện cho video.
Trong quá trình triển khai ứng dụng, bạn có thể sử dụng NativeCustomFormatAd.getMediaContent() để lấy nội dung nghe nhìn. Sau đó, hãy gọi setMediaContent() để đặt nội dung nghe nhìn trên chế độ xem nội dung nghe nhìn.
Nếu quảng cáo có nội dung nghe nhìn null, hãy lập kế hoạch thay thế để hiển thị quảng cáo mà không có video.
Ví dụ sau đây kiểm tra xem quảng cáo có nội dung video hay không và hiển thị hình ảnh thay cho video nếu không có video:
Java
// Called when a custom native ad loads. @Override public void onCustomFormatAdLoaded(final NativeCustomFormatAd ad) { MediaContent mediaContent = ad.getMediaContent(); // Assumes you have a FrameLayout in your view hierarchy with the ID media_placeholder. FrameLayout mediaPlaceholder = (FrameLayout) findViewById(R.id.media_placeholder); // Apps can check the MediaContent's hasVideoContent property to determine if the // NativeCustomFormatAd has a video asset. if (mediaContent != null && mediaContent.hasVideoContent()) { MediaView mediaView = new MediaView(mediaPlaceholder.getContext()); mediaView.setMediaContent(mediaContent); mediaPlaceholder.addView(mediaView); // Create a new VideoLifecycleCallbacks object and pass it to the VideoController. The // VideoController will call methods on this object when events occur in the video // lifecycle. VideoController vc = mediaContent.getVideoController(); vc.setVideoLifecycleCallbacks( new VideoController.VideoLifecycleCallbacks() { @Override public void onVideoEnd() { // Publishers should allow native ads to complete video playback before // refreshing or replacing them with another ad in the same UI location. super.onVideoEnd(); } }); } else { ImageView mainImage = new ImageView(this); mainImage.setAdjustViewBounds(true); mainImage.setImageDrawable(ad.getImage("MainImage").getDrawable()); mediaPlaceholder.addView(mainImage); mainImage.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { ad.performClick("MainImage"); } }); } }
Kotlin
// Called when a custom native ad loads. NativeCustomFormatAd.OnCustomFormatAdLoadedListener { ad -> val mediaContent = ad.mediaContent // Apps can check the MediaContent's hasVideoContent property to determine if the // NativeCustomFormatAd has a video asset. if (mediaContent != null && mediaContent.hasVideoContent()) { val mediaView = MediaView(mediaPlaceholder.getContest()) mediaView.mediaContent = mediaContent val videoController = mediaContent.videoController // Create a new VideoLifecycleCallbacks object and pass it to the VideoController. The // VideoController will call methods on this object when events occur in the video // lifecycle. if (videoController != null) { videoController.videoLifecycleCallbacks = object : VideoController.VideoLifecycleCallbacks() { override fun onVideoEnd() { // Publishers should allow native ads to complete video playback before refreshing // or replacing them with another ad in the same UI location. super.onVideoEnd() } } } } else { val mainImage = ImageView(this) mainImage.adjustViewBounds = true mainImage.setImageDrawable(ad.getImage("MainImage")?.drawable) mainImage.setOnClickListener { ad.performClick("MainImage") } customTemplateBinding.simplecustomMediaPlaceholder.addView(mainImage) } }
Tải ví dụ về tính năng Hiển thị tuỳ chỉnh của Ad Manager xuống để xem ví dụ thực tế về video gốc.
Xem Quảng cáo dạng video để biết thêm thông tin về cách tuỳ chỉnh trải nghiệm video của quảng cáo gốc tuỳ chỉnh.
Hiển thị biểu tượng Lựa chọn quảng cáo
Trong khuôn khổ chương trình Hỗ trợ Đạo luật Dịch vụ kỹ thuật số (DSA), quảng cáo đặt trước được phân phát ở Khu vực kinh tế Châu Âu (EEA) phải có biểu tượng Lựa chọn quảng cáo và một đường liên kết đến trang Thông tin về quảng cáo này của Google. Khi triển khai quảng cáo gốc tuỳ chỉnh, bạn có trách nhiệm hiển thị biểu tượng Lựa chọn quảng cáo. Bạn nên thực hiện các bước để hiển thị và đặt trình nghe lượt nhấp cho biểu tượng Lựa chọn quảng cáo khi hiển thị các thành phần quảng cáo chính.
Ví dụ sau đây giả định rằng bạn đã xác định một phần tử <ImageView /> trong hệ phân cấp view để giữ biểu trưng Lựa chọn quảng cáo.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:id="@+id/adChoices"
android:layout_width="15dp"
android:layout_height="15dp"
android:adjustViewBounds="true"
android:contentDescription="AdChoices icon." />
</LinearLayout>
Các ví dụ sau đây hiển thị biểu tượng Lựa chọn quảng cáo và định cấu hình hành vi nhấp chuột thích hợp.
Java
private AdSimpleCustomTemplateBinding customTemplateBinding;
private void populateAdView(final NativeCustomFormatAd nativeCustomFormatAd) {
// Render the AdChoices icon.
String adChoicesKey = NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW;
NativeAd.Image adChoicesAsset = nativeCustomFormatAd.getImage(adChoicesKey);
if (adChoicesAsset == null) {
customTemplateBinding.adChoices.setVisibility(View.GONE);
} else {
customTemplateBinding.adChoices.setVisibility(View.VISIBLE);
customTemplateBinding.adChoices.setImageDrawable(adChoicesAsset.getDrawable());
// Enable clicks on AdChoices.
customTemplateBinding.adChoices.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
nativeCustomFormatAd.performClick(adChoicesKey);
}
});
}
...
}
Kotlin
private lateinit var customTemplateBinding: AdSimpleCustomTemplateBinding
private fun populateAdView(nativeCustomFormatAd: NativeCustomFormatAd) {
// Render the AdChoices icon.
val adChoicesKey = NativeAdAssetNames.ASSET_ADCHOICES_CONTAINER_VIEW
val adChoicesAsset = nativeCustomFormatAd.getImage(adChoicesKey)
if (adChoicesAsset == null) {
customTemplateBinding.adChoices.visibility = View.GONE
} else {
customTemplateBinding.adChoices.setImageDrawable(adChoicesAsset.drawable)
customTemplateBinding.adChoices.visibility = View.VISIBLE
// Enable clicks on AdChoices.
customTemplateBinding.adChoices.setOnClickListener {
nativeCustomFormatAd.performClick(adChoicesKey)
}
}
...
}
Ghi lại lượt hiển thị và báo cáo lượt nhấp
Ứng dụng của bạn có trách nhiệm ghi lại các lượt hiển thị và báo cáo sự kiện nhấp chuột cho Google Mobile Ads SDK (Legacy).
Ghi lại lượt hiển thị
Để ghi lại lượt hiển thị cho một quảng cáo gốc tuỳ chỉnh, hãy gọi phương thức recordImpression() của quảng cáo:
myCustomFormatAd.recordImpression();
Nếu ứng dụng của bạn vô tình gọi phương thức này hai lần cho cùng một quảng cáo, thì SDK sẽ tự động ngăn việc ghi lại lượt hiển thị trùng lặp cho một yêu cầu.
Báo cáo lượt nhấp
Để báo cáo cho SDK biết rằng một lượt nhấp đã xảy ra trên một chế độ xem thành phần, hãy gọi phương thức performClick() của quảng cáo. Cung cấp tên của thành phần được nhấp vào
bằng cách sử dụng cùng một chuỗi mà bạn đã xác định trong giao diện người dùng Ad Manager.
myCustomFormatAd.performClick("MainImage");
Xin lưu ý rằng bạn không cần phải gọi phương thức này cho mỗi chế độ xem được liên kết với quảng cáo. Nếu bạn có một trường khác là "Chú thích" (bạn chỉ hiển thị mà không cho người dùng nhấp hay nhấn vào trường này), thì ứng dụng của bạn không cần gọi phương thức performClick cho chế độ xem của thành phần đó.
Phản hồi hành động nhấp tuỳ chỉnh
Khi một lượt nhấp được thực hiện trên một quảng cáo có định dạng tuỳ chỉnh, SDK có thể phản hồi theo 3 cách, theo thứ tự sau:
- Gọi
OnCustomClickListenernếu có. - Đối với mỗi URL liên kết sâu của quảng cáo, hãy cố gắng tìm trình phân giải nội dung và bắt đầu phân giải nội dung đầu tiên.
- Mở một trình duyệt rồi chuyển đến URL đích của quảng cáo đó.
Để triển khai một hành động nhấp tuỳ chỉnh, hãy cung cấp một OnCustomClickListener:
Java
AdLoader adLoader = new AdLoader.Builder(context, "/21775744923/example/native") .forCustomFormatAd("10063170", new NativeCustomFormatAd.OnCustomFormatAdLoadedListener() { // Display the ad. }, new NativeCustomFormatAd.OnCustomClickListener() { @Override public void onCustomClick(NativeCustomFormatAd ad, String assetName) { Log.i("MyApp", "A custom click just happened for " + assetName + "!"); } }).build();
Kotlin
val adLoader = AdLoader.Builder(this, "/21775744923/example/native") .forCustomFormatAd("10063170", { ad -> // Display the ad. }, { ad, assetName -> Log.i("MyApp", "A custom click just happened for $assetName!") }).build()
Ban đầu, có thể bạn sẽ thấy lạ khi có trình theo dõi lượt nhấp tuỳ chỉnh. Sau cùng, ứng dụng của bạn vừa thông báo cho SDK rằng đã có một lượt nhấp, vậy tại sao SDK lại phải báo cáo lại điều đó cho ứng dụng?
Luồng thông tin này hữu ích vì một số lý do, nhưng quan trọng nhất là luồng thông tin này cho phép SDK duy trì quyền kiểm soát phản hồi đối với lượt nhấp. Ví dụ: SDK có thể tự động ping URL theo dõi của bên thứ ba đã được đặt cho mẫu quảng cáo và ngầm xử lý các nhiệm vụ khác mà không cần thêm bất kỳ mã nào.