Собственная реализация AFS для Android

Google Mobile Ads SDK также поддерживает пользовательские стили поиска. Если в вашем приложении уже используется Google Mobile Ads SDK, мы рекомендуем вместо этого использовать версию AFSMA SDK .

Если вы обновляете версию 19.0.0 или более позднюю с версии 18.1.0 или более ранней, ознакомьтесь с нашим руководством по миграции .

Предварительные условия

В этом руководстве по внедрению предполагается, что вы знакомы со следующим:

Импортируйте собственный SDK AFS.

Добавить SDK

Чтобы добавить AFS Native SDK в свое приложение, выполните следующие действия:

Откройте файл build.gradle в каталоге модуля приложения. Добавьте новое правило сборки в разделе dependencies для последней версии SDK:

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

Убедитесь, что ваш build.gradle верхнего уровня содержит ссылку на репозиторий google() или на maven { url "https://maven.google.com" } .

Следуйте этим инструкциям , чтобы включить автономный плагин сопоставления версий Google Play в свой проект. Применение этого плагина вызывает ошибку сборки Gradle, когда AFS Native SDK используется с несовместимой версией Служб Google Play вместо того, чтобы разрешить сборку приложения, но может привести к сбоям во время выполнения. Или примените к своему проекту метод разрешенияfailOnVersionConflict failOnVersionConflict() чтобы вызвать ошибку сборки, когда в вашем проекте используются несовместимые версии Сервисов Google Play. Сохраните изменения и нажмите «Синхронизировать проект с файлами Gradle» на панели инструментов.

Используйте AndroidX вместо библиотек поддержки Android

Начиная с версии 17.0.0 SDK, ваше приложение должно использовать библиотеки Jetpack (AndroidX) вместо библиотек поддержки Android. Требования совместимости:

  • Установите com.android.tools.build:gradle значение v3.2.1 или новее.
  • Установите compileSdkVersion значение 28 или более поздней версии.
  • Обновите свое приложение для использования Jetpack (AndroidX); следуйте инструкциям в разделе «Миграция на AndroidX» .

Классы

Чтобы показывать нативные объявления AFS в своем приложении, реализуйте следующие классы:

SearchAdController

  • Этот класс отвечает за асинхронный запрос рекламы, кэширование и получение рекламы, а также отображение рекламы.
  • Для каждого рекламного контекста требуется отдельный SearchAdController ; например, если у вас есть экран, на котором реклама отображается рядом со списком результатов поиска, и другой экран, на котором реклама отображается вместе с подробной информацией о конкретном продукте, вам следует создать два отдельных экземпляра SearchAdController , по одному для каждого случая.
  • Конструктору необходимо предоставить код вашего веб-ресурса (идентификатор издателя), идентификатор стиля , который будет применяться к возвращаемым объявлениям, и SearchAdOptions . Context , указанный в конструкторе, должен быть Activity , который содержит SearchAdController и где вы разместите View объявления.
  • Вызовите loadAds чтобы указать на поиск нового пользователя и инициировать асинхронный запрос объявления. Любые объявления, загруженные в результате предыдущих вызовов loadAds удаляются из внутреннего кэша объявлений при выполнении нового вызова.
  • Создайте View с помощью createAdView для отображения рекламных объявлений.
  • После загрузки рекламы вызовите populateAdView с View , ранее созданным с помощью createAdView , чтобы отобразить кэшированное объявление в этом View . В дополнение к View , которое необходимо заполнить, укажите adKey — произвольную строку для уникальной идентификации объявления. Это связывает конкретное рекламное объявление, возвращенное из кэша, с этим adKey , поэтому, когда тот же adKey будет передан в будущий вызов populateAdView , будет возвращено то же самое объявление. Например, если populateAdView вызывается в первый раз с adKey="keyA" и отображает рекламу походных ботинок, каждый последующий вызов populateAdView с adKey="keyA" будет заполнять одно и то же объявление о походных ботинках. (При новом вызове loadAds удаляются все кэшированные объявления и связанные с ними ключи объявлений.)

SearchAdOptions

  • Передайте этот объект конструктору SearchAdController , чтобы настроить способ запроса и отображения рекламы. Вызовите build() для SearchAdOptions.Builder , чтобы создать объект SearchAdOptions .

View

  • Создайте объект View для хранения рекламы, вызвав createAdView() в SearchAdController . Одновременно отображается не более одного объявления, но одно и то же View можно использовать повторно для отображения разных объявлений с течением времени.

SearchAdRequest

  • Вызовите метод loadAds в SearchAdController с помощью SearchAdRequest , чтобы инициировать асинхронный запрос объявления. Вызовите build() для SearchAdRequest.Builder , чтобы создать объект SearchAdRequest .

AdListener

  • Реализуйте этот интерфейс и передайте его конструктору SearchAdController , чтобы зарегистрировать обратные вызовы для нескольких состояний.
  • Примечание. Обратные вызовы AdListener не будут вызываться при отмененном запросе (вызов loadAds , который был вытеснен другим вызовом loadAds до разрешения первого вызова).

Пример реализации

В приведенном ниже примере показано создание SearchAdController в образце Activity .

//  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);
}

Когда пользователь инициирует запрос, создайте SearchAdRequest и вызовите loadAds в SearchAdController , чтобы запустить асинхронный запрос объявления.

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

Реализуйте обратный вызов onAdLoaded , чтобы разместить загруженное объявление в представлении объявления.

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");
}

Объявление, связанное с данным запросом, теперь появится в adView .

Расследование ошибок

SearchAdController требуется объект AdListener с методом onAdLoaded() чтобы уведомить ваше приложение о том, что реклама готова к показу. Вам также следует реализовать метод onAdFailedToLoad() чтобы вы могли обнаруживать и исправлять ошибки. Например, вы можете использовать следующий AdListener для отладки вашей реализации:

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);
    }
};

Константы, используемые в методе обратного вызова onAdFailedToLoad() определены в AdListener .