UniConsent CMP SDK für Android in mobile Apps integrieren

UniConsent CMP ist ein Paket zur Verwaltung der GDPR IAB TCF 2.3 Einwilligung in Android-Apps. Eine Demo-App mit integrierter UniConsent CMP finden Sie im Verzeichnis "demo".

Voraussetzungen

  • UniConsent CMP-Tarif mit Unterstützung für mobile Apps
  • Android API Level 21 oder höher
  • UniConsent CMP SDK-Paket (beim Support anfragen)

Erste Schritte

Fügen Sie UniConsentSDK-release.aar in das Verzeichnis libs/ Ihres Projekts ein und aktualisieren Sie Ihre build.gradle:

implementation files('libs/UniConsentSDK-release.aar')
implementation 'androidx.appcompat:appcompat:1.7.1'
implementation 'com.google.android.material:material:1.13.0'
implementation 'com.iabtcf:iabtcf-core:2.0.10'
implementation 'com.iabtcf:iabtcf-decoder:2.0.10'

Einwilligungs-UI anpassen

Bevor Sie das SDK integrieren, passen Sie das Erscheinungsbild des Einwilligungsbanners im UniConsent Dashboard an, um es an Ihre Marke anzupassen und die Einwilligungsrate zu optimieren.

Schritt 1: Markenstyling im Dashboard

Gehen Sie zu Projects → Projekt auswählen → Settings → Step 5: UI & Style Settings, um folgende Einstellungen vorzunehmen:

  • Main Button Colour — Stellen Sie die Farbe der primären Aktionstaste passend zu Ihrer Marke ein
  • Main Button Text Colour — Passen Sie die Textfarbe auf der primären Taste für bessere Lesbarkeit an
  • Background Colour — Stellen Sie die Hintergrundfarbe des Banners ein, damit es sich in Ihre App einfügt
  • Text Colour — Stellen Sie sicher, dass der Fließtext ausreichend Kontrast hat

Schritt 2: Erweitertes Styling mit benutzerdefiniertem CSS (Optional)

Für eine präzisere Steuerung fügen Sie benutzerdefiniertes CSS im Feld CSS Content unter Schritt 5 hinzu. Dies wird empfohlen, damit sich das Banner nativ in Ihre App einfügt und die beste Einwilligungsrate erzielt wird:

/* Example: Style the accept button to match your brand */
.unic-btn-accept {
  background-color: #4CAF50;
  border-radius: 8px;
  font-weight: 600;
}

/* Example: Adjust banner font */
.unic-banner {
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}

/* Example: Make the reject button less prominent */
.unic-btn-reject {
  background-color: transparent;
  border: 1px solid #ccc;
  color: #666;
}

Tipp: Eine gut gebrandete Einwilligungs-UI, die sich nativ in Ihre App einfügt, erzielt typischerweise höhere Einwilligungsraten. Nutzer interagieren eher positiv mit einem Banner, das dem erwarteten Erscheinungsbild entspricht.

Verwendung

Um UniConsent CMP in Ihrer App zu nutzen, folgen Sie diesen Schritten:

Initialisieren Sie die CMP mit einer App-ID von Ihrem Account Manager:

UniConsent UniConsentCMP = UniConsent.getInstance();
UniConsentCMP.setAppId("YOUR_APP_ID");

CMP-UI anzeigen:

// Display CMP as full-screen page (default)
UniConsent.getInstance().launchCMP();

// Display CMP as a modal bottom sheet
UniConsent.getInstance().launchCMP(CMPDisplayMode.BOTTOM_SHEET);

// Display CMP as a center dialog
UniConsent.getInstance().launchCMP(CMPDisplayMode.DIALOG);

Sie können auch mit einer bestimmten Stufe und einem Anzeigemodus starten:

// Launch at a specific stage with a display mode
UniConsent.getInstance().launchCMP(Stage.GDPRFirstScreen, CMPDisplayMode.BOTTOM_SHEET);

// Or set a default display mode for all launches
UniConsent.getInstance().setDisplayMode(CMPDisplayMode.BOTTOM_SHEET);
UniConsent.getInstance().launchCMP();

Automatisch prüfen, ob die Einwilligung abgelaufen ist, wenn die vendorList aktualisiert wird:

// Check if consent should be requested (e.g. first visit, or vendor list updated)
if (UniConsentCMP.shouldRequestConsent()) {
    UniConsentCMP.launchCMP();
}

Den tcString abrufen, falls erforderlich:

// Get tcString
UniConsent.getInstance().getTCString();

Den Einwilligungsstatus auslesen:

// Read consent status
UniConsent.getInstance().hasIABPurposeConsent(1);
UniConsent.getInstance().hasIABVendorConsent(1);

Einwilligungsstatus zurücksetzen, falls erforderlich:

// Reset consent status
UniConsent.getInstance().clearData();

Einwilligung an WebView synchronisieren

Wenn Ihre App eine WebView öffnet, die eine Webseite mit dem UniConsent CMP-Tag lädt, können Sie den nativen Einwilligungsstatus übergeben, damit das CMP-Tag die bestehende Einwilligung erkennt und das Banner nicht erneut anzeigt.

Injizieren Sie die Einwilligung beim Seitenstart, bevor das CMP-Tag ausgeführt wird:

WebView webView = findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, android.graphics.Bitmap favicon) {
        UniConsent.getInstance().syncConsent(view);
    }
});

webView.loadUrl("https://example.com");

Beispiel mit AppCompatActivity

import com.uniconsent.sdk.CMPDisplayMode;
import com.uniconsent.sdk.Event;
import com.uniconsent.sdk.EventHandler;
import com.uniconsent.sdk.Stage;
import com.uniconsent.sdk.UniConsent;

public class MainActivity extends AppCompatActivity implements EventHandler {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        UniConsent UniConsentCMP = UniConsent.getInstance();
        UniConsentCMP.setAppId("YOUR_APP_ID");
        UniConsentCMP.init(this);
        // register callback events
        UniConsentCMP.subscribe(this);
        // check if consent should be requested
        if (UniConsentCMP.shouldRequestConsent()) {
            UniConsentCMP.launchCMP();
        }
    }

    public void openUniConsentUI(View view) {
        // Full screen
        UniConsent.getInstance().launchCMP(Stage.GDPRFirstScreen);
    }

    public void openAsBottomSheet(View view) {
        // Bottom sheet
        UniConsent.getInstance().launchCMP(Stage.GDPRFirstScreen, CMPDisplayMode.BOTTOM_SHEET);
    }

    public void openAsDialog(View view) {
        // Center dialog
        UniConsent.getInstance().launchCMP(Stage.GDPRFirstScreen, CMPDisplayMode.DIALOG);
    }

    @Override
    public void handle(Event event) {
        UniConsent.getInstance().hasIABVendorConsent(1);
    }
}

Beispiel mit ComponentActivity

package com.example.myapplication

import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.example.myapplication.ui.theme.MyApplicationTheme
import com.uniconsent.sdk.CMPDisplayMode
import com.uniconsent.sdk.Event
import com.uniconsent.sdk.EventHandler
import com.uniconsent.sdk.Stage
import com.uniconsent.sdk.UniConsent

class MainActivity : ComponentActivity(), EventHandler {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val cmp = UniConsent.getInstance()
        cmp.appId = "YOUR_APP_ID"
        cmp.init(this)
        cmp.subscribe(this)

        if (cmp.shouldRequestConsent()) {
             cmp.launchCMP();
        }
        setContent {
            MyApplicationTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Column(
                        modifier = Modifier
                            .fillMaxSize()
                            .padding(16.dp),
                        verticalArrangement = Arrangement.Center,
                        horizontalAlignment = Alignment.CenterHorizontally
                    ) {
                        Button(onClick = {
                            UniConsent.getInstance().launchCMP(Stage.GDPRFirstScreen)
                        }) {
                            Text("Privacy Settings")
                        }
                        Spacer(modifier = Modifier.height(16.dp))
                        Button(onClick = {
                            UniConsent.getInstance().launchCMP(
                                Stage.GDPRFirstScreen, CMPDisplayMode.BOTTOM_SHEET
                            )
                        }) {
                            Text("Privacy Settings (Bottom Sheet)")
                        }
                        Spacer(modifier = Modifier.height(16.dp))
                        Button(onClick = {
                            UniConsent.getInstance().launchCMP(
                                Stage.GDPRFirstScreen, CMPDisplayMode.DIALOG
                            )
                        }) {
                            Text("Privacy Settings (Dialog)")
                        }
                    }
                }
            }
        }
    }

    override fun handle(event: Event?) {
        Log.d("CMP_EVENT", event.toString())
        UniConsent.getInstance().hasIABVendorConsent(1)
    }
}

Berechtigung

<uses-permission android:name="android.permission.INTERNET" />

Standard-Einwilligungsstatus-KV einrichten:

<meta-data android:name="firebase_analytics_collection_enabled" android:value="false" />

<meta-data android:name="google_analytics_default_allow_analytics_storage" android:value="false" />
<meta-data android:name="google_analytics_default_allow_ad_storage" android:value="false" />
<meta-data android:name="google_analytics_default_allow_ad_user_data" android:value="false" />
<meta-data android:name="google_analytics_default_allow_ad_personalization_signals" android:value="false" />

Analysen basierend auf den Einwilligungsflags steuern:


// <= 25.6.1
override fun handle(event: Event?) {
    Log.d("CMP_EVENT", event.toString())
    if(UniConsent.getInstance().hasIABPurposeConsent(1)) {
        // Set consent types.
        Map<FirebaseAnalytics.ConsentType, FirebaseAnalytics.ConsentStatus> consentMap = new EnumMap<>(FirebaseAnalytics.ConsentType.class);
        consentMap.put(FirebaseAnalytics.ConsentType.ANALYTICS_STORAGE, FirebaseAnalytics.ConsentStatus.GRANTED);
        consentMap.put(FirebaseAnalytics.ConsentType.AD_STORAGE, FirebaseAnalytics.ConsentStatus.GRANTED);
        consentMap.put(FirebaseAnalytics.ConsentType.AD_USER_DATA, FirebaseAnalytics.ConsentStatus.GRANTED);
        consentMap.put(FirebaseAnalytics.ConsentType.AD_PERSONALIZATION, FirebaseAnalytics.ConsentStatus.GRANTED);

        mFirebaseAnalytics.setConsent(consentMap);
        mFirebaseAnalytics.setAnalyticsCollectionEnabled(true);
    } else {
        // Set consent types.
        Map<FirebaseAnalytics.ConsentType, FirebaseAnalytics.ConsentStatus> consentMap = new EnumMap<>(FirebaseAnalytics.ConsentType.class);
        consentMap.put(FirebaseAnalytics.ConsentType.ANALYTICS_STORAGE, FirebaseAnalytics.ConsentStatus.DENIED);
        consentMap.put(FirebaseAnalytics.ConsentType.AD_STORAGE, FirebaseAnalytics.ConsentStatus.DENIED);
        consentMap.put(FirebaseAnalytics.ConsentType.AD_USER_DATA, FirebaseAnalytics.ConsentStatus.DENIED);
        consentMap.put(FirebaseAnalytics.ConsentType.AD_PERSONALIZATION, FirebaseAnalytics.ConsentStatus.DENIED);

        mFirebaseAnalytics.setConsent(consentMap);
        mFirebaseAnalytics.setAnalyticsCollectionEnabled(false);
    }

    // other logics such as send analytics events
}

// > 25.6.1
override fun handle(event: Event?) {
    Log.d("CMP_EVENT", event.toString())

    // other logics such as send analytics events

    // Example: send Firebase event or other analytics metrics
    Bundle bundle = new Bundle();
    bundle.putString(FirebaseAnalytics.Param.ITEM_ID, "id");
    bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, "name");
    bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "image");
    mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);
}

Weitere Informationen finden Sie unter Set up consent mode for apps

Anzeigemodi

Das SDK unterstützt drei Anzeigemodi für die Einwilligungs-UI, entsprechend der Flutter SDK API:

ModusEnumBeschreibung
VollbildCMPDisplayMode.FULL_SCREENÖffnet die CMP in einer neuen Vollbild-Activity (Standard)
Bottom SheetCMPDisplayMode.BOTTOM_SHEETGleitet als modales Sheet von unten herein (85% Höhe)
DialogCMPDisplayMode.DIALOGWird als zentrierter Dialog angezeigt (90% Breite, 75% Höhe)

Hinweis: Die Modi Bottom Sheet und Dialog erfordern, dass Ihre Activity von AppCompatActivity oder FragmentActivity erbt.

Hinweise

  1. Nutzer sollten die Möglichkeit haben, über einen Button oder Link "Datenschutzeinstellungen" im Einstellungsbereich Ihrer App die CMP-UI zu öffnen.
  2. Sie können die Funktion shouldRequestConsent() verwenden, um zu prüfen, ob eine neue Einwilligung basierend auf dem Status angefordert werden sollte. Zeigen Sie die CMP-UI bei Bedarf an, wenn ein Nutzer die Anwendung öffnet.
  3. Ab SDK-Version 25.6.1 müssen Sie die Einwilligungsoptionen für FirebaseAnalytics oder bestimmte unterstützte AAP SDKs nicht mehr manuell senden — dies wird automatisch vom SDK übernommen. Weitere Informationen finden Sie unter Was ist Google AAP und Google MMP für mobile Apps?.