---
title: Android
description: Intégrez le parcours Human Token dans votre application Android avec Custom Tabs — léger, sécurisé et sans WebView.
canonical: https://developer.unico.io/fr/human-token/integrations/app/android/link-integration
locale: fr
generated_by: markdown-export
---

# Android

Intégrez le parcours Human Token dans votre application Android avec Custom Tabs.

Custom Tabs lance le parcours Human Token dans un onglet de navigateur au sein de votre application. Lorsque le parcours est terminé, le navigateur redirige vers votre schéma d'URL personnalisé et votre application l'intercepte.

### Prérequis

- Android 8 (API 26) ou ultérieur
- `androidx.browser:browser:1.5.0`
- Un schéma d'URL unique pour votre application (par ex. `myapp`)

### Étape 1 : Ajouter la dépendance

Dans votre `build.gradle` :

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

### Étape 2 : Définir votre schéma d'URL

Choisissez un schéma unique (par ex. `myapp`). Il est utilisé comme `callbackUri` lors de la création du processus :

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

### Étape 3 : Créer l'activité

```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"
    }
}
```

### Étape 4 : Configurer AndroidManifest.xml

```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` garantit qu'Android appelle `onNewIntent()` sur l'activité existante au lieu d'en créer une nouvelle.

### Étape 5 : Lancer le parcours

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

### Résumé des fichiers

| Fichier | Objectif |
|---|---|
| `build.gradle` | Dépendance `androidx.browser` |
| `HumanTokenActivity.kt` | Lancement Custom Tabs + gestion de la redirection |
| `AndroidManifest.xml` | Filtre d'intent pour votre schéma d'URL |

---

### Utiliser une WebView au lieu de Custom Tabs

> **Avertissement:** Custom Tabs est l'approche recommandée. C'est plus sécurisé, gère les redirections nativement et nécessite moins de configuration. N'utilisez une WebView que si Custom Tabs n'est pas une option dans votre projet.

Si vous devez utiliser une `WebView`, la journey nécessite que JavaScript, le stockage DOM, la lecture automatique des médias et les permissions de caméra/géolocalisation soient accordés explicitement. Sans ces paramètres, le cadre de capture ne se chargera pas ou la caméra ne s'activera pas.

```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)
    }
}
```

Vous devez également déclarer les permissions `CAMERA`, `INTERNET` et `ACCESS_FINE_LOCATION` dans votre `AndroidManifest.xml` et demander les permissions de caméra et de localisation au moment de l'exécution avant de charger l'URL du parcours.

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