| Ключевые понятия | Настройте среду разработки | Создайте RE SDK | Используйте RE SDK | Тестирование и сборка для распространения |
| Ключевые понятия | Настройте среду разработки | Создайте RE SDK | Используйте RE SDK | Тестирование и сборка для распространения |
Используйте SDK с поддержкой среды выполнения.
В этом разделе описывается, как клиенты могут взаимодействовать с заявленными API SDK, поддерживающими выполнение (RE).
В данном руководстве мы будем называть ваш существующий модуль SDK (или SDK, поддерживающий среду выполнения) клиентом.
Если вы хотите интегрировать SDK с поддержкой среды выполнения непосредственно в ваше приложение, то клиентом будет модуль приложения .
Загрузите SDK с поддержкой среды выполнения.
Первое, что вам нужно сделать в вашем SDK, поддерживающем среду выполнения, или в клиентском приложении, — это загрузить SDK, поддерживающий среду выполнения.
Класс SdkSandboxManager помогает загружать SDK с поддержкой среды выполнения, возвращая класс IBinder , который SDK с поддержкой среды выполнения может привязать к интерфейсу, объявленному в SDK с поддержкой среды выполнения.
Необходимо убедиться, что каждый SDK с поддержкой среды выполнения загружается только один раз, иначе менеджер SDK вернет исключение.
Инструменты генерации промежуточных файлов создают вспомогательные классы для преобразования интерфейса IBinder , возвращаемого SdkSandboxManager , обратно в объявленный интерфейс API SDK.
Эти инструменты используют интерфейс, аннотированный @PrivacySandboxService , для генерации класса *Factory .
Этот класс содержит статическую функцию wrapTo* , которая преобразует объект IBinder в экземпляр интерфейса вашего SDK, поддерживающего среду выполнения.
Ваш SDK, поддерживающий среду выполнения, может взаимодействовать с SDK, поддерживающим среду выполнения, используя этот интерфейс, и вызывать API SDK, которые вы объявили на предыдущем шаге.
// Name of the SDK to be loaded, defined in your ASB module
private const val SDK_NAME = "com.example.sdk"
try {
// SdkSandboxManagerCompat is used to communicate with the sandbox and load SDKs with backward compatibility.
val sandboxManagerCompat = SdkSandboxManagerCompat.from(context)
val sandboxedSdk = sandboxManagerCompat.loadSdk(SDK_NAME, Bundle.EMPTY)
val mySdk = MySdkFactory.wrapToMySdk(sandboxedSdk.getInterface()!!)
} catch (e: LoadSdkCompatException) {
Log.e(TAG, "Failed to load SDK, error code: ${e.loadSdkErrorCode}", e)
return null
}
использование библиотеки пользовательского интерфейса
Если вы хотите использовать библиотеку пользовательского интерфейса для отображения рекламы, убедитесь, что вы добавили androidx.privacysandbox.ui:ui-core и androidx.privacysandbox.ui:ui-client в зависимости в файле build.gradle вашего SDK, поддерживающего среду выполнения.
Загрузите баннерную рекламу с помощью SandboxedSdkView.
androidx.privacysandbox.ui:ui-client добавлен новый ViewGroup под названием SandboxedSdkView для размещения пользовательского интерфейса, созданного SDK с поддержкой среды выполнения.
setAdapter() открывает сессию с SDK, поддерживающим работу во время выполнения, для получения уведомлений о показе рекламы и изменениях в пользовательском интерфейсе. Когда SDK открывает сессию, реклама отображается.
Это можно интегрировать следующим образом:
class BannerAd(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
suspend fun loadAd() {
// mySdk is the previously loaded SDK in the SDK Runtime.
val bannerAd = mySdk.loadAd()
val sandboxedSdkView = SandboxedSdkView(context)
addViewToLayout(sandboxedSdkView)
// This renders the ad.
sandboxedSdkView.setAdapter(bannerAd)
return
}
private fun addViewToLayout(view: View) {
view.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
super.addView(view)
}
}
Ваш SDK, поддерживающий работу во время выполнения, также может получать уведомления об изменении состояния сессии для отображения пользовательского интерфейса. Для этого:
Создайте класс
SessionStateChangeListener()для обработки различных сценариев:private class SessionStateChangeListener() : SandboxedSdkUiSessionStateChangedListener { override fun onStateChanged(state: SandboxedSdkUiSessionState) { if (state is SandboxedSdkUiSessionState.Error) { // Some error has occurred while opening the session. Handle // accordingly. Log.e(TAG, state.throwable.message!!); } else if (state is SandboxedSdkUiSessionState.Loading) { // The session is attempting to be opened. } else if (state is SandboxedSdkUiSessionState.Active) { // The session is open and the UI presentation was successful. } else if (state is SandboxedSdkUiSessionState.Idle) { // There is no open session. } } }Добавьте обработчик изменения состояния к созданному ранее экземпляру
SandboxedSdkView. Обработчик вызывается немедленно с текущим состоянием, как только он будет прикреплен к представлению.
Обратите внимание на следующее:
- Если SDK, поддерживающий работу во время выполнения, вызывает методы
SandboxedSdkView, когда сессия еще не завершилась, все эффекты будут применены после завершения открытия сессии.- Такие методы, как SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop)
- Вызов методов, добавляющих или удаляющих представление из
SandboxedSdkView(таких какaddView(),removeView(),removeViewAt()и т. д.), не поддерживается и приводит к возникновению исключенияUnsupportedOperationException.- Используйте
setAdapter()только для показа рекламы.
- Используйте
-
SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop)переключает порядок по оси Z, что влияет на то, будут лиMotionEventsот взаимодействия с пользователем отправляться в SDK с поддержкой среды выполнения или в SDK, учитывающий среду выполнения.- Если установлено значение
false,MotionEventsотправляются в SDK, поддерживающий среду выполнения; в противном случае они будут отправлены в SDK с поддержкой среды выполнения. Подробнее о порядке отображения по оси Z с использованием API представления пользовательского интерфейса .
- Если установлено значение
Начало мероприятий
Для запуска действий, принадлежащих SDK с поддержкой среды выполнения, используйте расширение createSdkActivityLauncher для создания средства запуска в SDK, поддерживающем среду выполнения.
Затем этот лаунчер можно передать вашему SDK с поддержкой среды выполнения, что позволит ему запускать необходимые действия.
Для управления запуском или незапуском действия можно использовать предикат. Для разрешения запуска действий предикат должен возвращать значение true .
val launchSdkActivityPredicate = {
// Boolean which has to be true to launch the activities
}
val launcher = baseActivity.createSdkActivityLauncher(launchSdkActivityPredicate)
fullscreenService.showActivity(launcher)
В вашем SDK с поддержкой среды выполнения зарегистрируйте SdkSandboxActivityHandlerCompat и передайте его методу SdkActivityLauncher.LaunchSdkActivity(IBinder) .
fun showActivity(activityLauncher: SdkActivityLauncher) {
val handler = object : SdkSandboxActivityHandlerCompat {
override fun onActivityCreated(activityHolder: ActivityHolder) {
activityHolder.getActivity().setContentView(contentView)
}
}
val token = controller.registerSdkSandboxActivityHandler(handler)
activityLauncher.launchSdkActivity(token)
}
Объект ActivityHolder передаваемый в метод SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder) реализует LifecycleOwner , предоставляя вашему SDK, поддерживающему среду выполнения, доступ к жизненному циклу активности.
Он также предоставляет API getOnBackPressedDispatcher , который можно использовать для регистрации экземпляров getOnBackPressedCallback для обработки поведения кнопки "Назад" внутри активности.
Шаг 3 : Создание SDK с поддержкой среды выполнения. Шаг 5 : Тестирование и сборка для распространения.