---
title: Android
description: Custom Tabs का उपयोग करके अपने Android ऐप में Human Token Journey को एकीकृत करें — हल्का, सुरक्षित और बिना WebView के।
canonical: https://developer.unico.io/hi/human-token/integrations/app/android/link-integration
locale: hi
generated_by: markdown-export
---

# Android

Custom Tabs का उपयोग करके अपने Android ऐप में Human Token Journey को एकीकृत करें।

Custom Tabs आपके ऐप के अंदर एक ब्राउज़र टैब में Human Token Journey लॉन्च करता है। जब यात्रा पूरी होती है, तो ब्राउज़र आपके कस्टम URL स्कीम पर रीडायरेक्ट करता है और आपका ऐप इसे इंटरसेप्ट करता है।

### पूर्वापेक्षाएँ

- Android 8 (API 26) या बाद का
- `androidx.browser:browser:1.5.0`
- आपके ऐप के लिए एक अद्वितीय URL स्कीम (जैसे `myapp`)

### चरण 1: डिपेंडेंसी जोड़ें

अपनी `build.gradle` में:

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

### चरण 2: अपना URL स्कीम परिभाषित करें

एक अद्वितीय स्कीम चुनें (जैसे `myapp`)। प्रोसेस बनाते समय इसे `callbackUri` के रूप में उपयोग किया जाता है:

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

### चरण 3: एक्टिविटी बनाएँ

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

### चरण 4: 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` सुनिश्चित करता है कि Android नई एक्टिविटी बनाने के बजाय मौजूदा एक्टिविटी पर `onNewIntent()` कॉल करे।

### चरण 5: यात्रा शुरू करें

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

### फ़ाइल सारांश

| फ़ाइल | उद्देश्य |
|---|---|
| `build.gradle` | `androidx.browser` डिपेंडेंसी |
| `HumanTokenActivity.kt` | Custom Tabs लॉन्च + रीडायरेक्ट हैंडलिंग |
| `AndroidManifest.xml` | आपके URL स्कीम के लिए Intent फ़िल्टर |

---

### Custom Tabs के बजाय WebView का उपयोग

> **चेतावनी:** Custom Tabs अनुशंसित दृष्टिकोण है। यह अधिक सुरक्षित है, रीडायरेक्ट को मूल रूप से संभालता है, और कम कॉन्फ़िगरेशन की आवश्यकता होती है। WebView का उपयोग केवल तभी करें जब Custom Tabs आपके प्रोजेक्ट में विकल्प न हो।

यदि आपको `WebView` का उपयोग करना ही है, तो journey के लिए JavaScript, DOM स्टोरेज, ऑटोप्ले मीडिया, और कैमरा/जियोलोकेशन अनुमतियों को स्पष्ट रूप से प्रदान करना आवश्यक है। इन सेटिंग्स के बिना कैप्चर फ्रेम लोड नहीं होगा या कैमरा सक्रिय नहीं होगा।

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

आपको अपने `AndroidManifest.xml` में `CAMERA`, `INTERNET` और `ACCESS_FINE_LOCATION` अनुमतियाँ भी घोषित करनी होंगी और यात्रा URL लोड करने से पहले रनटाइम पर कैमरा और स्थान अनुमतियाँ अनुरोध करनी होंगी।

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