Triển khai gốc AFS dành cho Android

SDK quảng cáo trên thiết bị di động của Google cũng hỗ trợ kiểu tìm kiếm tuỳ chỉnh. Nếu ứng dụng đã sử dụng SDK Quảng cáo của Google trên thiết bị di động, bạn nên sử dụng phiên bản SDK AFSMA.

Nếu bạn đang nâng cấp lên phiên bản 19.0.0 trở lên từ 18.1.0 trở xuống, vui lòng xem hướng dẫn di chuyển của chúng tôi.

Điều kiện tiên quyết

Hướng dẫn triển khai này giả định rằng bạn đã quen với các yêu cầu sau:

Nhập SDK gốc AFS

Thêm SDK

Để thêm SDK gốc AFS vào ứng dụng của bạn, hãy làm như sau:

Mở tệp build.gradle bên trong thư mục mô-đun ứng dụng của bạn. Thêm quy tắc bản dựng mới trong dependencies cho phiên bản mới nhất của SDK:

dependencies {
  implementation 'com.google.android.gms:play-services-afs-native:19.0.3'
}

Đảm bảo rằng build.gradle cấp cao nhất của bạn chứa tệp tham chiếu đến kho lưu trữ google() hoặc maven { url "https://maven.google.com" }.

Làm theo các hướng dẫn này để đưa Trình bổ trợ so khớp phiên bản độc lập của Google Play vào dự án của bạn. Việc áp dụng trình bổ trợ này gây ra lỗi bản dựng gradle khi SDK gốc AFS được dùng với một phiên bản Dịch vụ Google Play không tương thích, thay vì cho phép ứng dụng tạo bản dựng nhưng có thể gây ra sự cố trong thời gian chạy. Hoặc áp dụng failOnVersionConflict() ResolutionStrategy cho dự án của bạn để gây ra lỗi bản dựng khi sử dụng các phiên bản Dịch vụ Google Play không tương thích trong dự án. Lưu các thay đổi rồi nhấp vào Sync Project with Gradle Files (Đồng bộ hoá dự án với tệp Gradle) trên thanh công cụ.

Sử dụng AndroidX thay vì Thư viện hỗ trợ Android

Kể từ phiên bản 17.0.0 của SDK, ứng dụng của bạn phải sử dụng Thư viện Jetpack (AndroidX) thay vì Thư viện hỗ trợ Android. Yêu cầu về khả năng tương thích:

  • Thiết lập com.android.tools.build:gradle thành phiên bản 3.2.1 trở lên.
  • Đặt compileSdkVersion thành 28 trở lên.
  • Cập nhật ứng dụng để sử dụng Jetpack (AndroidX); làm theo hướng dẫn trong bài viết Di chuyển sang AndroidX.

Lớp

Để phân phát quảng cáo gốc AFS trong ứng dụng của bạn, hãy triển khai các lớp sau:

SearchAdController

  • Lớp này chịu trách nhiệm yêu cầu quảng cáo không đồng bộ, lưu vào bộ nhớ đệm và truy xuất quảng cáo cũng như hiển thị quảng cáo.
  • Mỗi ngữ cảnh quảng cáo cần một SearchAdController riêng; ví dụ: nếu bạn có một màn hình hiển thị quảng cáo cùng với danh sách kết quả tìm kiếm và một màn hình khác hiển thị quảng cáo cùng với thông tin chi tiết về một sản phẩm cụ thể, thì bạn nên tạo hai phiên bản SearchAdController riêng biệt, mỗi phiên bản cho một trường hợp.
  • Hàm khởi tạo cần được cung cấp mã thuộc tính web (mã nhà xuất bản), mã kiểu để áp dụng cho quảng cáo được trả về và SearchAdOptions. Context được cung cấp trong hàm khởi tạo phải là Activity chứa SearchAdController và nơi bạn sẽ đặt quảng cáo View.
  • Gọi loadAds để cho biết có người dùng mới tìm kiếm và bắt đầu một yêu cầu quảng cáo không đồng bộ. Mọi quảng cáo được tải từ các lệnh gọi trước đó đến loadAds sẽ bị xoá khỏi bộ nhớ đệm quảng cáo nội bộ khi thực hiện lệnh gọi mới.
  • Tạo View với createAdView để hiển thị mẫu quảng cáo.
  • Sau khi quảng cáo tải xong, hãy gọi populateAdView bằng View được tạo trước đó bằng createAdView để hiển thị quảng cáo đã lưu vào bộ nhớ đệm vào View đó. Ngoài View sẽ được điền, hãy cung cấp adKey – một chuỗi tuỳ ý để xác định riêng quảng cáo. Phương thức này liên kết mẫu quảng cáo cụ thể được trả về từ bộ nhớ đệm với adKey đó. Vì vậy, khi cùng một adKey được chuyển đến lệnh gọi trong tương lai đến populateAdView, hệ thống sẽ trả về cùng một quảng cáo đó. Ví dụ: nếu populateAdView được gọi lần đầu tiên bằng adKey="keyA" và hiển thị quảng cáo cho giày đi bộ đường dài, thì mỗi lệnh gọi tiếp theo đến populateAdView cùng với adKey="keyA" sẽ điền cùng một quảng cáo cho giày đi bộ đường dài. (Việc thực hiện lệnh gọi mới đến loadAds sẽ xoá tất cả quảng cáo đã lưu vào bộ nhớ đệm và khoá quảng cáo liên quan.)

SearchAdOptions

  • Truyền đối tượng này đến hàm khởi tạo SearchAdController để tuỳ chỉnh cách quảng cáo được yêu cầu và hiển thị. Gọi build() trên SearchAdOptions.Builder để tạo đối tượng SearchAdOptions.

View

  • Tạo đối tượng View để giữ quảng cáo bằng cách gọi createAdView() trên SearchAdController. Hiển thị tối đa một quảng cáo mỗi lần, nhưng cùng một View có thể được tái chế để hiển thị các quảng cáo khác nhau theo thời gian.

SearchAdRequest

  • Hãy gọi phương thức loadAds trên SearchAdController bằng SearchAdRequest để bắt đầu một yêu cầu quảng cáo không đồng bộ. Gọi build() trên SearchAdRequest.Builder để tạo đối tượng SearchAdRequest.

AdListener

  • Triển khai giao diện này và truyền giao diện đến hàm khởi tạo SearchAdController để đăng ký lệnh gọi lại cho một số trạng thái.
  • Lưu ý: Lệnh gọi lại AdListener sẽ không được gọi theo yêu cầu đã huỷ (lệnh gọi đến loadAds đã bị một lệnh gọi khác đến loadAds giành quyền trước khi lệnh gọi đầu tiên được giải quyết).

Cách triển khai mẫu

Ví dụ bên dưới minh hoạ cách tạo SearchAdController trong Activity mẫu.

//  MainActivity.java implementation
//  (MainActivity is a subclass of Activity)

SearchAdController adController;
// adContainer where we will place our ads in this example.
ViewGroup adContainer;

protected void onCreate(Bundle bundle){
  super.onCreate(bundle);
  adContainer = (ViewGroup) findViewById(...);
  // Specify ad options (not required).
  SearchAdOptions.Builder adOptionsBuilder = new SearchAdOptions.Builder();
  adOptionsBuilder.setAdType(SearchAdOptions.AD_TYPE_TEXT);
  adOptionsBuilder.setPrefetch(true);
  adOptionsBuilder.setNumAdsRequested(3);
  // Provide a callback to trigger when ads are loaded.
  AdListener adListener = new AdListener() {
    public void onAdLoaded() {
      createAndShowAd();
    }
  };
  // Instantiate the SearchAdController.
  adController = new SearchAdController(this, "your-client-id", "your-style-id",
                                        adOptionsBuilder.build(), adListener);
}

Khi người dùng bắt đầu một truy vấn, hãy tạo một SearchAdRequest và gọi loadAds trên SearchAdController để bắt đầu một yêu cầu quảng cáo không đồng bộ.

// Create the request.
SearchAdRequest.Builder requestBuilder = new SearchAdRequest.Builder();
requestBuilder.setQuery("user query here");
// Load the ads.
adController.loadAds(requestBuilder.build());

Triển khai lệnh gọi lại onAdLoaded để điền quảng cáo đã tải vào chế độ xem quảng cáo.

private void createAndShowAd() {
  // Create a new view that will contain the ad.
  View adView = adController.createAdView();
  // Attach the new view to the view hierarchy.
  adContainer.addView(adView);
  // Display the ad inside the adView. We need to provide an adKey to
  // indicate which ad is to be displayed in the adView. In this example, 
  // since we only have one ad, we can provide any constant string. However, 
  // if you intend to display multiple ads, each ad you wish to display
  // should be given a unique adKey of your choosing.
  adController.populateAdView(adView, "demoAd");
}

Giờ đây, quảng cáo liên quan đến cụm từ tìm kiếm nhất định sẽ xuất hiện trong adView.

Điều tra lỗi

SearchAdController yêu cầu đối tượng AdListener bằng phương thức onAdLoaded() để thông báo cho ứng dụng của bạn rằng quảng cáo đã sẵn sàng hiển thị. Bạn cũng nên triển khai phương thức onAdFailedToLoad() để có thể phát hiện và sửa lỗi. Ví dụ: bạn có thể sử dụng AdListener sau đây để gỡ lỗi cho quá trình triển khai của mình:

AdListener adListener = new AdListener() {
    public void onAdLoaded() {
        // Called when an ad is loaded.
        Toast.makeText(MainActivity.this, "Ad Loaded",
                Toast.LENGTH_SHORT).show();
        Log.d(MainActivity.class.getSimpleName(), "Ad Loaded");
    }

    public void onAdLeftApplication() {
        // Called when an ad leaves the application
        // (to go to the browser for example).
        Toast.makeText(MainActivity.this, "Ad Left Application",
                Toast.LENGTH_SHORT).show();
        Log.d(MainActivity.class.getSimpleName(), "Ad Left Application");
    }

    @Override
    public void onAdFailedToLoad(int errorCode) {
        // Called when an ad request failed.
        Toast.makeText(MainActivity.this, "Ad Failed to Load: " + errorCode,
                Toast.LENGTH_SHORT).show();
        Log.e(MainActivity.class.getSimpleName(), "Ad Failed to Load: " +
                errorCode);
    }
};

Các hằng số dùng trong phương thức gọi lại onAdFailedToLoad() được xác định trong AdListener.