Создайте и используйте 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. Тестирование и сборка для