Google Mobile Ads SDK также поддерживает пользовательские стили поиска. Если в вашем приложении уже используется Google Mobile Ads SDK, мы рекомендуем вместо этого использовать версию AFSMA SDK .
Если вы обновляете версию 19.0.0 или более позднюю с версии 18.1.0 или более ранней, ознакомьтесь с нашим руководством по миграции .
Предварительные условия
В этом руководстве по внедрению предполагается, что вы знакомы со следующим:
- Объявления AdSense в пользовательском поиске со стилями пользовательского поиска
- Разработка приложений для Android
Импортируйте собственный 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
, по одному для каждого случая. - Конструктору необходимо предоставить код вашего веб-ресурса (идентификатор издателя), идентификатор стиля , который будет применяться к возвращаемым объявлениям, и
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
удаляются все кэшированные объявления и связанные с ними ключи объявлений.)
- Передайте этот объект конструктору
SearchAdController
, чтобы настроить способ запроса и отображения рекламы. Вызовитеbuild()
дляSearchAdOptions.Builder
, чтобы создать объектSearchAdOptions
.
View
- Создайте объект
View
для хранения рекламы, вызвавcreateAdView()
вSearchAdController
. Одновременно отображается не более одного объявления, но одно и то жеView
можно использовать повторно для отображения разных объявлений с течением времени.
- Вызовите метод
loadAds
вSearchAdController
с помощьюSearchAdRequest
, чтобы инициировать асинхронный запрос объявления. Вызовитеbuild()
дляSearchAdRequest.Builder
, чтобы создать объектSearchAdRequest
.
- Реализуйте этот интерфейс и передайте его конструктору
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 .