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

Откройте захват в Custom Tab и верните человека в ваше приложение.

Markdown

Ваш бэкенд создает процесс в Human Plugin с потоком Journey и callbackUri, использующим URL-схему вашего приложения. Приложение открывает link из ответа в Custom Tab. Когда захват завершается, браузер открывает вашу схему, и управление переходит к приложению.

Сохраните id Human Plugin из ответа на создание. По нему ваш бэкенд читает результат.

Требования​

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

1. Добавьте зависимость​

В build.gradle:

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

2. Создайте процесс с вашей схемой​

Ваш бэкенд передает схему в callbackUri:

{
"flow": "humantoken",
"clientId": "client-a",
"correlationId": "order-1001",
"credential": { "type": "DUI_TYPE_NG_BVN", "value": "<document number>" },
"callbackUri": "myapp://callback"
}

и возвращает id и link приложению.

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 CaptureActivity : AppCompatActivity() {

private var processId: String? = null

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

processId = intent.getStringExtra(EXTRA_PROCESS_ID)
val link = intent.getStringExtra(EXTRA_LINK) ?: return finish()

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

override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
if (intent.data?.scheme == "myapp") {
// The capture ended. Ask your back-end to read the outcome
// with GET /v1/processes/{id}, using the Human Plugin id.
onCaptureEnded(processId)
}
}

private fun onCaptureEnded(processId: String?) {
finish()
}

companion object {
const val EXTRA_PROCESS_ID = "process_id"
const val EXTRA_LINK = "link"
}
}

4. Зарегистрируйте схему в AndroidManifest.xml​

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

<activity
android:name=".CaptureActivity"
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, CaptureActivity::class.java)
.putExtra(CaptureActivity.EXTRA_PROCESS_ID, id)
.putExtra(CaptureActivity.EXTRA_LINK, link)
startActivity(intent)

Итог​

ФайлНазначение
build.gradleЗависимость androidx.browser
CaptureActivity.ktОткрывает Custom Tab и обрабатывает возврат
AndroidManifest.xmlIntent filter для вашей схемы

Использование WebView​

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

Отдавайте предпочтение Custom Tabs. Используйте WebView, только если Custom Tabs недоступны.

Для захвата нужны JavaScript, DOM storage, автовоспроизведение медиа и разрешения на камеру и геолокацию:

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 и запросите доступ к камере и геолокации во время выполнения перед загрузкой link:

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

В WebView открывайте link напрямую. Не загружайте в него Journeys SDK.