---
title: Integração por link Android
description: Integre a jornada Human Token no seu aplicativo Android usando Custom Tabs — leve, seguro e sem necessidade de WebView.
canonical: https://developer.unico.io/pt-BR/human-token/integrations/app/android/link-integration
locale: pt-BR
generated_by: markdown-export
---

# Integração por link Android

Integre a jornada Human Token no seu aplicativo Android usando Custom Tabs.

Custom Tabs iniciam a jornada Human Token em uma aba do navegador dentro do seu aplicativo. Quando a jornada termina, o navegador redireciona para o seu esquema de URL personalizado e o seu aplicativo o intercepta.

> **Dica: Prefira o SDK Lite**
>
> O [SDK Lite Android](/human-token/integrations/app/android/sdk-lite) abre a captura de forma nativa com o `webAppToken` e é o caminho preferencial no Android. Use esta página, que abre o `link` da jornada, quando o SDK Lite não servir para o seu app.

### Pré-requisitos

- Android 8 (API 26) ou posterior
- `androidx.browser:browser:1.5.0`
- Um esquema de URL exclusivo para o seu aplicativo (ex.: `myapp`)

### Passo 1: Adicionar a dependência

No seu `build.gradle`:

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

### Passo 2: Definir o esquema de URL

Escolha um esquema exclusivo (ex.: `myapp`). Ele é usado como `callbackUri` ao criar o processo:

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

### Passo 3: Criar a activity

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

### Passo 4: Configurar 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` garante que o Android chame `onNewIntent()` na activity existente em vez de criar uma nova.

### Passo 5: Iniciar a jornada

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

### Resumo dos arquivos

| Arquivo | Finalidade |
|---|---|
| `build.gradle` | Dependência `androidx.browser` |
| `HumanTokenActivity.kt` | Lançamento do Custom Tabs + tratamento de redirecionamento |
| `AndroidManifest.xml` | Filtro de intent para o seu esquema de URL |

---

### Usando um WebView em vez de Custom Tabs

> **Aviso:** Custom Tabs é a abordagem recomendada. É mais seguro, lida com redirecionamentos nativamente e requer menos configuração. Use um WebView somente se Custom Tabs não for uma opção no seu projeto.

Se você precisar usar um `WebView`, a journey requer que JavaScript, armazenamento DOM, reprodução automática de mídia e permissões de câmera/geolocalização sejam concedidos explicitamente. Sem essas configurações, o quadro de captura não será carregado ou a câmera não será ativada.

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

Você também deve declarar as permissões `CAMERA`, `INTERNET` e `ACCESS_FINE_LOCATION` no seu `AndroidManifest.xml` e solicitar as permissões de câmera e localização em tempo de execução antes de carregar a URL da jornada.

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