Создайте и используйте SDK с поддержкой среды выполнения.

1
Ключевые понятия
2
Настройте среду разработки
3
Создайте RE SDK
4
Используйте RE SDK
5
Тестирование и сборка для распространения
,
1
Ключевые понятия
2
Настройте среду разработки
3
Создайте RE SDK
4
Используйте RE SDK
5
Тестирование и сборка для распространения

Используйте 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, поддерживающий работу во время выполнения, также может получать уведомления об изменении состояния сессии для отображения пользовательского интерфейса. Для этого:

  1. Создайте класс 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.
            }
        }
    }
    
  2. Добавьте обработчик изменения состояния к созданному ранее экземпляру SandboxedSdkView . Обработчик вызывается немедленно с текущим состоянием, как только он будет прикреплен к представлению.

Обратите внимание на следующее:

  • Если SDK, поддерживающий работу во время выполнения, вызывает методы SandboxedSdkView , когда сессия еще не завершилась, все эффекты будут применены после завершения открытия сессии.
    • Такие методы, как SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop)
  • Вызов методов, добавляющих или удаляющих представление из SandboxedSdkView (таких как addView() , removeView() , removeViewAt() и т. д.), не поддерживается и приводит к возникновению исключения UnsupportedOperationException .
    • Используйте setAdapter() только для показа рекламы.
  • SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop) переключает порядок по оси Z, что влияет на то, будут ли MotionEvents от взаимодействия с пользователем отправляться в SDK с поддержкой среды выполнения или в SDK, учитывающий среду выполнения.

Начало мероприятий

Для запуска действий, принадлежащих 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 : Тестирование и сборка для распространения.