Перейти к основному содержимому
Android

Интегрируйте Human Token Journey в ваше Android-приложение с помощью Custom Tabs.

Markdown

Custom Tabs запускают Human Token Journey во вкладке браузера внутри вашего приложения. Когда путь завершён, браузер перенаправляет на вашу пользовательскую URL-схему, и ваше приложение перехватывает её.

Предварительные требования​

  • Android 8 (API 26) или новее
  • androidx.browser:browser:1.5.0
  • Уникальная URL-схема для вашего приложения (например, myapp)

Шаг 1: Добавить зависимость​

В вашем build.gradle:

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

Шаг 2: Определить URL-схему​

Выберите уникальную схему (например, myapp). Она используется как callbackUri при создании процесса:

callbackUri: myapp://callback

Шаг 3: Создать activity​

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​

<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() на существующей activity, а не создаст новую.

Шаг 5: Запустить путь​

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

Обзор файлов​

ФайлНазначение
build.gradleЗависимость androidx.browser
HumanTokenActivity.ktЗапуск Custom Tabs + обработка перенаправления
AndroidManifest.xmlIntent-фильтр для вашей URL-схемы

Использование WebView вместо Custom Tabs​

предупреждение

Custom Tabs — рекомендуемый подход. Он более безопасен, обрабатывает перенаправления нативно и требует меньше настроек. Используйте WebView только если Custom Tabs недоступен в вашем проекте.

Если вам необходимо использовать WebView, для journey требуется явно предоставить разрешения на JavaScript, DOM-хранилище, автоматическое воспроизведение медиа и доступ к камере/геолокации. Без этих настроек фрейм захвата не загрузится или камера не активируется.

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

Вы также должны объявить разрешения CAMERA, INTERNET и ACCESS_FINE_LOCATION в вашем AndroidManifest.xml и запросить разрешения камеры и местоположения во время выполнения перед загрузкой URL путешествия.

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