रनटाइम की सुविधा के साथ काम करने वाला SDK टूल बनाना और उसका इस्तेमाल करना

1
Key concepts
2
Set up your development environment
3
Build an RE SDK
4
Consume the RE SDK
5
Testing, and building for distribution

रनटाइम की सुविधा वाले SDK टूल का इस्तेमाल करना

इस सेक्शन में बताया गया है कि क्लाइंट, रनटाइम के साथ काम करने वाले (आरई) SDK टूल के एपीआई के साथ कैसे इंटरैक्ट कर सकते हैं.

इस गाइड में, हम आपके मौजूदा SDK मॉड्यूल (या रनटाइम के बारे में जानकारी रखने वाले SDK टूल) को क्लाइंट के तौर पर बताते हैं.

अगर आपको रनटाइम के साथ काम करने वाले SDK टूल को सीधे अपने ऐप्लिकेशन में इस्तेमाल करना है, तो ऐप्लिकेशन मॉड्यूल क्लाइंट होगा.

रनटाइम के साथ काम करने वाले SDK टूल को लोड करें

रनटाइम के बारे में जानकारी रखने वाले SDK टूल या क्लाइंट ऐप्लिकेशन पर सबसे पहले, रनटाइम के साथ काम करने वाला SDK टूल लोड करना होता है.

SdkSandboxManager क्लास, रनटाइम के साथ काम करने वाले SDK टूल को लोड करने में मदद करती है. इससे, एक IBinder क्लास मिलती है, जिसे रनटाइम के हिसाब से काम करने वाला SDK टूल, रनटाइम के साथ काम करने वाले SDK टूल में बताए गए इंटरफ़ेस से बाइंड कर सकता है.

आपको यह पक्का करना होगा कि आपने रनटाइम के साथ काम करने वाले हर एसडीके को सिर्फ़ एक बार लोड किया हो. ऐसा न करने पर, SDK टूल मैनेजर, अपवाद के तौर पर काम करेगा.

शिम जनरेशन टूल, हेल्पर क्लास जनरेट करते हैं. इनकी मदद से, SdkSandboxManager से मिले IBinder इंटरफ़ेस को, एलान किए गए SDK टूल के एपीआई इंटरफ़ेस में बदला जाता है.

ये टूल *Factory क्लास जनरेट करने के लिए, @PrivacySandboxService के साथ बताए गए इंटरफ़ेस का इस्तेमाल करते हैं.

इस क्लास में एक स्टैटिक wrapTo* फ़ंक्शन होता है, जो IBinder ऑब्जेक्ट को रनटाइम की सुविधा वाले SDK टूल के इंटरफ़ेस के इंस्टेंस में बदल देता है.

रनटाइम के बारे में जानकारी रखने वाला आपका SDK टूल, इस इंटरफ़ेस का इस्तेमाल करके रनटाइम के साथ काम करने वाले SDK टूल के साथ कम्यूनिकेट कर सकता है. साथ ही, पिछले चरण में बताए गए 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
}

यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी का इस्तेमाल

अगर आपको विज्ञापन दिखाने के लिए यूज़र इंटरफ़ेस (यूआई) लाइब्रेरी का इस्तेमाल करना है, तो पक्का करें कि आपने रनटाइम के बारे में जानकारी रखने वाले अपने SDK टूल के build.gradle में, डिपेंडेंसी के तौर पर androidx.privacysandbox.ui:ui-core और androidx.privacysandbox.ui:ui-client को जोड़ा हो.

SandboxedSdkView का इस्तेमाल करके बैनर विज्ञापन लोड करें

androidx.privacysandbox.ui:ui-client ने ViewGroup नाम का एक नया ViewGroup पेश किया है, ताकि रनटाइम के साथ काम करने वाले 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 टूल के मालिकाना हक वाली गतिविधियां शुरू करने के लिए, रनटाइम की सुविधा वाले SDK टूल में लॉन्चर बनाने के लिए createSdkActivityLauncher एक्सटेंशन का इस्तेमाल करें.

इसके बाद, इस लॉन्चर को आपके रनटाइम के साथ काम करने वाले 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 टूल को ऐक्टिविटी के लाइफ़साइकल का ऐक्सेस मिलता है.

यह getOnBackPressedDispatcher एपीआई भी उपलब्ध कराता है. इसका इस्तेमाल, गतिविधि में 'वापस जाएं' बटन के व्यवहार को मैनेज करने के लिए, getOnBackPressedCallback इंस्टेंस रजिस्टर करने के लिए किया जा सकता है.


तीसरा चरण: रनटाइम के साथ काम करने वाला SDK टूल बनाएं पांचवां चरण: डिस्ट्रिब्यूशन के लिए जांच करना और उसे तैयार करना