---
title: Android
description: Integrieren Sie die Human Token Journey in Ihre Android-App mit Custom Tabs — leichtgewichtig, sicher und ohne WebView.
canonical: https://developer.unico.io/de/human-token/integrations/app/android/link-integration
locale: de
generated_by: markdown-export
---

# Android

Integrieren Sie die Human Token Journey in Ihre Android-App mit Custom Tabs.

Custom Tabs starten die Human Token Journey in einem Browser-Tab innerhalb Ihrer App. Wenn die Journey abgeschlossen ist, leitet der Browser zu Ihrem benutzerdefinierten URL-Schema weiter und Ihre App fängt es ab.

### Voraussetzungen

- Android 8 (API 26) oder höher
- `androidx.browser:browser:1.5.0`
- Ein eindeutiges URL-Schema für Ihre App (z. B. `myapp`)

### Schritt 1: Abhängigkeit hinzufügen

In Ihrer `build.gradle`:

```groovy
implementation("androidx.browser:browser:1.5.0")
```

### Schritt 2: URL-Schema definieren

Wählen Sie ein eindeutiges Schema (z. B. `myapp`). Dies wird als `callbackUri` beim Erstellen des Prozesses verwendet:

```
callbackUri: myapp://callback
```

### Schritt 3: Activity erstellen

```kotlin
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.browser.customtabs.CustomTabsIntent

class HumanTokenActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val url = intent.getStringExtra(EXTRA_PROCESS_URL) ?: return finish()

        CustomTabsIntent.Builder()
            .build()
            .launchUrl(this, Uri.parse(url))
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        intent.data?.let { uri ->
            if (uri.scheme == "myapp") {
                // Journey completed — send processId to your backend
                val processId = uri.getQueryParameter("id")
                handleResult(processId)
            }
        }
    }

    private fun handleResult(processId: String?) {
        // Fetch the result from your backend via Get Process
        finish()
    }

    companion object {
        const val EXTRA_PROCESS_URL = "process_url"
    }
}
```

### Schritt 4: AndroidManifest.xml konfigurieren

```xml
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />

<activity
    android:name=".HumanTokenActivity"
    android:launchMode="singleTop"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="myapp" android:host="callback" />
    </intent-filter>
</activity>
```

`singleTop` stellt sicher, dass Android `onNewIntent()` auf der bestehenden Activity aufruft, anstatt eine neue zu erstellen.

### Schritt 5: Journey starten

```kotlin
val intent = Intent(this, HumanTokenActivity::class.java)
    .putExtra(HumanTokenActivity.EXTRA_PROCESS_URL, processLink)
startActivity(intent)
```

### Dateiübersicht

| Datei | Zweck |
|---|---|
| `build.gradle` | `androidx.browser`-Abhängigkeit |
| `HumanTokenActivity.kt` | Custom Tabs Start + Weiterleitungsbehandlung |
| `AndroidManifest.xml` | Intent-Filter für Ihr URL-Schema |

---

### WebView statt Custom Tabs verwenden

> **Warnung:** Custom Tabs ist der empfohlene Ansatz. Er ist sicherer, verarbeitet Weiterleitungen nativ und erfordert weniger Konfiguration. Verwenden Sie eine WebView nur, wenn Custom Tabs in Ihrem Projekt keine Option ist.

Wenn Sie eine `WebView` verwenden müssen, erfordert die Journey, dass JavaScript, DOM-Speicher, automatische Medienwiedergabe sowie Kamera-/Standortberechtigungen explizit gewährt werden. Ohne diese Einstellungen wird der Aufnahmerahmen nicht geladen oder die Kamera wird nicht aktiviert.

```kotlin
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
webView.settings.mediaPlaybackRequiresUserGesture = false
webView.settings.setGeolocationEnabled(true)

webView.webChromeClient = object : WebChromeClient() {
    override fun onPermissionRequest(request: PermissionRequest) {
        if (PermissionRequest.RESOURCE_VIDEO_CAPTURE in request.resources) {
            request.grant(arrayOf(PermissionRequest.RESOURCE_VIDEO_CAPTURE))
        } else {
            request.deny()
        }
    }

    override fun onGeolocationPermissionsShowPrompt(
        origin: String,
        callback: GeolocationPermissions.Callback
    ) {
        callback.invoke(origin, true, false)
    }
}
```

Sie müssen außerdem die Berechtigungen `CAMERA`, `INTERNET` und `ACCESS_FINE_LOCATION` in Ihrer `AndroidManifest.xml` deklarieren und die Kamera- und Standortberechtigungen zur Laufzeit anfordern, bevor Sie die Journey-URL laden.

```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
```