Key concepts | Set up your development environment | Build an RE SDK | Consume the RE SDK | Testing, and building for distribution |
ランタイム対応 SDK を使用する
このセクションでは、宣言されたランタイム対応(RE)SDK API をクライアントが操作する方法について説明します。
このガイドでは、既存の SDK モジュール(またはランタイム対応 SDK)をクライアントと呼びます。
ランタイム対応 SDK をアプリに直接組み込む場合は、アプリ モジュールがクライアントになります。
ランタイム対応 SDK を読み込む
ランタイム対応 SDK またはクライアント アプリで最初に行うことは、ランタイム対応 SDK を読み込むことです。
SdkSandboxManager
クラスはランタイム対応 SDK の読み込みを支援し、ランタイム対応 SDK がランタイム対応 SDK で宣言されたインターフェースにバインドできる IBinder
クラスを返します。
ランタイムで有効になっている各 SDK を 1 回だけ読み込むようにする必要があります。そうしないと、SDK マネージャーが例外を返します。
shim 生成ツールは、SdkSandboxManager
によって返された IBinder
インターフェースを、宣言された SDK API インターフェースに戻すヘルパークラスを生成します。
ツールは、@PrivacySandboxService
アノテーション付きのインターフェースを使用して *Factory
クラスを生成します。
このクラスには、IBinder
オブジェクトをランタイム対応 SDK のインターフェースのインスタンスに変換する静的 wrapTo*
関数があります。
ランタイム対応 SDK は、このインターフェースを使用してランタイム対応 SDK と通信し、前の手順で宣言した SDK API を呼び出すことができます。
// 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
}
UI ライブラリの使用
UI ライブラリを使用して広告を表示する場合は、ランタイム対応 SDK の build.gradle の依存関係に androidx.privacysandbox.ui:ui-core
と androidx.privacysandbox.ui:ui-client
を追加してください。
SandboxedSdkView を使用してバナー広告を読み込む
androidx.privacysandbox.ui:ui-client
では、ランタイム対応 SDK によって作成された UI をホストする SandboxedSdkView
という新しい ViewGroup
が導入されています。
setAdapter()
はランタイム対応 SDK とのセッションを開き、広告ビューと UI の変更の通知を受け取ります。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 では、UI プレゼンテーションのセッション状態が変更されたときに通知を受け取ることもできます。手順は次のとおりです。
さまざまなシナリオを処理する
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 に送信されます。詳しくは、UI Presentation API を使用した Z オーダーの詳細をご覧ください。
アクティビティを開始する
ランタイム対応 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)
}
SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder)
に渡される ActivityHolder
は LifecycleOwner
を実装し、ランタイム対応 SDK がアクティビティのライフサイクルにアクセスできるようにします。
また、アクティビティ内での [戻る] ボタンの動作を処理するための getOnBackPressedCallback
インスタンスを登録するために使用できる getOnBackPressedDispatcher
API も用意されています。
ステップ 3: ランタイム対応 SDK をビルドするステップ 5: 配布のテストとビルド